1. PhpMyAdmin et MySQL

1.1. Introduction

1.1.1. MySQL

MySQL est un serveur de bases de données relationnelles SQL développé dans un souci de performances élevées. Il est multi-thread, multi-utilisateurs. C'est un logiciel libre développé sous double licence en fonction de l'utilisation qui en est faite : dans un produit libre (open-source) ou dans un produit propriétaire. Dans ce dernier cas, la licence est payante, sinon elle est libre.

MySQL est l'oeuvre d'une société suédoise, MySQL AB, fondée par David Axmark, Allan Larsson et Michael Widenius. Le nom MySQL vient de leur habitude à préfixer par « My » une grande partie de leurs dossiers, bibliothèques et outils. La fille de Michael Widenius était surnommée « My ».

La première version de MySQL est apparue le 23 mai 1995. Il a d'abord été créé pour un usage personnel à partir de mSQL en s'appuyant sur le langage de bas niveau ISAM qu'ils trouvaient trop lent et trop rigide. Ils ont créé une nouvelle interface SQL en gardant la même API que mSQL. MySQL est passé en licence GPL à partir de la version 3.23.19 (juin 2000)

1.1.2. Introduction

PhpMyAdmin est l'une des plus célèbres interfaces pour gérer une base de données MySQL sur un serveur PHP. De nombreux hébergeurs, qu'ils soient gratuits ou payants, le proposent ce qui permet à l'utilisateur de ne pas avoir à l'installer.

Cette interface pratique permet d'exécuter, très facilement et sans grandes connaissances dans le domaine des bases de données, de nombreuses requêtes comme les créations de table de données, les insertions, les mises à jour, les suppressions, les modifications de structure de la base de données. Ce système est très pratique pour sauvegarder une base de données sous forme de fichier .sql et ainsi transférer facilement ses données. De plus celui-ci accepte la formulation de requêtes SQL directement en langage SQL, cela permet de tester ses requêtes par exemple lors de la création d'un site et ainsi de gagner un temps précieux.

Figure 1. Accueil de PhpMyadmin

Accueil de PhpMyadmin


1.2. Création d'une base de données

1.2.1. Définition

Une base de données, usuellement abrégée en BD ou BDD, est un ensemble structuré et organisé permettant le stockage de grandes quantités d'informations afin d'en faciliter l'exploitation (ajout, mise à jour, recherche de données). Une base de données se traduit physiquement par un ensemble de fichiers sur disque. Le serveur MySQL est capable de gérer simultanément plusieurs bases de données, accessibles en concurrence (des mécanismes tels que les transactions permettent de gérer les problèmes qui en découlent) par une ou plusieurs applications.

De manière générale, une applications Web est liée à une base de données. Dans notre cas, nous allons créer une base de données consacrée à la gestion d'un magasin de location de planches à voile. Nous allons l'appeler location_planche. Cette base de données stockera différentes informations sur des planches à voiles, des clients et des locations.

1.2.2. Création des tables

L'aspect "relationnel" des SGBDR est caractérisé en partie par la possibilité de regrouper dans un même fichier des données hétérogènes. Ce qui semble naturel aujourd'hui, alors que l'idée paraissait saugrenue dans les années 1970. L'idée des tables est donc d'abstraire la notion de fichiers, et de définir tout simplement ce que contiendra chaque enregistrement de la table. Nous verrons en fin de cours une méthode pour arriver à se représenter les tables à créer, mais pour l'instant, contentons nous de créer deux tables : PLANCHES et CLIENTS. La tables PLANCHES contiendra pour le moment un seul champ (une seule donnée par enregistrement) : PLA_NUM. La table CLIENTS contiendra un seul champ, CLI_NUM.

Figure 2. Création d'une table sous PhpMyAdmin

Création d'une table sous PhpMyAdmin


Figure 3. Reqête de création de la table

Reqête de création de la table


Note

