Site A.T.L.A.N.T.I.C-83
COURS = Initiation aux bases de donnes (Chapitre_6) - VERSION: 1.0 (M.A.J: 26/11/2017)
- AUTEUR(s): Bernard GIACOMONI
Ecran large mobile
Retour
sommaire cours

VI.LE LANGAGE SQL ET LES A.P.I PHP-MySQL:

VI.1.APERU DU LANGAGE SQL:

VI.1.1.INTRODUCTION:

Notre intention n'est pas de prsenter ici un manuel de rfrence de SQL, que l'on peut par ailleurs trouver facilement en ligne sur le web. Les pages qui suivent visent donner au lecteur un aperu du langage SQL prsent en fonction des traitements accomplir (cration de la structure d'une BD, cration ou modification du contenu, recherche de donnes dans une BD, etc.). Les diffrentes requtes sont dcrites uniquement dans leurs formes fondamentales.

VI.1.2.STRUCTURE GNRALE DES REQUTES SQL:

Les REQUTES SQL se prsentent sous la forme de chanes de caractres constitues de la concatnation de mots clefs (que l'on crit en gnral en majuscules) et de valeurs de paramtres se rapportant ces mots clefs. Les mots-clefs reprsentent des CLAUSES permettant de dfinir le type de la requte ou de particulariser son excution. Par exemple, la requte de cration de la base de donnes 'bibliotheque' peut s'crire:
CREATE DATABASE IF NOT EXISTS `bibliotheque` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci
COMMENTAIRES:
Cette requte nous permet d'avoir un aperu de la manire dont une requte SQL est construite:
  • Le mot clef CREATE indique qu'il s'agit d'une requte concernant la cration d'un lment;
  • Le mot clef DATABASE prcise qu'il s'agit de la cration d'une base de donnes (une requte CREATE peut aussi concerner une TABLE);
  • La suite de mots clefs IF NOT EXISTS indique que la cration de la BD est conditionne au fait qu'aucune BD de ce nom n'est connue du SGBD;
  • La valeur de paramtre 'bibliothque' qui suit indique le nom de la BD crer;
  • La suite de mots clefs DEFAULT CHARACTER SET indique que ce qui la suit est le nom du jeu de caractres associ par dfaut la BD (c'est dire aux diffrents champs textuels) qui seront crs par la suite dans cette table);
  • La valeur de paramtre latin1 spcifie le nom du jeu de caractres choisi (latin1 est une constante prdfinie);
  • Le mot clef COLLATE indique que ce qui suit est le mode d'interclassement (ordre alphabtique) par dfaut. Ici, il s'agit de latin1_swedish_ci, qui est associ au jeu de caractres latin1 (jeu ISO-8859-1).
Ce premier exemple nous permet de mettre en exergue la structure gnrale du dbut d'une requte:
  • le premier mot-clef d'une requte indique l'action invoque par la requte:
    • CREATE pour crer un lment,
    • DROP pour supprimer un lment,
    • ALTER pour supprimer la STRUCTURE d'un lment,
    • INSERT pour ajouter des entres,
    • Etc.
  • Le mot clef qui suit immdiatement indique la nature de l'lment sur lequel s'applique l'action: DATABASE pour une base de donnes, TABLE pour une table, etc;
  • La mention IF NOT EXISTS, si elle est prsente, permet de conditionner la cration d'un lment au fait qu'il n'existe aucun lment de ce type portant le mme nom;
  • On trouve ensuite le nom de l'lment sur lequel s'applique l'action (dans l'exemple ci-dessus, la requte CREATE s'applique une BASE DE DONNEES que l'on veut appeler 'bibliothque';
  • Les spcifications qui suivent seront tudies par la suite: elle dpendent du type de l'action invoque.

VI.1.3.REMARQUE: CONVENTIONS UTILISES DANS CE DOCUMENT POUR DCRIRE LA STRUCTURE DES REQUTES:

Pour dcrire la structure gnrale de chaque requte, nous utiliserons les conventions suivantes:
  1. Le texte inclus entre deux chevrons (<... >) dsigne un lment que l'on dcrira plus tard. Exemple: dans une requte CREATE DATABASE, '<identifiant du jeu de caractres par dfaut>' peut tre remplac par 'latin1';
  2. Les crochets ([]) dsignent des lments optionnels. Par exemple, dans une requte CREATE, on peut omettre IF NOT EXIST: on peut donc crire dans la structure logique de CREATE DATABASE: CREATE DATABASE [IF NOT EXISTS] '<nom de la BD>';
  3. Le caractre / permet d'crire des listes d'options entre lesquelles il est possible de choisir lors de l'criture de la requte. Par exemple, dans le schma logique d'une requte CREATE DATABASE, on pourra trouver: DEFAULT CHARACTER SET ascii/binary/latin1/latin2, la liste ascii, binary, latin1, latin2 indiquant les jeux de caractres qui peuvent tre choisis;
  4. Des crochets peuvent englober d'autres crochets. Par exemple, dans une requte CREATE DATABASE, le mot clef COLLATE ne peut tre prsent que si un jeu de caractre par dfaut a t dfini. On crira doncla structure logique de la manire suivante:
    [ DEFAULT CHARACTER SET <jeu de caractre> [ COLLATE <type d'interclassement> ] ],
    Ce qui signifie que l'option COLLATE est une sous-option de DEFAULT CHARACTER SET.
Ceci donne, pour la description logique de CREATE DATABASE:
CREATE DATABASE [IF NOT EXISTS] '<nom de la bd>'
[DEFAULT CHARACTER SET <jeu de caractre> [ COLLATE <type d'interclassement> ]]

VI.1.4.CREATION DE LA STRUCTURE D'UNE BASE DE DONNEES:

CREATION DE LA BASE DE DONNEES ELLE-MME:

Nous avons dj abord cette requte dans les pages prcdentes. La structure logique d'une requte CREATE DATABASE, rduite aux options fondamentales, peut s'crire ainsi:
CREATE DATABASE [IF NOT EXISTS] `bibliotheque` [DEFAULT CHARACTER SET <nom du jeu de caractres>
[COLLATE <Nom de l'interclassement utilis>] ]
EXEMPLE:
La requte CREATE DATABASE `bibliotheque` DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci cre un base de donnes nomme "bibliotheque', qui emploie par dfaut le jeu de caractres "ascii" et qui utilise la mthode d'interclassement 'ascii_general_ci'.
REMARQUE: Cette requte cre une base de donne vide (sans aucune table.

NOTION DE BASE DE DONNES ACTIVE - REQUTE USE:

Dans un SGBD, plusieurs bases de donnes peuvent tre dfinies. Or, dans le but d'allger la syntaxe d'criture des requtes, la plupart decelles-ci ne spcifient pas le nom de la base de donnes laquelle elles s'appliquent (c'est le cas, en particulier de la requte de cration d'une TABLE, que nous allons aborder tout de suite aprs ce paragraphe). Le problme est rsolu par la notion de "base de donne active": un instant donn, une seule base de donne est dclare ACTIVE. Cette dclaration est effectue par la requte USE, dont le schma logique est:
USE '<nom d'une des bases de donnes dfinies dans le SGBD>'
EXEMPLE:
la requte USE 'bibliothque' doit prcder toute requte de cration de tables dans la base de donnes bibliothque.

CREATION DE TABLES:

La forme gnrale de la requte de cration d'une table est:
CREATE TABLE '<nom de table>'
(
<dclaration du champ n 1>,
............................
<dclaration du champ n n>,
[PRIMARY KEY ('<nom de champ>')],
[KEY `<Nom de l'index>` (`<Nom du champ dclar comme index>`)],
............................
[KEY `<Nom de l'index>` (`<Nom du champ dclar comme index>`)],
)
[ENGINE= MyISAM/InnoDB/MEMORY/MERGE/CSV/...]
[DEFAULT CHARSET= <jeu de caractres 1>/../<jeu de caractres n> ]
[COMMENT='<commentaire sur la table>']
[AUTO_INCREMENT=<valeur entire auto incrment>];
DCLARATION DES CHAMPS: Chacune des dclarations de champs obit la syntaxe suivante:
'<nom du champ>' <format de donne> [UNSIGNED] [NOT NULL] [AUTO_INCREMENT] [COMMENT '<commentaire libre>']
Par exemple, la dclaration: Id_abonne int(2) UNSIGNED NOT NULL AUTO_INCREMENT permettra de dfinir l'attribut Id_abonne comme tant un entier sur 2 octets (format int(2), non sign, non nul, s'auto incrmentant automatiquement pour chaque nouvelle entre et utilis comme clef primaire.
DCLARATION DE LA CLEF PRIMAIRE: Pour dclarer un champ en tant que CLEF PRIMAIRE, on utilisera la dclaration:
PRIMARY KEY '<nom du champ>'
Par exemple, la dclaration: PRIMARY KEY 'id_li', incluse dans la dclaration de la table 'livres' indique que le champ id_li de cette table est une CLEF PRIMAIRE de la table.
DCLARATION D'UN INDEX: Pour dclarer un champ en tant qu'index, on utilisera la dclaration:
KEY '<nom de l'index> ('<nom du champ>')
Par exemple, la dclaration : KEY 'IndexLivre' (`fk_id_li`), incluse dans la dclaration de la table 'exemplaire' indique que le champ fk_id_li de cette table est un INDEX identifi par le nom 'IndexLivre'.
PARAMTRES PAR DFAUT DE LA TABLE: La dernire ligne permet de spcifier divers paramtres par dfaut attachs la table. Ceux-ci, s'ils sont spcifis, prennent le pas sur les paramtres par dfaut de la BD:
Spcification du moteur de stockage utiliser pour la table:
[ENGINE= MyISAM/InnoDB/MEMORY/MERGE/CSV/...]
Spcification du jeu de caractres par dfaut:
[DEFAULT CHARSET= <jeu de caractres 1>/../<jeu de caractres n> ]
Commentaire associ la table:
[COMMENT='<commentaire sur la table>']
Valeur de l'auto-incrment:
[AUTO_INCREMENT=<valeur entire auto incrment>]
EXEMPLE DE DCLARATION DE TABLE:
Cration de la table abonnes de la base bibliotheque, avec 6 champs appels id_ab, nom_ab, prenoms_ab, adresse_postale_ab, email_ab et telephone_ab, une clef primaire (champ 'id_ab') et un indexplac sur le champ 'nom_ab':
USE 'bibliotheque'; - uniquement si la BD active n'est pas dfinie --

CREATE TABLE IF NOT EXISTS `abonnes`
(
`id_ab` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Id. des abonns',
`nom_ab` varchar(100) NOT NULL COMMENT 'nom de l'abonn',
`prenoms_ab` varchar(100) NOT NULL COMMENT 'prnoms de l'abonn',
`adresse_postale_ab` varchar(255) NOT NULL COMMENT 'adresse postale de l'abonn',
`e_mail_ab` varchar(30) NOT NULL COMMENT 'adresse e_mail de l'abonn',
`telephone_ab` int(30) NOT NULL COMMENT 'numro de tlphone de l'abonn',
PRIMARY KEY (`id_ab`)
KEY `NomAbonnes` (`nom_ab`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Table des abonne' AUTO_INCREMENT=1 ;

SUPPRESSION DE BASES DE DONNES ET DE TABLES:

Ces suppressions peuvent tre effectues grce aux requtes DROP:
DROP TABLE '<nom de table>';<br /> DROP DATABASE '<nom de bd>';
En ce qui concerne la requte DROP TABLE, il faut (bien sr) que la BD active soit dfinie (requte USE).

REMARQUE: DFINITION D'UNE CLEF TRANGRE:

Les requtes CREATE DATABASE et CREATE TABLE permettent elles-seules de crer la STRUCTURE d'une base de donnes (et non son contenu), une exception prs, la dfinition des CLEFS TRANGRES. En effet, la dfinition de clefs trangres suppose que l'ensemble des tables de la BD soit entirement dfini. Nous verrons par la suite que les CLEFS TRANGRES doivent tre dfinies par des requtes ALTER TABLE que nous allons aborder maintenant.

VI.1.5.MODIFICATION DE LA STRUCTURE D'UNE BASE DE DONNEES:

GNRALITS:

Les requtes ALTER TABLE permettent de modifier la structure d'une base de donnes existante. Les modifications possibles sont:
  • Ajouter un attribut (un champ);
  • Changer les proprits d'un attribut;
  • Supprimer un attribut;
  • Ajouter une CONTRAINTE sur un attribut (c'est dire, dfinir un attribut comme CLEF ETRANGRE).
AJOUTER UN ATTRIBUT:
Le schma de la requte est:
ALTER TABLE '<nom table>' ADD '<nom de l'attribut ajouter>' <proprits de l'attribut>
EXEMPLE: Ajout de l'attribut 'date_f' la table 'factures', la date_f tant le timestamp au format POSIX (date en secondes depuis le 01/01/1970);
ALTER TABLE 'factures' ADD 'date_f' TIMESTAMP UNSIGNED NOT NULL] COMMENT 'Date de facturation';
MODIFIER UN ATTRIBUT:
Le schma de la requte est:
ALTER TABLE '<nom table>' CHANGE '<nom de l'attribut modifier>' <proprits de l'attribut>
EXEMPLE: Dans la table 'livres' l'attribut 'presentation_li' a dans un premier temps t dfini comme une chane de caractres de 255 octets (type varchar(255)). On veut pouvoir saisir des textes beaucoup plus longs. Pour cela, on modifie le nom de l'attribut en 'presentation_li_t et le type de l'attribut en 'TEXT' (jusqu' 64ko):
ALTER TABLE 'livres' CHANGE 'presentation_li''presentation_li_t' 'TEXT';
SUPPRIMER UN ATTRIBUT:
Le schma de la requte est:
ALTER TABLE '<nom table>' DROP '<nom d'attribut>';
EXEMPLE: suppression de l'attribut presentation_li de la table livres:
ALTER TABLE 'livres' DROP 'presentation_li';
DFINIR UNE CLEF TRANGRE:
Le schma de la requte est:
ALTER TABLE '<nom table>' ADD CONSTRAINT '<nom de contrainte>' FOREIGN KEY ('<nom de clef trangre>')
REFERENCES '<nom de la table de rfrence>' ('<nom de l'attribut de rfrence>'`)
EXEMPLE: Ajout dans la table 'exemplaires' de la clef trangre `fk_id_li`, faisant rfrence l'attribut id_li de la table livres. Cette contrainte entre les tables exemplaires et la table livres s'appelle LivreExemplaire;
ALTER TABLE 'exemplaires' ADD CONSTRAINT `LivreExemplaire' FOREIGN KEY (`fk_id_li`) REFERENCES `livres' (`id_il`)

VI.1.6.MODIFICATION DU CONTENU D'UNE BASE DE DONNEES:

GNRALITS:

Les requtes qui permettent la modification du CONTENU d'une base de donnes sont:
  • INSERT INTO, qui permet d'ajouter une entre (une ligne) une table;
  • UPDATE, qui permet de modifier les champs d'une ou plusieurs entres (lignes);
  • DELETE FROM, qui permet de supprimer une ou plusieurs entres (lignes) d'une table.

REQUTE INSERT INTO:

Le schma logique de cette requte est:
INSERT INTO '<nom de BD'>.'<nom de table>' ( '<nom du champ 1>', , '<nom du champ N>' ) VALUES ( '<valeur du champ 1>',...,'<valeur du champ N>' )
EXEMPLE: Insre dans la table 'abonnes' de la base 'mabase' l'entre dont les attributs login et password ont respectivement les valeurs 'superman' et ''xxSuPer%'':
INSERT INTO `mabase`.`abonnes` ( 'login', 'password' ) VALUES ( 'superman','xxSuPer%' );

REQUTE UPDATE:

Le schma logique de cette requte est:
UPDATE '<nom de table>' SET '<nom champ 1>'='<valeur champ 1>',.., '<nom champ n>'='<valeur champ n>' [WHERE <Condition>];
Si la clause WHERE est omise, toutes les entres de la table sont modifies (mises jour) en fonction des indications donnes par la clause SET. Si la clause WHERE est libelle, seules les entres satisfaisant la condition sont modifies.
EXEMPLE: Modification du champ 'e_mail' de chacune des entres de la table 'abonnes' dont le champ 'login' contient la valeur 'spiderman' et dont le mot de passe est 'forever':
UPDATE 'abonnes' SET 'e-mail'='spiderman.araignee.fr' WHERE 'login'='spiderman' AND 'password'='forever';

REQUTE DELETE FROM:

Le schma logique de cette requte est:
DELETE FROM '<nom de table>' WHERE <Condition>
EXEMPLE: Suppression de toutes les entres de la table 'abonnes' dont les champs 'login' contiennent la valeur 'spiderman'.
DELETE FROM 'abonnes' WHERE 'login'='spiderman';

VI.1.7.LA SLECTION ET L'EXTRACTION DES DONNES:

PRINCIPE:

La slection et l'extraction des donnes de la base de donnes s'effectuent grce la requte SELECT. Les fonctionnalits principales de cette requte sont:
- D'une part de permettre la SLECTION d'entres d'une ou plusieurs tables d'un base de donnes en fonction de conditions imposes aux valeurs des attributs de ces entres,
- D'autre part, d'extraire les valeurs des attributs des entres slectionnes pour les mettre disposition des applications utilisatrices.
Par exemple, slectionner toutes les entres d'une table T dont l'attribut A vaut 10 et extraire les valeurs slectionnes.
La requte SELECT est probablement la requte la plus utilise lors de l'utilisation d'une base de donnes par une application, d'autant plus que cette requte permet de lancer d'autres requtes en fonction de la slection effectue: elle agit un peu comme une instruction itrative conditionnelle des langages de programmation classiques.

SCHEMA LOGIQUE DE LA REQUTE SELECT:

Le schma logique simplifi de cette requte est:
SELECT <Liste de noms d'attributs slectionner, spars par des virgules>
FROM <nom de table>
[ WHERE <condition sur la valeur des champs de la table> ]
[ ORDER BY <nom du champ sur lequel est effectu l'ordonnancement> ] [ ASC/DESC ]
[ LIMIT <premire entre prendre en considration>, <nombre d'entres traiter> ];
COMMENTAIRES:
  • La clause WERE <CONDITION> permet de ne slectionner dans la table indique par la clause FROM que les entres rpondant la condition mentionne: c'est la fonction de slection des entres;
  • La liste des noms d'attributs slectionner permet de ne slectionner dans les entres slectionnes que les attributs figurant dans cette liste: c'est la fonction de slection des attributs. Si la liste des attributs est remplace par une "*", tous les attributs de la table sont slectionns;
  • La clause ORDER BY permet de prsenter les entres slectionnes par valeurs croissantes ou dcroissantes de la valeur du champ figurant dans cette clause. Si la valeur de ce champ n'est pas numrique, l'ordonnancement se fera par ordre alphabtique;
  • La clause LIMIT permet de limiter la recherche des entres slectionner: le premier paramtre concerne la premire entre traiter (nombre entier), le deuxime paramtre concerne le nombre d'entres conscutives traiter (nombre entier).
EXEMPLE: Slection des valeurs des attributs 'nom' et 'prnom' des entre de la table 'eleves' dont l'attribut 'classe' est CM2 (on slectionne et on extrait les noms et prnoms des lves de la classe de CM2):
SELECT nom, prenom FROM eleves WHERE classe = 'CM2';

RCUPRATION DES VALEURS DES CHAMPS SLECTIONNS:

Les rsultats retourns par la requte SELECT sont rangs dans un TABLEAU ASSOCIATIF dont les lignes correspondent aux entres satisfaisant la condition WHERE et dont les COLONNES correspondent aux ATTRIBUTS slectionns. Supposons la requte:
SELECT nom, prenom, classe FROM eleves WHERE prenom = 'Claude';
Si dans trois entres de la table eleves, le nom de l'lve est Claude, la requte retournera un tableau semblable celui-ci:
nomprnomclasse
DupondClaudeCM1
DuvalClaudeCM2
LegrandClaudeCP
La rcupration de ces donnes par les applications utilisatrice se fait par l'intermdiaire des A.P.I. ddis: en gnral, les noms des fonctions correspondantes sont en gnral forms partir du "suffixe" fetch_array que l'on peut traduire en franais par "rcuprer le tableau" (On aura ainsi dans l'API PHP de MySQL la fonction mysql_fetch_array).

VI.1.8.LES JOINTURES:

JOINTURE DE DEUX TABLES:

Dans le langage SQL, les oprations de jointure de tables sont ralises en utilisant des requtes SELECT comprenant une clause particulire, la clause JOIN. La structuration des requtes SELECT ne permettant de ne dfinir qu'une seule table cible (par la clause FROM), la clause JOIN l'intrieur d'une requte SELECT va permettre de dfinit une nouvelle table qui va tre jointe la premire:
Le schma logique d'une requte de jointure estle suivant:
SELECT <liste d'attributs des deux tables> FROM <nom table 1>
<LEFT/RIGHT/INNER/OUTER/FULL> JOIN <nom table 2>
ON <nom attribut table 1> = <nom attribut table table2>
[ WHERE <Condition de slection des entres> ]
[ ORDER BY <dfinition de l'ordre de prsentation des entres> ]
COMMENTAIRES:
  • La clause FROM permet de dfinit une premire table joindre;
  • Les lignes affiches en rouge sont celles qui permettent de raliser la jonction avec une deuxime table;
  • La liste de mots clefs <LEFT/RIGHT/INNER/OUTER/FULL> avant la clause JOIN permet de spcifier le type de jointure que l'on veut raliser: jointure gauche, jointure droite, jointure interne, etc.
  • Le nom de table aprs la clause JOIN permet de dterminer la deuxime table de l'opration de jointure;
  • La clause ON permet de spcifier les attributs des deux tables suivant lesquels la jointure est ralise.
  • Remarquons que ces deux attributs peuvent tre nots suivant la notation <nom de table>.<nom d'attribut>.
EXEMPLE:
Cration partir de la table des livres et de la table des exemplaires disponibles, une table listant l'ensemble des exemplaires disponibles avec les livres auxquels ils correspondent:
SELECT reference_ex, livres.titre_li FROM exemplaires LEFT JOIN livres ON livres.id_li = exemplaires.fk_id_li
En fait, cette opration permet de raliser l'association Correspondre du MCD de la bibiliothque tudie prcedemment.
REMARQUES:
  • Les clauses WHERE et ORDER BY ayant t omises, la jointure sera effectue sur toutes les entres des deux tables.
  • D'autre part, du fait de la liste d'attribut de la clause SELECT,la table de jointure ne comprendra que deux colonnes: reference_ex et livres.titre_li. Remarquons que le deuxime attribut, qui appartient la table qui n'est pas dsigne par la clause FROM, doit tre indiqu avec son nom de table;
  • La table de jointure obtenue est TEMPORAIRE (elle ne survit pas l'excution de la requte). Le rsultat de l'opration sera le tableau associatif retourn par la requte SELECT. Celui-ci serade type exemplaires_livres ( reference_ex, titre_li ). Il permettra d'associer chaque exemplaire le livre qui lui correspond;

JOINTURE DE PLUS DE DEUX TABLES:

Il est possible d'effectuer une jointure de plusieurs table. Cette opration consiste joindre TRANSITIVEMENT une table A une table B, puis le rsultat une table C, et ainsi de suite. Le schma logique d'une telle jointure est le suivant:
SELECT <liste d'attributs des tables>
FROM <nom table 1>
<LEFT/RIGHT/INNER/OUTER/FULL> JOIN <nom table 2>
ON <condition d'galit des attributs de jonction>
<LEFT/RIGHT/INNER/OUTER/FULL> JOIN <table 3>
ON <condition d'galit des attributs de jonction>
.....................................................
<LEFT/RIGHT/INNER/OUTER/FULL> JOIN <table n>
ON <condition d'galit des attributs de jonction>
WHERE <condition de slection des entres>
ORDER BY <dfinition de l'ordre de prsentation des entres>

EXEMPLE: Jointure de 3 tables(auteurs, auteurs_livres, livres):
SELECT id_au, livres.id_li FROM auteurs
INNER JOIN auteurs_livres ON auteurs.id_au = auteurs_livres.fk_id_au
INNER JOIN livres ON livres.id_li = auteurs_livres.fk_id_li
Cette triple jointure permet d'obtenir une tableque l'on pourrait noter auteurs_et_livres ( id_au, id_li)qui permet d'associer chaque livre son auteur. Elle ralise donc l'association Ecrire du MCD de la bibiliothque tudie prcedemment.

VI.2.Les A.P.I PHP-MySQL:

VI.2.1.REMARQUE PRLIMINAIRE:

Nous allons tudier les API permettant d'interfacer un SGBD MySQL partir d'un programme PHP. Il s'agit l d'un cas relativement bien rpandu car MySQL fait partie de la suite APACHE qui quipe les serveurs LAMP (linux) et WAMP (microsoft window).
Actuellement (fin 2017), trois API PHP/MySQL sont disponibles:
  • L'API MYSQL, qui est considr comme obsolte partir de la version 5.0 de PHP et ne sera plus disponible partir de la version 7.0;
  • L'API MYSQLi (MySQL improved, c'est dire: MySQL amlior);
  • L'API PDO (PHP Data Object).
L'API MySQL "de base" tant obsolte, il n'est plus conseill de l'utiliser pour de nouvelles applications. Cependant, on le retrouve dans un grand nombre (peut tre une majorit ?) d'applications existantes. De ce fait, il n'est pas encore inutile de se familiariser avec lui, ne serais-ce que dans le cadre d'actions de maintenance et volution d'applications existantes.
L'API MySQLi est une version "OBJET" de l'API MySQL de base: chaque connexion un SGB est encapsule dans un OBJET instanci partir d'une classe mysqli. Les mthodes de cet objet permettent d'mettre vers le SGBD des requtes SQL ou d'accder aux informations de compte-rendu. La particularit de cet API est qu'il met galement disposition des utilisateurs des FONCTIONS pratiquement identiques celles de l'API MySQL: en gnral, une fonction dont le nom dans l'API MySQL est mysql_*** s'crira mysqli_*** dans l'API MySQLi. Un logiciel crit en MySQL est donc trs facilement transformable en MySQLi.
L'API PDO est galement un API "OBJET": l aussi, chaque connexion un SGB est encapsule dans un OBJET instanci partir de la classe PDO. Les mthodes de cet objet permettent galement d'mettre vers le SGBD des requtes SQL ou d'accder aux informations de compte-rendu. Cependant, cet API est incompatible avec un programme crit en MySQL de base.
Dans le cadre de ce cours, l'API PDO ne sera pas tudi. Comme la transformation des appels MySQL "de base" en appels MySQLi "procduraux" est trs facile, nous avons choisi de prsenter les fonctions de l'A.P.I MySQL de base et de donner en mme temps leur version "OBJET" telle qu'elle est prvue par l'API MySQLi.

VI.2.2.PRSENTATION DE L'API MySQL:

L'API MySQL permet un programme crit en PHP de communiquer avec un SGBD MySQL par l'intermdiaire d'un serveur (notamment un serveur APACHE) . Il permet d'expdier vers ce SGBD des REQUTES SQL et de rcuprer les rponses de celui-ci. MySQL permet donc de manipuler des BASES DE DONNES et des TABLES:
  • Crer, configurer, modifier, dtruire des BASES DE DONNES;
  • Crer, supprimer, modifier des TABLES;
  • Accder au contenu des tables pour en extraire des informations ou pour mettre jour les valeurs des attributs;
  • Crer de nouvelles tables partir des tables existantes par divers procds (jonction, projection, etc.).
REMARQUE: Le SGBD MySQL est en gnral accompagn d'un IHM de gestion manuelle des bases de donnes appel PHPMyAdmin.

VI.2.3.FORME GNRAL DES APPELS A L'API MySQL en PHP:

MySQL offre aux applications utilisatrices une bibliothque de fonctions PHP qui permettent d'activer des requtes SQL sur une base de donnes. La syntaxe gnrale de ces fonctions est:
<compte-rendu booleen> = mysql_<Nom fonction> ( <paramtres> );
EN PARTICULIER:
Les fonctions dont le schma est: <Nom de variable PHP> = mysql_query ( '<requte SQL>' );
permettent d'activer l requte SQL passe en paramtre et de rcuprer son rsultat dans la variable PHP.
EXEMPLE:
l'appel de fonction suivant dans un programme PHP:
$R = mysql_query ( 'CREATE DATABASE `bibliotheque` DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci' );
Cre une base de donnes de nom 'bibliothque' avec le jeu de caractre ascii par dfaut et l'interclassement ascii_general_ci. Le rsultat de la requte (compte-rendu de cration) est rcupr dans la variable $R.
Nous pouvons voir qu'il est trs facile de programmer un programme SQL par l'intermdiaire de l'API MySQL de base: une seule fonction suffit, la fonction mysql_query. Cependant, l'API contient galement d'autres fonction qui servent rcuprer les rsultats, grer la connexion rseau avec la base de donnes, dtecter les erreurs, etc. Nous allons aborder ces fonctions dans ce qui suit.
REMARQUE-VERSION MySQLi OBJET:
$R = $Connexion->query ( 'CREATE DATABASE `bibliotheque` DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci' ):
Cre une base de donnes de nom 'bibliothque' avec le jeu de caractre ascii par dfaut et l'interclassement ascii_general_ci. Le rsultat de la requte (compte-rendu de cration) est rcupr dans la variable $R. La variable $Connexion est un OBJET encapsulant une connexion particulire du logiciel au SGBD et la mthode $Connexion->Query() permet d'adresser une requte SQL au SGBD.

VI.2.4.ACCES AU SGBD:

PROCEDURE D'ACCS AU SGBD

Les SGBD MySQL sont hbergs dans des SERVEURS INFORMATIQUES en rseau (gnralement, des serveurs APACHE). De ce fait on y accde avec une procdure de connexion CONNEXION "client-serveur" avec identification du client (l'utilisateur) par saisie d'un identificateur client et d'un mot de passe.

CONNEXION D'UN CLIENT AU SGBD

La fonction de l'API MySQL qui permet un utilisateur de se connecter au SGBD est mysql_connect. Sa syntaxe gnrale est la suivante:
<compte-rendu boolen> = mysql_connect ("<URL du serveur>","<Id. de connexion>","<mot de passe>");
  • La fonction retourne un compte-rendu boolen: sa valeur est TRUE si la connexion a russi, FALSE dans le cas contraire;
  • Si l'application utilisatrice n'est pas dans la mme machine que le serveur.L'URL du serveur est de la forme:
    http://www.<Nom de domaine du serveur>:<Numro de port>
  • Si l'application est dans la mme machine que le serveur, l'URL est de la forme:
    http://localhost:<Numro de port>
EXEMPLE:
$CR = mysql_connect("http://www.monserveur.com:3306","MonIdUtilisateur","MonMotDePasse");
Cette requte permet un utilisateur de se connecter un SGBD situ l'adresse WEB http://www.monserveur:3306, avec l'identifiant "MonIdUtilisateur" et le mot de passe "MonMotDePasse".
REMARQUE-VERSION MYSQLi OBJET:
$Connexion = new mysqli( "http://www.monserveur.com:3306","MonIdUtilisateur","MonMotDePasse", "MaBase" );
Cette requte cre un objet $Connexion partir de la classe mysqli. Cet objet reprsente la connexion un SGBD situ l'adresse WEB http://www.monserveur:3306, avec l'identifiant "MonIdUtilisateur" et le mot de passe "MonMotDePasse". A la diffrence du MySQL de base, un nom de base de donne "par dfaut" peut tre choisi (le paramtre "MaBase" peut aussi tre omis).

DCONNEXION D'UN CLIENT APRS UTILISATION DU SGBD:

La fonction de dconnexion de la connexion en cours est simplement:
mysql_close();
REMARQUE:En MySQLI OBJET on crit: $Connexion->close(), $Connexion tant l'objet reprsentant la connexion.

SLECTION D'UNE DES BASES DE DONNES GRES PAR LE SGBD:

La fonction mysql_select_db permet de slectionner, l'intrieur du SGBD auquel on est connect, la base de donne avec laquelle on veut travailler. En effet, cette fonction permet d'mettre vers le SGBD la requte USE '<Nom de base de donne>'. Sa syntaxe gnrale est la suivante:
<compte-rendu boolen> = mysql_select_db ("<nom de base de donnes slectionner>");

REMARQUE:

La structure gnrale d'une squence de communication d'une application avec une base de donnes peut donc s'crire:
$R1 = mysql_connect("http://www.monserveur.com:3306","MonIdUtilisateur","MonMotDePasse");
if ( $R1 !== false )
{
$R2 = mysql_select_db ("<nom de base de donnes slectionner>");
if ( $R2 !== false )
{
<Squence d'utilisation de la BD: lecture, criture, etc.>
} $R3 = mysql_close ();
}

VERSION MySQLi OBJET:

La mme structure gnrale peut s'crire en MySQLi OBJET:
$Connexion = new mysqli ("http://www.monserveur.com:3306","MonIdUtilisateur","MonMotDePasse" );
if ( $Connexion !== false )
{
$R $Connexion->select_db ("<nom de base de donnes slectionner>");
if ( $R !== false )
{
<Squence d'utilisation de la BD: lecture, criture, etc.>
} $R = $connexion->close ();
}

VI.2.5.RCUPRATION DU RSULTAT D'UNE REQUTE SELECT:

Nous avons vu prcdemment qu'une requte SQL SELECT renvoie un tableau associatif contenant les champs correspondant aux colonnes slectionnes et les entres qui satisfont la condition WHERE du slect si celle-ci existe (toutes les entres si la condition where est omise). Cependant, la structure de donnes retourne n'est pas compatible avec le format des tableaux PHP. Il est donc ncessaire que l'API MySQL comprenne une fonction capable de rcuprer cette donne sous une forme compatible avec ce langage. Cette fonction est:
<Ligne du tableau obtenu par SELECT> = mysql_fetch_array ( <Compte-rendu renvoy par la requte SELECT> );
Cette fonction lit LIGNE PAR LIGNE la structure renvoye par SELECT et place le rsultat de la lecture de CHAQUE LIGNE dans un tableau associatif dont les index correspondent aux noms des colonnes renvoyes et dont les valeurs correspondantes aux index sont les valeurs des champs correspondants de l'entre lue.
EXEMPLE:
Supposons que l'appel de fonction:
$R = mysql_query ('SELECT nom, prenom FROM Eleves WHERE classe = "CM2" ' );
retourne dans $Ligne la structure suivante:
nomprnom
DupondEric
DuvalClaude
LegrandKevin
La variable PHP $R, dans laquelle est plac le rsultat de la requte SELECT n'est pas directement assimilable a un tableau PHP: il sera par exemple impossible de rcuprer le prnom de la deuxime entre en faisant $R(2, 'prnom' ). En revanche, la fonction mysql_fetch-array permettra de rcuprer ligne par ligne les rsultats dans un tableau PHP.
Le code ci-dessous affichera sur 3 lignes les noms et prnoms de chaque entre du tableau rsultat:
$R = mysql_query ( "SELECT nom, prenom FROM Eleves WHERE classe = 'CM2'" );
$i = 1;
while ( ( $Ligne = mysql_fetch_array($R)!= FALSE ) // Chaque appel de mysql_fetch_array rcuprera les champs une des entres du tableau
{
echo 'Entre n '.$i.': nom = '.$Ligne["nom"].' prnom = '.$Ligne["prnom"].'<br />';
$i++;
}
Le rsultat affich sera:
Entre n1: nom = Dupond prnom = Eric
Entre n2: nom = Duval prnom = Claude
Entre n3: nom = Legrand prnom = Kevin
VERSION MySQLi OBJET:
$Connexion = new mysqli ( <Paramtres de connexion> );
$R = $Connexion->query ('SELECT nom, prenom FROM Eleves WHERE classe = "CM2" ' );>
$i = 1;
while ( ( $Ligne = $Connexion->fetch_array($R)!= FALSE ) // Chaque appel de fetch_array rcuprera les champs une des entres du tableau
{
echo 'Entre n '.$i.': nom = '.$Ligne["nom"].' prnom = '.$Ligne["prnom"].'<br />';
$i++;
}

VI.3.EXEMPLES D'APPLICATIONS:

VI.3.1.REMARQUES PRLIMINAIRES:

Les exemples qui suivent, sont crits en langage PHP. Les noms de variables, de bases de donnes, de tables et d'attributs sont crits sans accentuation pour viter les problmes inhrents aux jeux de caractres employs. Dans les quatre derniers exemples, on supposera que la bases de donnes est dja cres. La valeur "localhost:3306" de l'URL correspond celle d'un serveur local. Elle doit tre adapte en fonction de la machine utilise pour le test. Les lecteurs qui voudraient exprimenter ces exemples sur des systmes physiques peuvent le faire en installant sur leur machine un serveur apache (WAMP pour les systmes WINDOW ou LAMP pour les systmes LINUX) et en insrant ces exemples dans une page WEB.

VI.3.2.EXEMPLE N 1 - Cration d'une base de donnes 'ecole':

Nous allons crer une base de donnes nomme "ecole", la munir d'une table eleves ( nom, prenoms, classe ), puis nous allons enregistrer dans cette table les lves suivants:
Idnomprnomclasse
1DurandJacquesCM1
3DupondClaudeCE2
7DuvalClaudeCM2
12LegrandClaudeCP
33LagardeFranoisCM2
Le code PHP correspondant pourrait s'crire:
// Connexion au SGBD ( URL, Nom, Mot de passe )
mysql_connect( "localhost:3306","MonIdClient","MonMotDePasse");

mysql_query ( 'CREATE DATABASE [IF NOT EXISTS] 'ecole' DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci' );

// Slection de la base de donnes 'ecole'
mysql_select_db( 'ecole' );

// Constitution de la requte de cration de la table eleves
$Requete = "CREATE TABLE 'eleve'
(
'Id' int(8) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Identificateur numrique de l'lve'] 'nom' varchar(20) COMMENT 'Nom de l'lve',
'nom' varchar(20) COMMENT 'Prnoms de l'lve',
'nom' varchar(20) COMMENT 'Classe de l'lve',
PRIMARY KEY ('Id')]
)[ENGINE= InnoDB DEFAULT CHARSET= latin1 COMMENT='Table des lves de l'cole AUTO_INCREMENT=1"

// Envoi de la requte de cration de la table au SGBD
mysql_query ( $Requete );

// Clture de la connexion au SGBD
mysql_close();

VI.3.3.EXEMPLE N 2 - Slection de champs et rcupration des valeurs:

Soit, dans la base de donnes 'ecole', la table eleves ( nom, prenoms, classe ). On veut rcuprer les noms et prnoms de tous les lves de CM2 dans le tableau associatif $T[<numero ligne>]['<nom>']['<prenoms>']:
// Connexion au SGBD ( URL, Nom, Mot de passe )
mysql_connect( "localhost:3306","MonIdClient","MonMotDePasse");

// Slection de la base de donnes
mysql_select_db( 'ecole' );

// Slection des valeurs des attributs Nom et Prnoms des Eleves de CM2
$R = mysql_query( "SELECT nom, prenoms FROM 'eleves' WHERE classe ='CM2'" );

// Rcupration du tableau associatif des valeurs
$N = 0;
while ( ( $Ligne = mysql_fetch_array($R) ) != false )
{
$T[$N] = $Lignes;
$N ++;
}

// Clture de la connexion au SGBD
mysql_close();
En fin de traitement, la table PHP T aura pour contenu:
nomprenomclasse
DuvalClaudeCM2
LagardeFranoisCM2

VI.3.4.EXEMPLE N 3 - Ajout d'une entre dans la table eleves:

Soit de nouveau la table eleves ( nom,prenoms, classe ) de la base de donnes ecole. On veut ajouter l'lve Jean-Pierre MARTIN dans la classe de CM1:
// Connexion au SGBD ( URL, Nom, Mot de passe )
mysql_connect( "localhost:3306","MonIdClient","MonMotDePasse");

// Slection de la base de donnes
mysql_select_db( 'ecole' );

// Ajout de l'lve
$R = mysql_query( "INSERT INTO ecole.eleves ( nom, prenoms, classe ) VALUES ( 'MARTIN', 'Jean-Pierre', 'CM1' )" );

// Cloture de la connexion au SGBD
mysql_close();
En fin de traitement, la table eleves aura pour contenu:
nomprnomclasse
DurandJacquesCM1
DupondClaudeCE2
DuvalClaudeCM2
LegrandClaudeCP
LagardeFranoisCM2
MartinJean-pierreCM1

VI.3.5.EXEMPLE N 4 - Modification d'un champ d'une entre:

L'lve Jacques DURAND vient de passer de CM1 en CM2. On veut donc mettre jour la table eleves:
// Connexion au SGBD ( URL, Nom, Mot de passe )
mysql_connect( "localhost:3306","MonIdClient","MonMotDePasse");

// Slection de la base de donnes
mysql_select_db( 'ecole' );

// Changement de la valeur de l'attribut "classe" pour l'lve Jacques DURAND
$R = mysql_query( "UPDATE eleves SET classe='CM2' WHERE nom='DURAND' AND prenoms='Jacques'" );

// Cloture de la connexion au SGBD
mysql_close();
En fin de traitement, la table eleves aura pour contenu:
nomprnomclasse
DurandJacquesCM2
DupondClaudeCE2
DuvalClaudeCM2
LegrandClaudeCP
LagardeFranoisCM2
MartinJean-pierreCM1

VI.3.6.EXEMPLE N 5 - Cration de la base de donnes bibliothque:

Cration de la base de donnes bibliothque telle qu'elle a t dfinie par le MLD du chapitre IV, paragraphe IV.7.4: ci-dessous, le code SQL comment:
--
-- Cration de la base de donnes 'bibliothque'(si elle n'existe pas), avec comme option l'utilisation
-- par dfaut du jeu de caractres latin 1 (ISO-8859-1) et du type d'interclassement alphabtique 
- latin1_swedish_ci (ordre alphabtique utilis en France).
-
CREATE DATABASE IF NOT EXISTS `bibliotheque` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

--
- Spcifie que les requtes qui suivent s'adressent  la base de donnes bibliothque
--
USE `bibliotheque`;

-
- Premire ligne: cration de la table 'abonnes'
- Lignes suivantes: dfinition de ses champs 'id_ab, 'nom_ab', 'prenoms_ab', 'adresse_postale-ab',
- 'e_mail_ab' et 'telephone_ab' (champs. Pour chacun des champs, son type de donne est dfini (int(8),
- varchar(100), etc.
- id_ab est dfini comme une clef primaire (mot clef PRIMARY KEY) autoincrmente (mot clef 
- AUTOINCREMENT)
- La dernire ligne dfinit: le moteur de BD  utiliser (ici: innoBD), le jeu de caractre par dfaut
- (latin 1) et la valeur d'auto-incrmentation  appliquer pour la table (1).
-
CREATE TABLE IF NOT EXISTS `abonnes` (
  `id_ab` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Id. des abonns',
  `nom_ab` varchar(100) NOT NULL COMMENT 'nom de l''abonn',
  `prenoms_ab` varchar(100) NOT NULL COMMENT 'prnoms de l''abonn, spars par des virgules',
  `adresse_postale_ab` varchar(255) NOT NULL COMMENT 'adresse postale de l''abonn',
  `e_mail_ab` varchar(30) NOT NULL COMMENT 'adresse e_mail de l''abonn',
  `telephone_ab` int(30) NOT NULL COMMENT 'numro de tlphone de l''abonn',
  PRIMARY KEY (`id_ab`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Table des abonne' AUTO_INCREMENT=1 ;

-
- Les 3 requtes suivantes dfinissent la structure des tables 'auteurs', 'auteurs_livres' et 
- 'emprunts'. Les mots clefs KEY utiliss pour les deux dernires permettent d'associer  certains 
- champs des INDEX: dans ce cas, cela est ncessaire pour que ces champs puissent tre dfinis plus
- tard comme des CLEFS ETRANGERES
--
CREATE TABLE IF NOT EXISTS `auteurs` (
  `id_au` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Clef auteurs',
  `nom_au` varchar(100) NOT NULL COMMENT 'Nom de l''auteur',
  `prenoms_au` varchar(100) NOT NULL COMMENT 'prnoms de l''auteur, spars par des virgules',
  `biographie_au` text NOT NULL COMMENT 'biographie de l''auteur',
  PRIMARY KEY (`id_au`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Table des auteurs' AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `auteurs_livres` (
  `fk_id_au` int(8) unsigned NOT NULL,
  `fk_id_li` int(8) unsigned NOT NULL,
  KEY `fk_id_au` (`fk_id_au`),
  KEY `fk_id_li` (`fk_id_li`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Table de jonction auteurs-livres (association "ecrire"';

CREATE TABLE IF NOT EXISTS `emprunts` (
  `date_em` varchar(30) NOT NULL COMMENT 'Date d''emprunt',
  `duree-em` int(2) NOT NULL COMMENT 'dure en semaines de l''emprunt',
  `fk_id_ab` int(8) unsigned NOT NULL COMMENT 'Clef trangre (id. de l''abonn emprunteur)',
  `fk_reference_ex` varchar(30) NOT NULL COMMENT 'clef trangre (rfrence de l''exemplaire emprunt)',
  KEY `fk_id_ab` (`fk_id_ab`),
  KEY `fk_reference_ex` (`fk_reference_ex`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Table des emprunts en cours ';

-
- Les 2 requtes suivantes dfinissent la structure des tables 'exemplaires', et 'livres' et 
- 'emprunts'. Les mots clefs KEY utiliss pour les deux dernires permettent d'associer  certains 
- champs des INDEX: dans ce cas, cela est ncessaire pour que ces champs puissent tre dfinis plus
- tard comme des CLEFS ETRANGERES
--

CREATE TABLE IF NOT EXISTS `exemplaires` (
  `reference_ex` varchar(30) NOT NULL COMMENT 'rfrence de l''exemplaire: // ',
  `editeur_ex` varchar(255) NOT NULL COMMENT 'diteur de l''exemplaire',
  `date_achat_ex` varchar(30) NOT NULL COMMENT 'date d''achat',
  `etat_ex` varchar(20) NOT NULL COMMENT 'tat (neuf, bon, moyen, mdiocre, a changer',
  `fk_id_li` int(8) unsigned NOT NULL COMMENT 'Clef trangre (Id du livre correspondant 
  	 l''exemplaire)',
  PRIMARY KEY (`reference_ex`),
  KEY `fk_id_li` (`fk_id_li`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Table des exemplaires de livres en circulation';

CREATE TABLE IF NOT EXISTS `livres` (
  `id_li` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Id du livre',
  `titre_li` varchar(255) NOT NULL COMMENT 'titre du livre',
  `annee_parution_li` varchar(20) NOT NULL COMMENT 'anne de premire parution',
  `presentation_li` text NOT NULL COMMENT 'prsentation sommaire du livre',
  PRIMARY KEY (`id_li`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Table des livres' AUTO_INCREMENT=1;

- 
- Enfin, les directives qui suivent permettent de dfinir dans les tables 'auteurs_livres', 'emprunts'
- et 'exemplaires' les champs qui sont des clefs trangres (mots clefs 'ADD CONSTRAINT' et
 'FOREIGN KEY'.
--

ALTER TABLE `auteurs_livres`
  ADD CONSTRAINT `auteurs_livres_ibfk_2` FOREIGN KEY (`fk_id_li`) REFERENCES `livres` (`id_li`),
  ADD CONSTRAINT `auteurs_livres_ibfk_1` FOREIGN KEY (`fk_id_au`) REFERENCES `auteurs` (`id_au`);

ALTER TABLE `emprunts`
  ADD CONSTRAINT `emprunts_ibfk_2` FOREIGN KEY (`fk_reference_ex`) REFERENCES `exemplaires` (`reference_ex`),
  ADD CONSTRAINT `emprunts_ibfk_1` FOREIGN KEY (`fk_id_ab`) REFERENCES `abonnes` (`id_ab`);

ALTER TABLE `exemplaires`
  ADD CONSTRAINT `exemplaires_ibfk_1` FOREIGN KEY (`fk_id_li`) REFERENCES `livres` (`id_li`);
				
REMARQUES:
  • Ce programme cre la STRUCTURE de la BD et non son contenu. Les diffrents champs sont crs leurs valeurs par dfaut. Ce programme est donc reprsentatif du M.P.D de la base de donnes "bibliothque" telle qu'elle est dfinie par le MLD du chapitre IV;
  • Cette structure de base de donnes peut tre cre de deux faons:
    • Soit en transmettant les requtes depuis une application utilisatrice en utilisant l'A.P.I MySQL;
    • Soit en utilisant les commandes supportes par l'IHM associ au SGBD: dans ce cas, les commandes passes via l'IHM engendrent les mmes requtes SQL et les transmettent au moteur de base de donnes du SGBD.
    • En gnral, l'IHM permet de visualiser les requtes SQL qu'il produit lors de chaque commande. Le code SQL tudi ci-dessus est le code engendr par l'IHM du SGD MySQL lorsqu'on cre la base de donnes 'bibiliotheque";
    • Trs souvent, l'tat initial de la base de donnes est cr par l'intermdiaire de l'IHM, les volutions ultrieures du contenu et de la structure de la BD tant gres dynamiquement par l'application utilisatrice.

VI.3.7.EXEMPLE N 6 - Utilisation d'une table de jonction du MLD (jointure de tables):

Dans la base de donnes "bibliotheque", dfinie plus haut, nous avons les tables suivantes:
  • auteurs ( id_au, nom_au, prenoms_au, biographie_au );
  • auteurs_livres ( fk_id_au, fk_id_li ); // Table de jonction de l'association auteurs - (ecrire) - livres;
  • livres ( id_li, titre_li, annee_parution_li, presentation_li );
Nous voulons lister tous les livres crits par un auteur donn avec leur texte de prsentation, par ordre alphabtique croissant du titre des livres. Pour cela, nous allons effectuer la jointure de ces trois tables dans l'ordre o elles apparaissent dans la liste ci-dessus, en ne gardant dans la jointure que les colonnes donnant les noms et prnoms des auteurs, les titres de livres et la prsentation des livres.
Nous supposerons que le nom et les prnoms de l'auteur ont t saisis pralablement dans les variables $nom et $prenoms:
// Connexion au SGBD ( URL, Nom, Mot de passe )
mysql_connect( "localhost:3306","MonIdClient","MonMotDePasse");

// Slection de la base de donnes
mysql_select_db( 'bibliotheque' );

// Cration de la requte de jointure des table auteurs, auteurs_livres et livres:
$Requete =
"SELECT id_au, livres.titre_li, livres.presentation_li FROM auteurs
INNER JOIN auteurs_livres ON auteurs.id_au = auteurs_livres.fk_id_au
INNER JOIN livres ON livres.id_li = auteurs_livres.fk_id_li WHERE nom_au = $nom AND prenoms_au = $prenoms
ORDER BY livres.titre_li ASC";

// Envoi de la requte de jointure au SGBD
$R = mysql_query( $Requete );

// Rcupration des valeurs slectionnes et affichage des rsultats
while ( ( $Ligne = mysql_fetch_array($R) ) != false )
{
echo "<br />-".titre_li." ".Prsentation: ".presentation_li;
} echo "
";
// Clture de la connexion au SGBD
mysql_close();


Retour accs aux cours Retour sommaire cours
FormateurGaucheRepos FormateurGaucheActif FormateurDroitRepos FormateurDroitActif