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)
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.
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.
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.
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, ..)
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.
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 :
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
| Type | De | 1 |
| TINYINT(M) | -128 | 127 |
| SMALLINT(M) | -32768 | 32767 |
| MEDIUMINT(M) | -8388608 | 8388607 |
| INT(M) | -2147483648 | 2147483647 |
| BIGINT(M) | -9223372036854775808 | 9223372036854775807 |
| FLOAT[(M,D)] | -3.402823466E+38 | 3.402823466E+38 |
| DOUBLE[(M,D)] | -1.7976931348623157E+308 | 1.7976931348623157E+308 |
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.
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.
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.
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' );
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.
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.
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...
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.
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.
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
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 :
créez une base de données FORMATION_INITLL.
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.
Insérez ensuite 5 stagiaires, 4 modules et 3 formateurs.
Sauvegardez votre base de données.
Attribuez les bons droits à l'utilisateur web créé dans le cours.
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 :
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.
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. !
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 :
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 ...
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).
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 :
L'information sur la marque dans la table PLANCHES est donc redondante. Supprimons le champ PLA_MARQUE.
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 :
Insérer un champ
MAR_NUMdans la tablePLANCHES, de même type que l'identifiant de la tableMARQUESCréer un index sur ce champ
Faire la liaison avec la table
MARQUESen utilisant le lienGestion des relations
Il ne reste plus qu'à mettre la base de données à jour .....