Vous noterez les conventions de nommage (non obligatoires mais fortement recommandées). Elles peremettent de retrouver rapidement à quelle table appartient une données (un PRENOM peut appartenir à plusieurs tables : CLIENTS, EMPLOYES, ..)

1.2.3. Identifiants

Dans les exemples précédents, nous avons limité le contenu de chacune des tables à un seul champ. Nous avons néanmoins pris soin de préciser que les champs "numéros" de chaque table étaient des clefs primaires aussi appelés identifiants. Cette propriété particulière implique que tout enregistrement de la table peut être identifié de manière unique par ce champ, c'est-à-dire qu'à une valeur de l'identifiant ne correspond qu'un seule enregistrement de la table. Il faut au moins un identifiant par table, et il est préférable pour des raisons de performances qu'il soit un entier.

Il est également intéressant de noter que nous avons mis le champ extra sur la valeur auto_increment. Ainsi,la clef primaire peut être gérée directement par le serveur MySQL, qui l'incrémentera à chaque nouvel ajout dans la table.

1.2.4. Type de donnéees

Pour le moment, nos tables ne contiennent pas beaucoup de champs ! Nous allons rajouter quelques informations complémentaires. A chaque nouveau champ, nous allons devoir choisir un type de données, c'est-à-dire spécifier quelles valeurs pourront être stockées dans ces champs. Pour la table PLANCHES, nous allons ajouter les champs suivants :

  • PLA_MODELE : CHAR(20)

  • PLA_MARQUE : CHAR (20)

  • PLA_POIDS : FLOAT

  • PLA_ANNEE : INTEGER

Pour la table client nous allons ajouter les champs suivants :

  • CLI_NOM : CHAR (20)

  • CLI_PRENOM : CHAR(20)

  • CLI_TEL : CHAR(10)

  • CLI_ADR : VARCHAR(150)

MySQL supporte un grand nombre de types de données, mais voici les plus couramment utilisés :

1.2.4.1. Types numériques

Le tableau ci-dessous cite les différents types de données numériques sous MySQL. M indique la taille d'affichage, et D (valable pour les nombres en virgule flottante), représente le nombre de chiffres après la virgule.

Tableau 1. Types numériques sous MySQL

TypeDe1
TINYINT(M)-128127
SMALLINT(M)-3276832767
MEDIUMINT(M)-83886088388607
INT(M)-21474836482147483647
BIGINT(M)-92233720368547758089223372036854775807
FLOAT[(M,D)]-3.402823466E+383.402823466E+38
DOUBLE[(M,D)]-1.7976931348623157E+3081.7976931348623157E+308

1.2.4.2. Types Date et heure
  • Type TIME : MySQL lit et affiche les colonnes de type TIME au format 'HH:MM:SS'. Les valeurs TIME non valides sont transformées en date zéro '00:00:00'

  • Type DATE : Le type DATE est prévu lorsque vous souhaitez stocker une date. MySQL affiche les valeurs de type DATE au format ' AAAA-MM-JJ '. L'intervalle de validité va de '1000-01-01' à  '9999-12-31'. Les dates non valides sont transformées en "0000-00-00"

  • Type DATETIME : Le type DATETIME est prévu lorsque vous souhaitez stocker une date et une heure. MySQL affiche les valeurs de type DATETIME au format ' AAAA-MM- JJ HH:MM:SS'

  • Type TIMESTAMP : Le type TIMESTAMP est prévu pour stocker automatiquement l'heure courante lors d'une commande INSERT ou UPDATE . Si vous avez plusieurs colonnes de type TIMESTAMP , seule la première colonne sera mise à  jour automatiquement.

1.2.4.3. Chaînes de caractères

Les types chaînes sont CHAR , VARCHAR , TEXT . Il en existe d'autres, mais nous nous intéresserons en priorité à  ceux-ci.

Ces types de données vous permettent de définir des chaînes de longueur comprise entre 1 et 255 caractères.

CHAR(L) : dans ce cas, quelque soit la longueur effective de la chaîne, elle sera toujours stockés sur un nombre d'octets fixe, L. Par exemple, si vous définissez CHAR (10) et que vous entrez la chaîne "Bonjour", elle sera complétée par trois espace dans la table.

VARCHAR(L) : dans ce cas, MySQL stocke la chaîne, plus un octet définissant la longueur effecctive de l'enregistrement. Dans notre exemple "bonjour", cette chaîne occupera 7+1 octets dans la base.

TEXT : ce type de données peut en fait être considéré comme un VARCHAR de longueur indéfini. Il n'y a pas de limitation de taille pour ce type, insensible à  la casse. Dans l'absolu, ce sont les capacités du serveur qui déterminent la longueur maximale d'un TEXT.

De plus, il est possible de spécifier pour chaque champ si une valeur est obligatoire ou non en précisant la valeur de NULL / NOT NULL.

Figure 4. Table Clients

Table Clients

Figure 5. Table Planches

Table Planches

1.3. Gestion des enregsitrements avec PhpMyAdmin

1.3.1. Insertion d'enregsistrement dans une table

Nous verrons dans les chapitres suivants comment automatiser l'accès aux données des tables depuis des pages Web et le langage Php. Pour le moment, nous continuons à nous intéresser à PhpMyAdmin et ses fonctionnalités.

En cliquant sur le lien Insérer depuis le menu de la tables clients, nous obtenons un formulaire qui nous permet de remplir directement la table. Il est à noter que PhpMyAdmin nous propose d'exécuter un certain nombre de fonctions sur les données que nous allons entrer. En utilisant le formulaire entrez 5 clients dans la base, et 10 planches. Vous trouverez des exemples de modèles sur le site www.vaguesetvents.com dans la section Windsurf.

Figure 6. Insertion d'un client

Insertion d'un client

Si l'insertion est validée par MySQL (si les données correspondent à la définition de la table) PhpMyAdmin affiche la requête qu'il a exécutée pour faire l'insertion. Cette requête est écrite en langage SQL, le langage que nous utiliserons depuis Php pour interroger MySQL. Il peut donc être intéressant de bien noter ces requêtes pour éventuellement s'en inspirer !

	  

INSERT INTO `location_planche`.`CLIENTS` (
`CLI_NUM` ,
`CLI_NOM` ,
`CLI_PRENOM` ,
`CLI_TEL` ,
`CLI_ADR`
)
VALUES (
NULL , UCASE( 'kurzweg' ) , 'ivan', '0262112233', 'St Paul'
), (
NULL , UCASE( 'payet' ) , 'jean', '0262223344', 'Bois de Nèfles St Paul'
);

1.3.2. Affichage, modification et suppression d'enregistrements

PhpMyAdmin nous permet également de modifier les enregistrements contenus dans la table. Pour ceci, le menu afficher présente dans un tableau HTML la liste des enregistrements de la table. On remarque de nouveau qu'on nous présente la requête permettant de faire ce traitement.

Figure 7. Insertion d'un client

Insertion d'un client

1.4. Admministration avec PhpMyAdmin

1.4.1. Sauvegarde et restauration

PhpMyAdmin permet d'exporter et d'importer une base de données, fonctionnalité qui permet ainsi de sauvegarder et de restorer une base, mais aussi de passer d'un environnement de développement à un environnement de production.

L'exportation permet d'afficher l'ensemble des requêtes SQL nécessaire à la création de la base et à l'insertion des données de manière à retrouver le même état que l'actuel. Il est à noter qu'il est également possible de générer des formats différents (CSV, DOC, PDF, etc ...).

Pour exporter la base, il faut choisir d'exporter les données et/ou la structure de la base.

Figure 8. Exportation de la base de données

Exportation de la base de données


L'opération inverse, l'importation, consiste à exécuter l'ensemble des requêtes SQL qui vont créer la base de données. Il s'agit pour l'administrateur de donner les différentes caractéristiques du fichier à exécuter...

1.4.2. Gestion des utilisateurs

Il existe dans MySQL la notion d'utilisateur. La création d'utilisateur permet de restreindre les opérations autorisés pour un utilisateur. Par défaut, MySQL ne contient qu'un seul utilisateur, le super-utilisateur root. Dans le cas d'applications Web, il peut être intéressant de créer un utilisateur ayant des droits plus limités sur la base de données utilisée.

Par exemple, il est rare que les pages Web accèdant à une base de données aient besoin de modifier la structure de cette base. Or, les connexions depuis le site Internet se font en utilisant un compte utilisateur. En cas de piratage, il se peut que ce compte soit utilisé pour détruire l'ensemble des données. Nous allons donc prendre l'habitude de créer un utilisateur "web" qui ait des droits plus limités et plus affinés.

1.4.2.1. Création d'un utilisateur

Un utilisateur est enregistré au niveau du serveur MySQL, et ses droits sont définis pour chaque base de données hébergée. Le menu "privilèges" au niveau de la page d'accueil de PhpMyAdmin permet d'accèder aux différents utilisateurs de MySQL et d'en créer de nouveaux.

Figure 9. Ajout d'un utilisateur

Ajout d'un utilisateur

1.4.2.2. Attribution de privilèges

Une fois l'utilisateur créé, il est possible de lui accorder des droits particulier sur une base de données. Dans notre exemple, nous accordons à l'utilisateur Web les privilèges suivants sur la base de données location_planches : SELECT, INSERT, UPDATE

Figure 10. Attribution de droits sur une base de données

Attribution de droits sur une base de données

1.5. Exercices d'applications

Dans les cours HTML et Php, nous allons tenter de créer une application permettant de présenter la formation. Au final, toutes les informations devront être extraite d'une base de données. Afin de préparer cette application, nsou allons créer et insérer les données relatives à la formation :

  1. créez une base de données FORMATION_INITLL.

  2. Créez ensuite 3 tables : STAGIAIRES, MODULES, FORMATEUR. Choisissez vous même les champs composant ces tables. Vous prendrez soin de bien choisir les types de données.

  3. Insérez ensuite 5 stagiaires, 4 modules et 3 formateurs.

  4. Sauvegardez votre base de données.

  5. Attribuez les bons droits à l'utilisateur web créé dans le cours.

1.6. Tables de jointures

Notre applications de location de planches contient à présent des clients et des planches à voiles, mais aucune informations sur les locations ! Essayons de trouver une méthode pour représenter le fait qu'un client puisse louer plusieurs fois des planches à voiles ...

Les données dont nous avons besoin sont les suivantes : quel client a loué quelle planche, à quelle date/heure a débuté la location, et à quelle date/heure a été rendu le matériel ... nous pouvons donc commencer à créer une table location contenant ces données :

Figure 11. Attribution de droits sur une base de données

Attribution de droits sur une base de données


Ici, nous avons encore entré un identifiant automatique, que MySQL gérera (auto_increment).

Mais il nous manque encore des informations essentielles : les caractéristiques des clients et des planches louées. Ces informations existant déjà dans la base, nous n'allons pas de nouveau les insérer ! En effet, toute modification d'un enregistrement (par exemple un changement de numéro de téléphone) nécessiterait de modifier 2 tables, ce qui peut vite devenir fastidieux .. Nous allons plutôt nous servir des identifiants des autres tables.

1.6.1. Clefs étangères

En effet, nous avons vu que les identifiants ou clefs primaire nous permettent d'accéder de manière unique à un enregistrement d'une table : les CLI_NUM sont par exemple des numéros uniques, dont dispose chaque client, et qui permette d'accéder à ses informations. Il suffit donc d'insérer ce numéro dans la table location, pour connaître le numéro du client qui a loué une planche et ainsi pouvoir accéder à ses donnée ! L'insertion d'une clef primaire en provenance d'une autre table s'appelle clef étangère.

Sous PhpMyadmin, il nous faut d'abord ajouter le champ qui servira de clef étrangère en liaison avec les clients. Ce champ doit être de même type que dans la table CLIENTS, mais ne doit pas être clef primaire de la table LOCATIONS. !

Figure 12. Insertion d'un champ complémentaire

Insertion d'un champ complémentaire


Ensuite nous devons dire à MySQL que ce champ CLI_NUM est un champ qui est une clef, en utilisant le tableau de PhpMyAdmin Index, et le menu créer une clef sur 1 colonne :

Figure 13. Création d'un index

Création d'un index


Note

Le nom de l'index est précédé (c'est une convention) de FK pour Foreign Key.

Ensuite, le lien Gestion des relations de PhpMyAdmin nous permet de dire que le champ CLI_NUM de la table LOCATIONS est lié au champ CLI_NUM de la table CLIENTS. Les menus ON DELETE et ON CASCADE nous permettent de dire quelles seront les actions à eeffectuer si le champ source est modifié ou mis à jour...

Il ne nous reste plus qu'à faire la même opération pour le champ PLA_NUM ...

1.7. Relation hiérarchique entre tables

Dans les paragraphes précédents, nous avons vu comment représenter les locations de planches, en créant une nouvelle table et en ajoutant les clefs étrangères des 2 tables en relation (CLIENTS et PLANCHES). Cependant, la création d'une table de jointure n'est pas toujours obligatoire... C'est le cas des relations hiérarchiques entre tables, concept que nous préciserons dans le chapitre 3, et qui se caractérise par une relation de type 1,n alors que dans les paragraphes précédents, nous étions plutôt sur des relations de type n,n (un client peut louer plusieurs/n planches, et une planche peut être louée plusieurs/n fois).

1.7.1. Modification de la base de données

Certains clients tiennent absolument à naviguer sur du matériel hawaien ! Or notre base de données ne contient pas ces informations ... Par contre, il nous est facilement possible de retrouver le pays d'origine de chaque marque de planche. Par exemple, les planches de marque Fanatic sont d'origine allemande. Pour intégrer ces nouvelles données, nous avons le choix de modifier la structure de la table PLANCHES en rajoutant un champ PAYS, et de modifier un par un TOUS les enregistrements ... ou de créer une nouvelle table MARQUES. Prenons la seconde solution !

La table marque a la structure suivante :

Figure 14. Création d'un index

Création d'un index


L'information sur la marque dans la table PLANCHES est donc redondante. Supprimons le champ PLA_MARQUE.

Figure 15. Création d'un index

Création d'un index


1.7.2. Ajout de la clef étrangère

Il nous faut maintenant représenter le fait qu'une planche est d'une certaine marque. Dans notre cas, il nous suffit de remarquer qu'en insérant une clef étrangère dans la tables PLANCHES, qui contiennent le numéro de la marque, il nous sera aisé de retrouver toutes les informations d'une planche, y compris son pays d'origine !

Le principe de création de la clef étrangère est le même que dans les paragraphes précédents :

  1. Insérer un champ MAR_NUM dans la table PLANCHES, de même type que l'identifiant de la table MARQUES

  2. Créer un index sur ce champ

  3. Faire la liaison avec la table MARQUES en utilisant le lien Gestion des relations

Figure 16. Création de la clef étrangère

Création de la clef étrangère

Il ne reste plus qu'à mettre la base de données à jour .....

1.8. Exercices d'applications

Reprenons notre base "formation" :

  1. En modifiant la base, faites apparaître que les stagiaires sont inscrits dans un ou plusieurs modules.

  2. En modifiant la base, faites apparaître que chaque module est enseigné par un formateur.

  3. Insérez les données de votre inscription.

Skins :
Transparence
Simple
Page Accueil
Formation