Vous êtes sur la page 1sur 56

Tutoriel MySQL

Le fondement de notre univers digital est une montagne de données sans cesse en
expansion. Les systèmes de gestion de bases de données tels que MySQL sont des éléments
centraux de la Toile et du monde connecté. Ces derniers permettent de traiter une grande
quantité de données en ligne et de manière durable. Des ensembles de données complexes
sont découpés en sous-ensembles maniables et sont mis en relation si besoin pour cela.
Nous allons vous présenter les fondements de la gestion de base de données dans notre
tutoriel MySQL et vous montrer des exemples de la façon dont vous pouvez optimiser le
stockage de données pour votre projet Web avec MySQL.

Sommaire
1. Qu’est-ce que MySQL?
2. Installation du système de gestion de base de données
3. Gestion de bases de données avec phpMyAdmin
4. Etablir la connexion de base de données
5. Requêtes de données avec SELECT, INSERT, UPDATE et DELETE
6. Prepared Statements
7. Fonctions de date et d’heure dans MySQL
8. Rapports d’erreurs MySQL
9. JOIN
10. De débutant à professionnel

Qu’est-ce que MySQL?


MySQL fait partie des systèmes de gestion de bases de données relationnelles les plus
populaires au monde avec Oracle et Microsoft SQL Server (vous pouvez consulter un aperçu
du classement de ces systèmes en termes de popularité sur db-engines.com. Le logiciel
développé par la société suédoise MySQL AB en 1994 est désormais sous le
patronage d’Oracle Corporation et est distribué sur la base d’un système de double licence.
En dehors de la version propriétaire entreprise, Oracle offre une licence GPL open source.
Cette double licence donne aux entreprises la possibilité de développer leurs propres
programmes sur la base de MySQL, sans avoir à les soumettre à la licence. Cependant,
l’acquisition de MySQL par Oracle soulève des critiques dans la communauté open source.
MySQL est écrit en C et en C++ et dispose d’un analyseur SQL basé sur Yacc avec Tokenizer
(scanner lexical). Le système de gestion de base de données se caractérise de plus via
une grande compatibilité avec les différents systèmes d’exploitation.

1
Fait
l’abréviation SQL signifie « Structured Query Language », un langage informatique servant à
l’administration de structures de bases de données. Les opérations possibles comprennent des
requêtes, des insertions, mises à jour et suppressions de fichiers de données.

MariaDB, fork de MySQL au fort potentiel


L’intégration du projet MySQL dans le portefeuille de produits Oracle suscite critiques et
méfiances comme nous l’avons déjà évoqué. Cela doit surtout être dû aux différences entre
la version MySQL sous licence GPL et le produit payant Entreprise. De plus en plus de
nouvelles fonctions sont seulement disponibles sur la version propriétaire payante.
Des bases de données erronées non publiques et le manque de tests ont donné une image
d’un programme négligé auprès de sa communauté. Le soutien de la communauté open
source est par conséquent en baisse constante.
Dès 2009, l’équipe de développement et le fondateur de MySQL Michael Monty Widenius
tournait le dos au populaire système de base de données et a lancé le fork à source ouverte
MariaDB. Fin 2012, Fedora, OpenSUSE, Slackware et Arch Linux présentaient les premières
distributions Linux pour passer de MySQL à MariaDB comme installation standard. De
nombreux projets open source, ainsi que les sociétés de logiciels bien connus et plateformes
Web ont suivi cet exemple, à l’image de Mozilla, Ubuntu, Google, Red Hat Entreprise Linux,
Web of Trust, TeamSpeak, la fondation Wikimedia ainsi que le projet de logiciels XAMPP.
MariaDB se caractérise déjà par un développement continu, en comparaison avec d’autres
systèmes MySQL open source. Il est donc probable que ce fork dépasse un jour son projet-
mère.
Conseil
on appelle fork la branche de développement de l’industrie des logiciels résultant de l’arrêt
d’un projet (généralement open source). Il est basé sur le code source du projet-mère et peut
être développé davantage au sein d’un projet indépendant.

Système de base de données


La gestion électronique des données est aujourd’hui détenue en grande partie par
les systèmes de gestion de bases de données (DBS). Ceux-ci se composent de deux éléments
principaux : la base de données (DB) elle-même et le système de gestion correspondant.
• Le système de gestion de base de données : le DBMS est un logiciel comme MySQL,
utilisé pour gérer la base de données. Parmi les tâches de ce logiciel d’administration,
on compte la structuration des données selon un modèle prédéfini de base de
données. En outre, le DBMS contrôle les accès à la lecture et l’écriture de la base de
données pour gérer de grandes quantités de données ainsi que l’accès à une base de
données parallèle. Il fait en sorte que les lignes directrices pour l’intégrité des
données, la confidentialité et la sécurité des données soient respectées.

2
• La base de données : une base de données est une base de données relative au
contenu tel que les données relatives aux clients (CMS). Un DBMS peut gérer
plusieurs bases de données en même temps.
Le graphique suivant sert de représentation schématique d’un système de gestion de base de
données:

Un système de bases de données est composé d’un système de gestion de bases de données
et de nombreuses bases de données.

Le modèle de base de données relationnelle


MySQL se définit comme un DBMS relationnel. Cela signifie que la gestion des données est
basée sur un modèle de base de données basé sur des tableaux. Toutes les données traitées
sur MySQL sont stockées dans des tableaux pouvant être reliés les uns aux autres via des
clés.
Nous vous illustrons cela avec un exemple simple. Vous trouverez ci-dessous deux tableaux
avec des auteurs et leurs œuvres:

3
Tous les tableaux d’une base de données relationnelle se composent de colonnes et de
lignes. Chaque colonne d’un tableau renvoie à un attribut précis. Dans le tableau auteurs se
trouvent par exemple les attributs id, prénom et nom de famille. Les lignes d’un tableau sont
caractérisées de rangées comportant chacune un ensemble de données. Ce dernier est en
général identifié (numéroté) clairement à travers une clé primaire. On définit lors de la
conception du tableau quel attribut fait fonction de clé primaire. La condition pour cela est
que la clé primaire permette un classement clair. Une clé primaire ne peut pour cette raison
être utilisée qu’une seule fois au sein d’une colonne. Une numérotation avec
des IDs (identifiants) est recommandée.
Le tableau oeuvres, en dehors du fait d’intégrer la clé primaire oeuvres_id, contient aussi
des clés étrangères comme auteurs_id. Ce tableau établit une relation entre les deux
tableaux et permet de nouer les articles d’un tableau avec ceux des autres. On parle
d’un join (jointure) lorsqu’on met en contact deux tableaux d’une base de données
relationnelle. Une telle jointure peut par exemple induire la requête suivante : « Charger
toutes les valeurs de l’auteur John Ronald Reue Tolkien incluant la date de première
publication ».

Tolkien est listé dans le tableau auteurs avec la clé primaire auteurs_id1. Pour extraire ces
valeurs de l’auteur, des valeurs de clés étrangères entrent en jeu. Toutes les rangées reliées à
auteurs_id1 sont ici chargées.
Dans la pratique, les opérations de bases de données MySQL sont réalisées avec
des commandes SQL standardisées telles que SELECT, INSERT, UPDATE et DELETE. Nous
aborderons plus en détail ce sujet dans les chapitres suivants de notre tutoriel MySQL.
Vous pouvez bien sûr stocker toutes les données à la fois dans un seul tableau (les auteurs et
leurs œuvres). Une telle gestion de données entraîne cependant de nombreuses
redondances supplémentaires, étant donné que les colonnes « prénom » et « nom »
devraient plutôt être saisies comme une seule donnée dans ce cas précis. Une telle
redondance consomme de la mémoire, mais signifie également que toutes les mises à jour
doivent être faites à différents niveaux de la base de données. Lorsque vous travaillez avec

4
des bases de données relationnelles, il convient de ne déterminer qu’un seul motif par
tableau. On parle dans ce cas de normalisation des données.
Le champ d‘application central de MySQL est le stockage de données dans le cadre d’offres
Web dynamiques. La combinaison de MySQL avec le logiciel de serveur Web Apache et le
langage script PHP ou Perl s’est établie comme le squelette de base dans tout
développement Web. Cette pile de programmes Web peut être utilisé comme LAMP (Linux),
MAMP (Mac OS) ou WAMP (Windows) avec les différents principaux systèmes d’exploitation.
Nous recommandons l’environnement texte local XAMPP aux débutants avec MySQL pour
une première expérience avec le système de gestion de base de données. Ce dernier se
trouve dans la version actuelle de MariaDB.

Installation du système de gestion de base de données


Afin de vous apporter les bases de MySQL, nous travaillerons avec des exemples pratiques.
Notre introduction à MySQL est basée sur un environnement de test, XAMPP. Les extraits de
code et impressions écrans se concentrent sur les opérations de bases de données pouvant
être réalisées via PHP à l’aide d’un serveur Apache http local sur un ordinateur Windows. Au
lieu de la classique base de données MySQL, c’est plutôt le fork MariaDB qui est mis en
œuvre. En tant qu’utilisateur, il n’y a pas de différence pour apprendre à utiliser MySQL ou
MariaDB.
Notre tutoriel XAMPP peut vous permettre d’installer un tel environnement de logiciels de
test local sur votre ordinateur sous Windows. Si vous voulez apprendre à utiliser les bases de
données relationnelles à partir de zéro, nous vous recommandons de commencer avec
MariaDB. AMPPS représente une alternative gratuite pour créer un environnement de test
sur la base de MySQL.
Il est par ailleurs possible de mettre en place un Web Stack, ou pile de programmes Web.
MySQL et MariaDB peuvent au besoin être combinés avec différents systèmes d’exploitation,
serveurs Web et langages scripts. Des packs de licences GPL à télécharger sont disponibles
gratuitement sur mysql.de et mariadb.com. Vous trouverez également de
la documentation en anglais sur MySQL ainsi que MariaDB.

Gestion de bases de données avec phpMyAdmin


Vous pouvez utiliser l’application Web libre phpMyAdmin pour de la gestion MySQL. Elle est
d’ailleurs comprise dans la suite logicielle XAMPP, mais aussi proposée indépendamment sur
le site Web officiel du projet.
PhpMyAdmin est un logiciel standard pour l’administration de bases de données MySQL sur
le World Wide Web. L’application Web écrite en PHP et JavaScript permet de mener des
opérations sur des bases de données via une interface utilisateur graphique. Vous pouvez
ainsi créer et gérer les tableaux de vos bases de données relationnelles par clic sur votre

5
navigateur Web. Connaître les commandes SQL appropriées n’est initialement pas
nécessaire.
Charger phpMyAdmin
Une fois l’ensemble de logiciels XAMPP installé, démarrez le système de gestion de base de
données (MySQL ou MariaDB) de manière similaire aux autres composants des test-stacks
via le panneau de configuration. Utilisez pour cela le bouton « Start » ou démarrer sous
« Actions ». Afin de charger phpMyAdmin via le navigateur Web, vous devez également
redémarrer le serveur Web Apache. Les modules activés apparaissent en vert sur le panneau
de configuration XAMPP. Vous obtenez de plus l’état actuel des modules XAMPP par
messagerie.

Démarrez MySQL ainsi que le serveur http Apache via le panneau de configuration XAMPP
Fait
XAMPP a été conçu dans le cadre du projet de logiciel Apache Friends en tant que système
de test compact pour une mise en œuvre sur un ordinateur local. La suite de logiciels n’est
n’a ainsi pas été prévue pour mettre des services Web à disposition sur Internet. XAMPP n’est
donc pas adapté en tant que système de production en raison de nombreuses limitations
dans le domaine de la sécurité.
Vous trouverez le mode de test local de l’interface Web du programme
d’administration http://localhost/phpmyadmin/.
Après avoir défini un mot de passe pour le compte racine (root-Account) lors de l’installation
de MySQL, phpMyAdmin demande ces données d’identification via une fenêtre prévue à cet
effet. Si vous utilisez phpMyAdmin dans le cadre d’un produit d’hébergement Web, les
données de connexion appropriées sur le fournisseur seront attribuées. Vous ne disposez en
général pas des droits racine dans ce cas.

6
Après une connexion réussie, phpMyAdmin vous présente la page d’accueil de l’application.
Celle-ci vous offre la possibilité de modifier les paramètres de base de la police de la
connexion MySQL ainsi que de choisir les modalités d’affichage (langue, design, et taille de la
police). Vous trouverez également un aperçu des paramètres de base de votre serveur de
base de données, le logiciel de serveur Web utilisé ainsi que des informations sur la version
actuelle de phpMyAdmin sur la partie droite. La barre de menu de la page d’accueil est
conçue comme toutes les autres barres de menus de l’application, sous la forme d’onglets.
Vous avez le choix entre les onglets, base de données, SQL, état, comptes utilisateurs,
importation, exportation, paramètres, et autres.

La page d’accueil phpMyAdmin apparaît en chargeant l’URL http://localhost/phpmyadmin/


Le panneau de configuration se trouve sur le bord gauche de l’interface. Tous les tableaux y
sont répertoriés et vous pouvez même y accéder à l’aide de votre banque de données de
phpMyAdmin. Sous le logo du programme dans le coin supérieur gauche se trouvent les
liens vers la page d’accueil ainsi que de la documentation qui est mise à votre disposition.
Vous avez par ailleurs la possibilité de configurer votre zone de navigation et d’actualiser son
apparence.
Commençons notre cours intensif MySQL pour vous apprendre à établir une première base
de données.
Mettre en place une base de données
Pour concevoir votre base de données avec phpMyAdmin, choisissez l’onglet « Databases »
(bases de données) dans la barre de menu de la page d’accueil.

7
Les bases de données se trouvent dans l’onglet « Databases » avec phpMyAdmin
Choisissez un nom pour votre base de données dans le champ « Create database » (créer
une nouvelle base de données). Nous recommandons la police utf8mb4_unicode_ci. Le choix
de cette dernière permet d’indiquer au serveur de base de données quel codage appliquer
pour l’envoi et la réception de données. Les variantes mb4 permettent aussi des caractères
exotiques tels que des symboles ou des emojis, sortant du niveau de base Unicode (plan
multilingue de base), et sont donc recommandées.

Afin de créer une base de données, choisissez un nom et déterminez une police sous-jacente
Confirmez votre saisie en cliquant sur « Create » (créer). La base de données ainsi créée
apparaît désormais sur le panneau de navigation sur le côté gauche de l’écran. Les bases de
données nouvellement créées ne contiennent pas de contenu initialement. Afin d’ajouter des
données, créez un tableau lors de l’étape suivante.

8
Concevoir des tableaux
Pour concevoir un nouveau tableau, choisissez la base de données souhaitée et rendez-vous
sur l’onglet « structure » de la barre de menu.

Créez un nouveau tableau de données via « Create table »


Concevez un tableau dans lequel vous indiquez un nom (utilisateurs par exemple) ainsi que
le nombre souhaité de colonnes dans l’interface « create table » (créer un tableau). Gardez
bien en tête que chaque colonne sert d’attribut de police. Si vous avez besoin de colonnes
supplémentaires, vous pouvez les ajouter plus tard.
Si vous souhaitez par exemple créer une base de données utilisateur pour votre site Web, les
caractéristiques suivantes devraient apparaître dans les différentes colonnes du tableau :

Colonne Description

id Un numéro d’identification unique pour chaque utilisateur

forename Le prénom de l’utilisateur

surname Le nom de famille de l’utilisateur

email L’adresse email de l’utilisateur

password Le mot de passe de l’utilisateur

9
Colonne Description

created_at L’heure à laquelle l’entrée a été créée

updated_at L’heure à laquelle l’entrée a été actualisée

Pour établir un tel tableau utilisateurs (users), créez sept colonnes. Vous pouvez valider la
saisie en cliquant sur « Go ».

Définissez un nom pour le tableau ainsi que le nombre de colonnes souhaité


Une fois le tableau créé, phpMyAdmin vous offre la possibilité de définir des caractéristiques
pour des colonnes du tableau ainsi que des paramètres de format pour les données
attendues.

Le tableau exemple « users » : initialement sans attributs

10
Le tableau suivant vous donne une description de la structure des tableaux et des formats
possibles.

Option Description

Name Chaque colonne d’un tableau de base de données se voit attribuer un nom. Des
restrictions peuvent y être ajoutées. Les caractères latins (en majuscule ou
minuscule, mais sans tréma), les chiffres, les icones des différentes monnaies, et
tirets ne posent aucun problème pour cela. Ces derniers peuvent être utilisés
comme alternative aux espaces vides non autorisés (faux : user id; correct :
user_id). Les noms de colonnes ne doivent pas contenir que des chiffres. Par
ailleurs, il existe divers mots-clés réservés pour différentes tâches dans le langage
de base de données SQL. Une liste se trouve dans la documentation mySQL. Vous
pouvez contourner la plupart de ces restrictions mais vous devez mettre la colonne
respective entre guillemets pour ce faire. Les mêmes règles sont aussi valables pour
les. Nous vous recommandons d’utiliser des noms de colonnes clairs qui
correspondent à l’attribut respectif.

Type Le type de données spécifie quel type de données est stocké dans une colonne.
MySQL et MariaDB vous permettent de définir des données comme des nombres
entiers à virgule flottante, l’heure et la date ainsi que des chaînes de texte et des
données binaires. Une description se trouve dans le tableau des types de données.

Length/values Avec certains types de données (par exemple des chaînes de caractères) vous
pouvez affecter des valeurs pour la longueur maximale d’une colonne. Ceci est
facultatif.

Default L’option « Default » vous permet de définir une valeur standard pour une colonne.
Celle-ci est toujours automatiquement ajoutée lorsqu’un paquet de données ne
contient pas de valeur pour la colonne respective.

Collation Avec l’option « Collation », vous définissez un type de caractères particulier pour
une colonne, pouvant différer des paramètres de bases globaux de bases de
données. Vous pouvez modifier le codage au niveau du tableau pour toutes les
colonnes.

Attributes Certains types de données peuvent être déterminés de manière plus détaillée par
attributs facultatifs. Vous pouvez par exemple ainsi spécifier avec les attributs
signed et unsigned, si un nombre entier ou à virgule flottante peut aussi prendre
des valeurs négatives, et non uniquement positives.

Index Vous pouvez définir des règles d’indexation via l’option « Index ». Sélectionnez un
paramètre d’indexation PRIMARY pour une colonne. Ce dernier est considéré
comme la clé primaire du tableau. Le paramètre UNIQUE spécifie que les valeurs ne

11
Option Description

peuvent être stockées qu’une fois dans cette colonne. Ainsi, les duplications
peuvent être évitées si besoin.

A_I L’abréviation « A_I » signifie AUTO_INCREMENT et indique au système de gestion de


base de données de compter une valeur automatiquement lorsqu’un paquet n’a
pas été spécifié. Cette option est utilisée pour l’indexation de paquets.

Comments Le champ « comments » vous permet de fournir des colonnes dotées de


commentaires.

Les options présentées ici sont les paramètres les plus importants pour le formatage de
colonnes. En utilisant la barre de défilement vers la droite, vous trouverez encore plus de
paramètres que nous ne pouvons décrire dans notre guide MySQL pour débutants.
Le tableau suivant répertorie les différents types de données qui peuvent être traitées avec
MySQL et MariaDB, ainsi que les différentes tranches de valeurs et de mémoire requise.

Besoin
de
Type Description Valeur mémoire

TINYINT Un nombre entier très faible Sans signe : 0 à 255 Avec signe : -128 1 Byte
à +127

SMALLINT Un nombre entier faible Sans signe : 0 à 65.535 Avec signe : - 2 Bytes
32.768 à +32.767

MEDIUMINT Un nombre entier moyen Sans signe : 0 à 16.777.215 Avec signe 3 Bytes
: -8.388.608 à +8.388.607

INT/INTEGER Un nombre entier de taille Sans signe : 0 à 4.294.967.295 Avec 4 Bytes


normale signe : -2.147.483.648 à
+2.147.483.647

BIGINT Un nombre entier élevé Sans signe : 0 à 8 Bytes


18.446.744.073.709.551.615 Avec
signe : -9.223.372.036.854.775.808 à
+9.223.372.036.854.775.807

FLOAT Un nombre à virgule flottante Sans signe : 0 à 3,4e+38 Avec signe : - 4 Bytes
à précision simple 3,4e+38 à 3,4e+38

12
Besoin
de
Type Description Valeur mémoire

DOUBLE Un nombre à virgule flottante Sans signe : 0 à 3,4e+38 Avec signe : - 8 Bytes
avec double précision 3,4e+38 à 3,4e+38

DATE Date au format 'YYYY-MM-DD' '1000-01-01' à '9999-12-31' 3 Bytes

TIME Indication de l’heure au '-838:59:59.999999' à 3 Bytes


format 'HH:MM:SS.ssssss' '838:59:59.999999'

DATETIME Date au format 'YYYY-MM-DD Indique la date et l’heure (jusqu’à 8 Bytes


HH:MM:SS.ssssss' 23:59:59.999999 heures)

TIMESTAMP Horodatage au format 'YYYY- '1970-01-01 00:00:01' (UTC) à '2038- 4 Bytes


MM-DD HH:MM:DD' 01-19 05:14:07' (UTC)

YEAR Année entre 1901 et 2155 1901 à 2155 et 0000 1 Byte

CHAR Chaîne de caractères à pour M: 0 à 255 caractères M Byte


longueur fixe ; nombre de
caractères correspondant à M

VARCHAR Chaîne de caractères à pour M: 0 à 65.535 caractères Max. M +


longueur variable ; nombre de 2 Bytes
caractères correspondant à M

TINYTEXT Très petite chaîne de pour M: 0 à 255 caractères M+1


caractères à longueur variable Byte
; nombre de caractères
correspondant à M

TEXT Chaîne de caractères à pour M: 0 à 65.535 caractères M+2


longueur variable ; nombre de Bytes
caractères correspondant à M

MEDIUMTEXT Chaînes de caractères de taille pour M: 0 à 16.777.215 caractères M+3


moyenne ; nombre de Bytes
caractères correspondant à M

LONGTEXT Longue chaîne de caractères à Pour M: 0 à 4.294.967.295 caractères M + 4


longueur variable, nombre de (4 GB) Bytes
caractères correspondant à M

13
Besoin
de
Type Description Valeur mémoire

BLOB Un BLOB (Binary Large Object) Longueur max : 65.535 Bytes M+2
est un objet binaire avec des Bytes
données à longueur variable
(des images ou fichiers audio
par exemple)

TINYBLOB Petit objet binaire avec des Longueur max M: 255 Bytes M+1
données à longueur variable Byte

MEDIUMBLOB Objet binaire moyen avec des Longueur Max M : 16.777.215 Bytes M+3
données à longueur variable Bytes

LONGBLOB Objet binaire grand avec des Longueur max : 4.294.967.295 Bytes M+4
données à longueur variable (4 GB). Bytes

ENUM Un objet de chaîne dont les Max. 65,535 différents éléments au 1 ou 2


(énumération) valeurs admissibles sont plus Bytes,
définies lors de la création de selon le
la colonne nombre
de valeurs
possibles

SET Un objet de chaîne dont les Maximum de 64 différentes valeurs 1, 2, 3, 4,


valeurs admissibles sont ou 8, en
définies lors de la création du fonction
tableau. Possibilité de du
sélection multiple. nombre
de valeurs
possibles

Nous avons par exemple choisi les paramètres suivants pour le tableau « users » :
Les valeurs possibles pour la colonne ID ont été définies comme étant des nombres entiers
(nombre entier, INT) et portent l’attribut UNSIGNED. L’ID ne peut ainsi accepter que des
chiffres aux valeurs positives. Nous avons sélectionné le réglage PRIMARY pour ce qui est de
l’Index. Le numéro d’identification fonctionne donc comme une clé primaire pour le tableau
utilisateurs. Décocher la case a_i (AUTO_INCREMENT) signale au système de gestion de base
de données que les IDs doivent être générés automatiquement pour chaque entrée sous
forme de nombres consécutifs. Les valeurs des colonnes prénom, nom, email et mot de
passe ont été définies comme type de données VARCHAR. Il s’agit de chaînes de caractères
variables, dont la longueur (M) est limitée à 50 caractères avec l’option « Length/Value ».
14
L’option index UNIQUE est aussi activée pour la colonne email. Vous vous assurez ainsi que
toutes les adresses email ne soient enregistrées qu’une seule fois dans votre tableau.
Pour les colonnes created_at et updated_at, nous avons choisi le type de données
TIMESTAMP. Le système de gestion de base de données stocke les données temporelles lors
de la création et de l’actualisation de paquets au format AAAA-MM-JJ HH:MM:SS. Etant
donné que le système génère automatiquement un horodatage pour chaque nouvelle
entrée, nous choisissons pour la colonne created_at la valeur standard
CURRENT_TIMESTAMP par défaut. La colonne updated_at n’est pertinente que si nous
mettons à jour les entrées. Les valeurs nulles sont permises pour cette colonne, dotées de
la valeur standard NULL par défaut.
Fait
la valeur NULL représente une entrée vide avec PHP. Un champ de données possède la valeur
NULL si aucune valeur n’a été attribuée.

Exemple du tableau « users » selon le formatage


Le format de tableau standard InnoBD est utilisé en tant que machine de stockage avec
MySQL.
Tous les paramètres de tableaux que vous entrez via l’interface utilisateur graphique sont
traduits par phpMyAdmin dans le code SQL. Vous pouvez les consulter via le bouton
« aperçu SQL ».

15
CREATE TABLE test.users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
forename VARCHAR(50) NOT NULL ,
surname VARCHAR(50) NOT NULL ,
email VARCHAR(50) NOT NULL ,
password VARCHAR(50) NOT NULL ,
created_at TIMESTAMP NOT NULL DEFAULT
CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT NULL ,
PRIMARY KEY (id),
UNIQUE (email))
ENGINE = InnoDB;

Vous trouverez une description détaillée de la syntaxe SQL dans le chapitre sur les requêtes
de bases de données.
Enregistrez vos paramètres en cliquant sur « save ». Le tableau utilisateurs s’affiche dans le
panneau de navigation sous la base de données de test.
Gérer des tableaux
Pour gérer un tableau créé, cliquez sur le nom du tableau dans le panneau de navigation.
phpMyAdmin vous affiche sur l’onglet « Browse » un aperçu du tableau respectif avec les
données enregistrées. Dans le cas de notre tableau exemple, la requête livre un résultat vide.
Il n’y a pas encore de paquets de données dans le tableau users.

L’onglet « Browse » affiche un aperçu des données enregistrées dans le tableau


Différents onglets sont à votre disposition dans la barre de menu pour la gestion de tableaux
de données. Si vous souhaitez modifier la structure d’un tableau de données, choisissez
l’onglet « structure ». Vous pouvez ajouter de nouveaux paquets au tableau via l’onglet
« Insert » (Insertion). PhpMyAdmin permet par ailleurs de parcourir des tableaux, de gérer
les autorisations ou encore d’importer ou exporter des paquets ou autres tableaux.

16
Modifier la structure de tableaux
Si vous souhaitez compléter votre tableau en incluant des colonnes supplémentaires,
modifier ou supprimer des colonnes existantes, rendez-vous sur l’onglet « Structure ».
Complétez des colonnes via le bouton « Add columns », en spécifiant le nombre souhaité de
nouvelles colonnes et leur position respective.
Une nouvelle colonne est ajoutée selon updated_at dans l’exemple suivant :

Décidez du nombre de colonnes à ajouter avec le bouton « add columns »


Si vous voulez supprimer des colonnes existantes, sélectionnez-les en cochant la case
correspondante et cliquez sur « Drop ».

Colonnes sélectionnées pouvant être supprimées ou modifiées selon votre souhait


La modification d’une colonne se fait via le bouton « modifier ». Il affiche une interface
similaire à celui de la création de tableaux :

17
Les colonnes sélectionnées sont traitées via un point de vue différent
Les modifications apportées à la structure du tableau peuvent conduire à la perte de
données dans certaines circonstances. Avant de traiter ou supprimer des colonnes de
tableaux déjà existantes, vous devriez dans tous les cas effectuer une sauvegarde de votre
base de données. Rendez-vous pour cela sur l’onglet « Export », choisissez le format de
données de votre choix pour la sauvegarde et confirmez en appuyant sur « Go ». Une fenêtre
s’ouvre, dans laquelle votre navigateur Web interroge l’espace de stockage cible pour le
téléchargement. Une alternative à la sauvegarde de bases de données via phpMyAdmin est
le programme de sauvegarde gratuit MySQLDumper.
Créer des entrées de tableaux
Pour remplir votre tableau avec phpMyAdmin avec des données, vous avez deux possibilités :
soit vous importez les paquets depuis un fichier externe (comme une sauvegarde par
exemple), soit vous créez les entrées du tableau manuellement. Pour ce faire, choisissez le
tableau exemple utilisateurs (users) et naviguez sur l’onglet « insert ».
phpMyAdmin vous affiche maintenant l’écran de saisie de données suivant :

18
Créer des entrées de tableaux via phpMyAdmin sur l’onglet « Insert »
Les colonnes définies pour le tableau utilisateurs sont listées sous « Column ». Vous
trouverez sous « Type » les informations sur le type de données pour les colonnes
respectives, ainsi que la limite de caractères entre parenthèses. Nous mettons
volontairement la partie « Function » entre parenthèses et passons directement à « Value ».
Dans ce domaine, on définit les valeurs pour certaines colonnes de notre tableau exemple.
Dans le chapitre précédent, nous avons configuré le tableau utilisateurs (users) de telle sorte
que les champs de données pour les colonnes ID, created_at et updated_at soient
automatiquement dotés de contenu par le système de gestion de base de données. Dans la
colonne ID nous attribuons via AUTO_INCREMENT un numéro d’identification pour chaque
nouvelle entrée en cours. Le champ created_at est automatiquement rempli via l’horodatage
actuel. Le système attribue ensuite pour updated_at la valeur par défaut NULL. Nous ne
devons ainsi que saisir les données pour les
colonnes forename, surname, email et password manuellement. Nous illustrons ceci avec
des données utilisateurs fictifs :
• Forename : John
• Surname : Doe
• Email : john@doe.com
• Password : qwertz

19
Ajoutez les données à l’écran de saisie de données et confirmez avec « Go »
Cliquez sur « Go » pour transférer les données vers votre tableau. PhpMyAdmin passe
automatiquement à l’onglet « SQL » et indique l’opération de base de données effectuée en
tant que déclaration selon la syntaxe SQL :
INSERT INTO users (id, forename, surname, email, password, created_at, updated_at)
VALUES (NULL, 'John', 'Doe', 'john@doe.com', 'qwertz', CURRENT_TIMESTAMP,
NULL);

PhpMyAdmin vous donne des relevés pour chaque opération de base de données

20
En principe, toutes les opérations de bases de données peuvent être réalisées
confortablement via phpMyAdmin sur une interface graphique, mais aussi dans le langage de
base de données SQL. Ceci fait partie des procédures standard de développement Web.
Ces requêtes SQL se trouvent dans le code source de toutes les applications Web
dynamiques et permettent au serveur Web d’interagir avec la base de données. Le langage
de base de données SQL repose sur des commandes dont le but est par exemple de
récupérer des données et de les utiliser dans le cadre de l‘exécution du programme. Nous
abordons dans le chapitre suivant de notre tutoriel MySQL les principales commandes SQL, à
savoir SELECT, INSERT, DELETE et UPDATE ainsi que la syntaxe des opérations de bases de
données fondamentales.
Mais d’abord, remplissons notre tableau utilisateurs (users) avec d’autres données
utilisateurs et regardons la vue d’ensemble du tableau dans l’onglet « Browse » (Parcourir) :

Toutes les entrées du tableau sont triées selon la clé primaire dans l’aperçu de l’onglet «
Browse ».
Un clic sur le nom de la colonne respective trie le tableau dans l’ordre souhaité.
Etablir la connexion de base de données
Maintenant que nous avons rempli notre tableau exemple utilisateurs avec des entrées, nous
examinerons dans les chapitres suivants comment les données stockées via PHP peuvent
être consultées en utilisant un serveur Web Apache.
Il est pour cela demandé dès la première étape d’établir une connexion de base de données.
Trois interfaces sont disponibles : MySQL Extension, MySQL Improved Extension (MySQLi) et
PHP Data Objects (PDO).

21
• MySQL-Extension : MySQL-Extension est une interface MySQL qui était très
populaire, mais maintenant considérée comme obsolète. En comparaison avec
MySQLi et PDO, MySQL-Extension présente l’inconvénient qu’il ne supporte pas
les Prepared Statements , ni les paramètres désignés.
• MySQLi : MySQLi est une version améliorée de l’extension classique PHP pour l’accès
à des bases de données MySQL. L’interface fonctionne aussi bien de manière orientée
objet que de manière procédurale. L’utilisation est limitée aux bases de données
MySQL et MariaDB.
• PDO : PHP Data Objects (PDO) est une interface orientée vers l’objet qui fournit un
niveau abstrait pour l’accès aux données. Ainsi, les bases de données MySQL, mais
aussi d’autres systèmes tels que PostgreSQL, Oracle, MSSQL ou SQLite peuvent être
intégrés à PHP.
Nous nous limiterons par la suite aux connexions à la base de données via PDO.
Pour effectuer une demande avec une base de données dans le cadre d’un script PHP, il doit
d’abord être authentifié. Une connexion à la base de données par l’intermédiaire de PDO se
fait en utilisant la ligne de code suivante :
<?php
$pdo = new PDO('DSN', 'username', 'password');
?>

Il est recommandé d’ajouter ceci au début de chaque script contenant des opérations de
base de données.
Nous utilisons le mot de passe PHP new pour créer une instance de la classe de base PDO.
Son constructeur attend trois paramètres de base. Le Data Source Name (DSN) ainsi qu’un
nom d’utilisateur et un mot de passe pour la base de données. Le DSN comprend dans notre
cas les paramètres suivants :
• Pilote de base de données PDO : mysql
• Serveur de base de données (host=) : localhost
• nom de base de données (dbname=) : test
• Paquet (charset=): utf8
Si vous n’avez pas défini de données d’accès pour votre base de données, utiliser le nom
d’utilisateur root ainsi qu’un mot de passe vide :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
?>

La connexion à la base de données est stockée dans la variable $pdo. Cela vous permet
d’établir la connexion dans les dernières étapes du code du programme.
22
Si une connexion à la base de données a été établie, vous pouvez envoyer un certain nombre
de requêtes à la base de données via le script de code. Terminez le script pour interrompre la
connexion à la base de données.

Requêtes de données avec SELECT, INSERT, UPDATE et DELETE


Afin de récupérer les données de notre base de données, nous recourons au langage de base
de données SQL. Ce dernier est sémantiquement similaire à la langue anglaise et reste
délibérément simple. La syntaxe SQL est par ailleurs explicite.
Dans SQL, on travaille avec ce qu’on appelle Statements, autrement dit extractions ou
demandes.
Un SELECT-Query simple se compose par exemple des éléments suivants :
SELECT colonne FROM tableau;

Définissez tout d’abord la commande SQL SELECT puis les colonnes et tableaux respectifs, sur
lesquels la commande doit fonctionner. Un point-virgule conclut ce Statement.
Vous avez également la possibilité d’étendre la déclaration (Statement) à une condition
facultative telle qu’un tri ou un regroupement :
SELECT colonne FROM tableau WHERE condition
ORDER BY données dans un ordre de tri;

Les commandes SQL sont conventionnellement en lettres majuscules, tandis que les bases de
données, tableaux et autres sont en minuscule. Cela s’explique uniquement pour des raisons
de lisibilité. SQL en principe un langage sans format et ne fait donc pas de distinction entre
les majuscules et les minuscules.
Si vous utilisez des noms de tableaux et de colonnes qui comportent déjà des mots-clés
prédéfinis (ce qui n’est pas recommandé), placez ces derniers entre guillemets.
Nous illustrons la syntaxe des SQL-Statements simples avec comme exemples les
commandes SELECT, INSERT, UPDATE et DELETE.
SELECT
Utilisez la commande SELECT pour récupérer les séries de données sélectionnées (rangées)
d’un nombre quelconque de tableaux. Si vous souhaitez par exemple utiliser les prénoms et
noms ainsi que les adresses email de tous les utilisateurs dans le tableau exemple créé
auparavant, créez un fichier PHP text.php dans le dossier htdocs de votre environnement
XAMPP et ajoutez le script suivant :

23
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT forename, surname, email FROM users";
foreach ($pdo->query($sql) as $row) {
echo $row['forename'] . " " . $row['surname'] . "<br />";
echo "E-Mail: " . $row['email'] . "<br /><br />";
}
?>

L’exemple de code se lit de la manière suivante : tout d’abord, nous commençons le script
avec la balise PHP-Start <?php. Dans la ligne deux, nous nous connectons à notre base de
données de test sur l’hébergeur local et nous la stockons dans la variable $pdo. Le Statement
SQL avec la commande SELECT se trouve sur la ligne trois. Ici, le système de gestion de base
de données indique de charger les colonnes forename, surname et email depuis le
tableau utilisateurs (users). Nous enregistrons ce Statement dans la variable $sql.
Les lignes 4 à 7 affichent une boucle foreach. Cela nous donne la possibilité de parcourir tout
tableau, par exemple, de passer par une structure de données progressivement. Nous
définissons entre parenthèses derrière la construction foreach les séries du tableau à itérer
et la façon dont les données demandées sont sauvegardées :
$pdo->query($sql) as $row

La variable $pdo porte sur la base de données désirée sur la ligne 2 de la connexion définie.
Nous l’envoyons avec la fonction query() de la variable $sql du Statement SQL.
Le serveur Web récupère ainsi les colonnes forename, surname et email du tableau
utilisateur depuis la base de données test et passe chaque ligne du tableau en
boucle foreach. Lorsque les données passées en revue sont stockées, le mot-clé PHP définit
la série variable $row.
Lors du premier passage de la boucle Foreach, le tableau apparaîtrait comme tel :
$row = array (
forename => John,
surname => Doe,
email => john@doe.com
)

24
Nous passons en revue chaque ligne du tableau utilisateurs individuellement, lisons les
données stockées pour les colonnes définies dans le Statement SQL et les faisons passer sur
le navigateur Web.

La fenêtre du navigateur affiche le résultat de l’exécution du script


Si toutes les colonnes d’un tableau de données sont passées en revue, utilisez un astérisque
(*) comme valeur de code dans le Statement SQL.

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT * FROM users";
foreach ($pdo->query($sql) as $row) {
echo $row['forename'] . " " . $row['surname'] . "<br />";
echo "E-Mail: " . $row['email'] . "<br />";
echo "Created at: " . $row['created_at'] . "<br /><br />";
}
?>

25
Nous avons ainsi la possibilité d’utiliser toutes les données stockées dans le
tableau utilisateurs (users) dans le cadre du script. On peut observer sur la capture d’écran ci-
dessous l’ajout d’un horodatage :

Lecture de texte incluant un horodatage sur navigateur


Dans les deux exemples précédents, le serveur Web nous donne des données utilisateur
dans l’ordre dans lequel nous avons entré les différents utilisateurs dans le tableau (avec l’ID
correspondante). Si vous souhaitez afficher des données triées, définissez un ordre à l’aide
du mot-clé SQL ORDER BY. Les données sont ainsi triées par ordre alphabétique dans
l’exemple ci-dessous :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT forename, surname, email FROM users ORDER BY forename";
foreach ($pdo->query($sql) as $row) {
echo $row['forename'] . " " . $row['surname'] . "<br />";
echo "E-Mail: " . $row['email'] . "<br /><br />";
}
?>

26
Avec ORDER BY vous pouvez effectuer les tris de votre choix pour vos données
INSERT
La création d’entrées de bases de données se fait rarement manuellement via phpMyAdmin.
En règle générale, les données sont écrites dans le cadre de l’exécution du script à partir du
serveur Web de la base de données : si un internaute remplit par exemple un formulaire en
ligne sur un site Web ou s’il laisse un commentaire sur une boutique en ligne. Dans les deux
cas, la commande SQL INSERT est utilisée en arrière-plan. Le statement SQL avec la
commande INSERT sera créé selon le schéma suivant.
INSERT INTO tableau (colonne1, colonne2, colonne3) VALUES (valeur1,
valeur2, valeur3);

Cela se lit comme suit : chargement du tableau et ajout des valeurs 1, 2 et 3 aux tableaux 1, 2
et 3.
Un script PHP simple pour ajouter un autre paquet à notre tableau utilisateurs
(users) pourrait ressembler à ceci :
<?php

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');

$sql = "INSERT INTO users (forename, surname, email, password)

VALUES ('Paddy', 'Irish', 'paddy@irish.com', 'qaywsx')";

if ($pdo->exec($sql) === 1)

echo "New record created successfully";

?>

27
Nous établissons tout d’abord la connexion à la base de données et enregistrons cette
dernière dans la variable $pdo. Nous définissons ensuite le Statement SQL et l’enregistrons
dans la variable $sql. Sur la ligne 5, nous utilisons la flèche (->) pour accéder à la
variable $pdo et exécuter le Statement SQL enregistré dans $sql à l’aide de la fonction exec().
Pour s’assurer que le script ajoute un paquet dans le tableau utilisateurs (users), nous
vérifions le nombre de lignes concernées à l’aide de la condition if. Cela garantit que le String
New Record a été créé avec succès et affiché via le navigateur Web, lorsque le nombre de
paquets ajouté est égal à 1. Si le script est à nouveau exécuté, le message est manquant. On
évite par ailleurs les doublons en définissant la valeur email avec l’attribut UNIQUE.

Ajoutez de nouveaux paquets de données à votre tableau à l’aide de la commande SQL


INSERT
Nous chargeons l’aperçu de notre tableau exemple utilisateurs dans la base de données test,
et observons que le tableau a été étendu avec un cinquième paquet. Le numéro
d’identification ainsi que l’horodatage sont ajoutés automatiquement comme prévu.

28
Un aperçu actualisé de votre tableau de données peut être chargé si besoin via phpMyAdmin
(les nouvelles données sont marquées en rouge)
UPDATE
Pour mettre à jour une des données existantes, utilisez la commande SQL UPDATE selon le
schéma suivant :
UPDATE tableau SET colonne1 = valeur1, colonne2 = valeur2
WHERE colonne3 = valeur3;

En d’autres termes, ce Statement-SQL signifie : sélectionnez le tableau spécifié et remplacez


la valeur colonne1 par valeur1 et la valeur dans la colonne2 par la valeur2 si la colonne3
contient la valeur3. Attention à ne pas oublier que la condition MySQL remplace les champs
concernés dans tous les dossiers.
Nous avons donc à faire avec un Statement SQL qui relie une opération de base de données à
une condition. Appliqué à notre tableau exemple, l’adresse email de l’utilisateur John Doe
pourrait être actualisée avec le script suivant :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "UPDATE users
SET email = 'john.doe@example.com', updated_at = NOW() WHERE id = 1";
if ($pdo->exec($sql) === 1)
echo "Update successful";
?>

29
Nous définissons dans le Statement SQL que la valeur actuelle dans la colonne email doit
être remplacée par la nouvelle valeur john.doe@exemple.com, dans la mesure où la
colonne ID contient la valeur 1. Nous ne modifions ainsi que le paquet de données avec la clé
primaire 1. De plus, nous mettons à jour la valeur pour la colonne updated_at dans le même
SQL-Statement à l’aide de la fonction MySQL now(), qui indique l’horodatage actuel.
L’instruction SQL est exécutée comme précédemment avec la ligne de code $pdo-
>exec($sql) dans le cadre d’une condition if.

SQL-Statement avec commande UPDATE et la fonction TIMESTAMP NOW()


Si la mise à jour est un succès, phpMyAdmin devrait afficher le tableau actualisé dans l’onglet
« Browse » :

30
La fonction NOW () remplace le champ de données avec l’horodatage actuel updated_at (les
données actualisées sont marquées en rouge)
Dans cet exemple nous avons actualisé l’adresse email et remplacé la valeur standard NULL
dans la colonne updated_at par un horodatage. La commande UPDATE permet par ailleurs
de transférer des valeurs d’une colonne à l’autre. Cette opération peut par exemple être
utilisée lorsqu’on veut élargir le tableau utilisateurs avec la colonne email_registration. Cela
nous donne la possibilité de faire la distinction entre les deux adresses email : celle utilisée
lors de l’enregistrement, et celle de contact actuelle, qui peut changer au fil du temps.
Cependant, les deux adresses sont initialement les mêmes, afin que les valeurs d’un champ
puissent être transmises à l’autre. Nous ajoutons pour ce faire les nouvelles
colonnes email_registration avec phpMyAdmin via « Add columns » dans l’onglet
« Structure » :

Ajoutez de nouvelles colonnes de tableau là où vous le souhaitez via Add columns dans
l’onglet structure.
Pour transmettre les valeurs, nous utilisons le Statement UPDATE suivant :
UPDATE users SET email_registration = email

Etant donné que nous voulons mettre à jour tous les paquets de données, nous ne formulons
pas de condition de mise à jour.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "UPDATE users SET email_registration = email";
$affected = $pdo->exec($sql);
echo "$affected rows updated<br>";
?>

31
Si le script est exécuté via le serveur Web, le système de gestion de base de données
transmet les valeurs de la colonne à tous les paquets de données dans la colonne
email_registration.

Le script transmet toutes les valeurs de la colonne email dans la colonne email-registration et
indique le nombre de colonnes concernées au navigateur Web.
DELETE

L’adresse email des paquets de données choisies a été copiée de la colonne email vers
email_registration
Les saisies sur une base de données peuvent être supprimées avec la commande
SQL DELETE. Vous pouvez utiliser cette dernière selon le schéma suivant :
DELETE FROM tableau WHERE colonne = wert

32
Si vous travaillez avec des IDs dans votre base de données, il faut s’identifier pour pouvoir
supprimer des données. Si vous souhaitez supprimer la saisie 5 de notre tableau exemple,
cela se fait comme ceci :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "DELETE FROM users WHERE id = 5";
$affected = $pdo->exec($sql);
echo "$affected rows updated<br>";
?>

La commande SQL DELETE efface toujours une ligne entière d’une base de données. Pour
supprimer uniquement les valeurs spécifiées dans une colonne, il faut effectuer l’instruction
SQL correspondante. Avec UPDATE tableau SET colonne = NULL WHERE, vous pouvez
attribuer la valeur NULL à une colonne, à condition bien sûr que vous ayez permis la
valeur NULL pour cette colonne.
Prepared Statements
Avec PDO, vous pouvez mettre en œuvre des opérations de bases de données en tant
que Prepared Statements. Ces pré-instructions sont maintenant pratique courante dans le
développement Web et sont prises en charge par tous les systèmes de gestion de bases de
données modernes.
Dans les exemples précédents, nous avons entré les valeurs des paramètres directement
dans l’instruction SQL (SQL Statement). Les Prepared Statements au contraire fonctionnent
avec des espaces libres, qui vont être remplis avec des valeurs par la suite. Cela permet au
système de gestion de base de données de vérifier la validité des paramètres avant leur mise
en place. Les instructions préparées, à condition qu’elles soient mises en œuvre de manière
cohérente dans le code source, sont une protection efficace contre des injections SQL. Dans
ce modèle d’attaque, les cybercriminels créent ou modifient des commandes SQL afin
d’accéder à des données sensibles, écraser des données ou ajouter leurs propres
commandes au système.
Les injections SQL sont basées sur des failles de sécurité bien connues en relation avec les
bases de données SQL : si les saisies utilisateur sont effectuées avec des paramètres
statiques via $_GET par exemple, cela donne l’occasion aux cybercriminels d’enrichir leur
intrusion avec des métadonnées pouvant conduire à des effets indésirables si elles entrent
sans masquage dans le SQL-Interpreter. Ces intrusions peuvent être efficacement empêchées
avec des prepared Statements. Ces derniers agissent en tant que modèles pour les
commandes SQL transmises séparément des paramètres réels de la base de données. Ils
valident les données transférées, masquent les caractères méta automatiquement et
ajoutent des paramètres à la place des champs libres dans le Statement SQL.
Les Prepared Statements proposent l’avantage de la performance en dehors des aspects
relatifs à la sécurité. Cela se confirme lorsque la même commande SQL est exécutée en

33
boucle avec des paramètres différents. Une fois le Prepared Statement analysé, il est placé
dans le système de base de données et doit seulement y être exécuté avec de nouveaux
paramètres. Les requêtes les plus complexes peuvent ainsi être sensiblement accélérées.
Les Prepared Statements sont mis en place dans PDO à l’aide de la fonction prepare(). Ceci
prépare une déclaration pour l’exécution et renvoie un objet de ce statement. Le point
d’interrogation (?) ou bien un paramètre nommé par vous-même (Named Parameter) est
affiché pour caractériser les champs vides.
Prepared Statements avec des paramètres sans intitulé
L’exemple de code suivant affiche l’opération de base de données INSERT en tant que
Prepared Statement avec des paramètres sans intitulé :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');

// prepare SQL statement


$statement = $pdo->prepare("INSERT INTO users (forename, surname, email,
password)
VALUES (?, ?, ?, ?)");

// bind parameter
$statement ->bindParam(1, $forename);
$statement ->bindParam(2, $surname);
$statement ->bindParam(3, $email);
$statement ->bindParam(4, $password);

// insert data sets


$forename = "Anders";
$surname = "Andersen";
$email = "anders@andersen.com";
$password = "mnbvc";
if ($statement->execute())
echo "New record $forename created successfully<br>";

$forename = "Matti";
$surname = "Meikäläinen";
$email = "matti@meikäläinen.com";
$password = "jhgfd";

// display status
if ($statement->execute())
echo "New record $forename created successfully<br>";
?>

Nous créons tout d’abord un objet de Statement à l’aide de la fonction prepare() pour la
requête souhaitée et nous l’enregistrons dans la série $statement. Le point d’interrogation
apparaît au niveau de l’espace vide plutôt que des valeurs de paramètres concrètes.

34
Si le statement SQL ne comporte que des champs libres, les valeurs doivent être transmises
séparément dans le code ci-dessous. C’est là que la fonction PHP bindParam() entre en
scène. Nous utilisons l’opération « flèche » (->) pour accéder à la méthode de L’objet du
statement ainsi que pour lui attribuer des variables (1 correspond à la première question, 2 à
la deuxième, etc.).
Le template SQL ainsi créé peut maintenant être exécuté arbitrairement avec les paramètres
souhaités. Dans cet exemple, nous définissons des valeurs variables pour deux paquets de
données. L’exécution des pré-instructions SQL s’effectue via execute() pour chaque paquet de
données.

Prepared Statements dotés de paramètres avec intitulés


Les paramètres dotés d’intitulés sont plus clairs que des points d’interrogation sur des
champs libres. Ce sont des espaces réservés personnalisés que vous pouvez nommer au
besoin selon le schéma suivant :
:example

Les paramètres dotés d’intitulés ne doivent pas comporter d’espace ou de traits d’union (-).
Utilisez au lieu de cela des tirets bas (_).
L’exemple suivant montre l’opération de base de données INSERT comme une pré-instruction
avec des paramètres dotés d’intitulés :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');

// prepare SQL statement


$statement = $pdo->prepare("INSERT INTO users (forename, surname, email,
password)
VALUES (:forename, :surname, :email, :password)");

// bind parameter
$statement ->bindParam(':forename', $forename);
$statement ->bindParam(':surname', $surname);
$statement ->bindParam(':email', $email);
$statement ->bindParam(':password', $password);

// insert data sets


$forename = "Anders";
$surname = "Andersen";
$email = "anders@andersen.com";
$password = "mnbvc";

if ($statement->execute())
echo "New record $forename created successfully<br>";

$forename = "Matti";

35
$surname = "Meikäläinen";
$email = "matti@meikäläinen.com";
$password = "jhgfd";
$statement->execute();

// display status
if ($statement->execute())
echo "New record $forename created successfully<br>";
?>

Dans le Prepared Statement vous trouverez des paramètres avec intitulé tels
que :forename, :surname, :email et :password. Nous relions ces derniers aux
variables $forename, $surname, $email et $password via bindParam(). Dans cet exemple
nous avons nommé aussi bien les paramètres que les variables des noms de colonnes du
tableau correspondant. Cela n’est pas dicté par la syntaxe. Cependant, une appellation
cohérente et uniforme est recommandée pour des questions de lisibilité du code.
L’affectation des valeurs variables ainsi que l’exécution de l’instruction SQL se fait par
analogie de la même manière que l’exemple précédent.
Fonctions de date et d’heure dans MySQL
MySQL et MariaDB soutiennent diverses fonctions pour travailler avec les dates et heures. En
voici une liste complète. Nous nous limitons à une sélection dans notre tutoriel MySQL pour
débutants.

Fonctions de date et
heure Description

CURRENT_TIMESTAMP() / Vous connaissez déjà la fonction NOW() de notre exemple de


NOW() commande SQL UPDATE. Il s’agit ici seulement d’un synonyme de la
fonction CURRENT_TIMESTAMP() qui donne la date actuelle ainsi que
l’heure dans le cadre d’une opération de base de données.

CURDATE() / La fonction CURDATE() vous donne la date actuelle.


CURRENT_DATE()

CURTIME() / La fonction CURTIME() vous donne l’heure actuelle.


CURRENT_TIME()

DAY() / DAYOFMONTH() Vous donne le jour et le mois (0-31) ; vous avez besoin d’une date ou
d’un Timestamp (horodatage) comme argument.

DAYOFWEEK() Vous donne le jour et la semaine (1=dimanche) ; vous avez besoin de la


date ou d’un Timestamp (horodatage) comme argument.

36
Fonctions de date et
heure Description

MONTH() Vous donne le mois (1-12) ; nécessite une date ou un timestamp


comme argument.

YEAR() Donne un numéro d’année (1000-9999, 0) ; nécessite une date ou un


Timestamp comme argument.

DATE() Extrait la date d’une indication de date ou d’heure ; exige une date ou
un horodatage comme argument.

TIME() Extrait l’heure d’une heure ou d’une date définie ; exige une date ou un
horodatage comme argument.

DATE_FORMAT() Formate une indication d’heure ou de date selon les paramètres


renseignés ; nécessite une date ou un horodatage comme argument.

Un scénario d’application possible pour des fonctions de date et d’heure dans MySQL est par
exemple des requêtes de bases de données avec lesquelles tous les paquets de données qui
ont été créés un jour précis doivent être lus.
Le script suivant nous donne tous les paquets de données qui ont été créés dans notre
exemple de tableau :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT forename, surname, email FROM users WHERE DATE(created_at) =
CURDATE()";
foreach ($pdo->query($sql) as $row) {
echo $row['forename'] . " " . $row['surname'] . "<br />";
echo "E-Mail: " . $row['email'] . "<br /><br />";
}
?>

Afin de limiter la sortie des éléments à ceux créés aujourd’hui, on utilise l’instruction SQL
suivante (condition) :
DATE(created_at) = CURDATE()

37
On extrait tout d’abord la date de la colonne où est placé l‘horodatage (created_at) à l’aide
de la fonction DATE(), puis on actualise cette date lors de l’étape suivante. La commande
SELECT sélectionne uniquement les entrées dont l’horodatage correspond à la date actuelle.
Sinon, il est aussi possible de sélectionner l’entrée qui a été mise à jour le 16/12/2016. Il faut
pour cela adapter la condition de notre SQL Statement :
SELECT forename, surname, email FROM users WHERE DATE(updated_at) = '2016-12-
16'

Dans ce cas, la date extraite de l‘horodatage est ajustée avec une date cible spécifique. De
plus, vous pouvez limiter des requêtes sur une année donnée, un mois, ou une journée
précise.
Le Statement suivant s’applique à toutes les entrées des utilisateurs du tableau qui ont été
ajoutés en décembre :
SELECT forename, surname, email FROM users WHERE month(created_at) = 12";

En dehors du signe égal (=), MySQL prend aussi en charge les opérations de conditions
suivantes :

Opération de comparaison description

= équivalent

< Plus petit que

> Plus grand que

<= Inférieur ou égal

>= Supérieur ou égal

!= différent

Plusieurs autres opérations peuvent être liées à des opérations de logique :

Opération de logique Description

OR ou || ou

AND ou && et

38
L’instruction suivante sélectionne par exemple toutes les entrées qui ont été créées après
février et avant avril :
SELECT forename, surname, email FROM users WHERE MONTH(created_at) > 2 AND
MONTH(created_at) < 4";

Jusqu’ici, les informations de dates et heures sont stockées dans notre base de données au
format spécifié. Celles-ci ne sont pas déterminées avec MySQL et MariaDB. La
fonction DATE_FORMAT() vous donne la possibilité, de formater les dates et heures avec des
paramètres optionnels selon vos souhaits.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT forename, surname, DATE_FORMAT(created_at,'%D %M %Y') AS
created_at FROM users WHERE id=1";
foreach ($pdo->query($sql) as $row) {
echo $row['forename'] . " " . $row['surname'] . " your profile was created at: " .
$row['created_at'] . ".<br /><br />";
}
?>

Le tableau suivant montre les paramètres possibles pour la fonction DATE_FORMAT() selon la
documentation MySQL.

Zone de
Paramètre Description valeurs/exemples

%c Indication numérique du mois avec 1 ou 2 chiffres 0 à 12

%d Indication numérique du jour du mois avec deux chiffres 00 à 31

%e Indication numérique du jour dans le mois avec un ou deux 0 à 31


chiffres

%H Affichage de l’heure à deux chiffres 00 à 23

%i Indication numérique des minutes avec deux chiffres 00 à 59

%j Indication numérique du jour avec un ou deux chiffres 001 à 366

%k Indication numérique de l’heure avec un ou deux chiffres 0 à 23

%M Nom du mois avec les paramètres régionaux en vigueur Janvier, Février,


Mars, etc.

39
Zone de
Paramètre Description valeurs/exemples

%m Indication numérique du mois avec deux chiffres 00 à 12

%s Affichage numérique des secondes avec deux chiffres 00 à 59

%T Heure au format 24 heures (forme raccourcie de '%H:%i:%S') HH:MM:SS

%u Numéro de la semaine dans l’année, commence par lundi 00 à 53

%W Nom du jour de la semaine dans le schéma en vigueur Lundi, Mardi etc.

%w Jour de la semaine 0 = dimanche, 6 =


samedi

%Y Année avec quatre chiffres 2016 par ex.

%y Nombre d’années avec deux chiffres 16 par ex.

Rapports d’erreurs MySQL


Si un script ne fonctionne pas comme désiré, cela est généralement dû à des erreurs de
syntaxe dans le code source ou bien à des tableaux, colonnes et variables mal nommées.
Toutefois, le serveur de base de données n’affiche pas toujours un message d’erreur dans ce
cas. L’absence du résultat souhaité n’est en effet souvent pas accompagnée d’un tel rapport
d’erreur.
PDO fournit donc une nouvelle fonctionalité avec errorInfo(), avec laquelle des rapports
d’erreurs détaillés des dernières opérations de bases de données peuvent être chargés : par
exemple en les délivrant via le navigateur Web.
Dans le script suivant servant à l’actualisation de l’adresse email, la fonction errorinfo() est
combinée avec une boucle if. La seule condition est l’exécution correcte du Statement SQL.
S’il est exécuté sans erreur, le serveur Web délivre un message de mise à jour réussie. Dans le
cas contraire, le code ci-dessous reste en cours d’exécution.
Dans l’exemple actuel, nous informons l’utilisateur qu’une erreur SQL s’est produite et qu’elle
concerne le SQL Statement. De plus amples informations sont par ailleurs communiquées
avec errorinfo() :

40
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$statement = $pdo -> prepare("UPDATE user SET password = :password, updated_at
= NOW() WHERE id = 1");
$statement ->bindParam(':password', $password);
$password = "YXDli_89%s";
if ($statement ->execute()){
echo "Update successful";
} else {
echo "SQL Error <br />";
echo $statement->queryString."<br />";
echo $statement->errorInfo()[2];
}
?>

Si nous lançons le script via le serveur Web, nous recevons les informations suivantes :
SQL Error
UPDATE user SET password = :password, updated_at = NOW() WHERE id = 1
Table 'test.user' doesn't exist

La commande SQL UPDATE fait référence à un tableau portant le nom utilisateur (user). Nous
avons cependant nommé notre tableau exemple utilisateurs (users). Le serveur SQL ne peut
pas trouver le tableau demandé et fait apparaître le message Table 'test.user' doesn't exist.
La cause de cette erreur est donc seulement une faute de frappe dans le SQL statement, qui
peut être rapidement résolue.
La fonction errorinfo() renvoie des valeurs sous la forme d’une série composée de trois
éléments :
[0] = Code d’erreur SQL
[1] = Code d’erreur relatif au pilote
[2] = Message d’erreur relatif au pilote
Définissez via la saisie des éléments souhaités entre crochets quelles informations délivrer
via errorInfo().

41
Livraison d’un message d’erreur via le navigateur Web
Dans la pratique, les informations détaillées sur les erreurs sont rarement émises via le
navigateur Web. Les utilisateurs finaux peuvent généralement faire peu de choses avec ces
informations. Les cybercriminels potentiels cependant, utilisent parfois des messages
d’erreur pour suivre les requêtes SQL et identifier les points faibles d’une application. Il est
par conséquent recommandé d’informer les utilisateurs sur les cas d’erreurs et se stocker
leurs informations relatives à ces erreurs en interne. En pratique, cela donne ceci :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$statement = $pdo->prepare("UPDATE user SET password = :password, updated_at =
NOW() WHERE id = 1");
$statement->bindParam(':password', $password);
$password = "YXDli_89%s";
if ($statement->execute()) {
echo "Update successful";
} else {
echo "Une erreur est malheureusement survenue lors de l’actualisation de votre mot
de passe. Veuillez contacter notre administrateur à l’adresse suivante :
admin@website.fr.";
$error = DATE("Y-m-d H:i:s") . " - " . __FILE__ . " - " . $statement->queryString . " - " .
$statement->errorInfo()[2] . " \r\n";
file_put_contents("sqlerrors.log", $error, FILE_APPEND);
}
?>
Au lieu de la valeur renvoyée de la fonction errorinfo() par écho dans le navigateur Web,
nous stockons cette dernière avec l’horodatage actuel ainsi qu’avec le chemin vers le fichier
et le Statement SQL concerné dans la variable $error.

42
La fonction PHP DATE() indique l’horodatage Unix dans le format spécifié. La soi-disant
constante magique _FILE_ nous donne le chemin complet vers le fichier test.php. Le SQL
statement actuel est chargé comme dans l’exemple précédent via $statement->queryString.
Par la suite les données stockées dans $error à l’aide de la
fonction file_put_contents() comme texte du fichier sqlerrors.log dans le dossier htdocs.

Vous trouverez les informations d’erreurs dans le fichier sqlerrors.log


JOIN
Comme mentionné dans le chapitre sur les bases de données relationnelles, nous pouvons
interroger les données de plusieurs tableaux simultanément. Une fois familiarisé avec les
opérations basiques de bases de données, nous vous démontrons comment relier différents
tableaux de votre base de données (Join en anglais).
La fusion des tableaux dans une requête se fait en utilisant la commande SQL JOIN. Dans ce
cas, deux (ou plus) tableaux normalisés sont reliés via des colonnes communes. Ceci peut
être réalisé par l’intermédiaire de clés étrangères.
Nous démontrons cette liaison entre les tableaux de base de données avec l’exemple
suivant :

Le tableau présente une sélection de nos chansons préférées des années 1960 et est destiné
à servir d’exemple négatif d’une mauvaise conception de base de données.
À première vue, notez que le tableau a de nombreux champs de données redondants. Nous
supprimons ces dernières en répartissant les données dans le cadre d’une normalisation
dans des tableaux séparés et reliés à l’aide de clés étrangères.

43
Formes normales
Une conception de base de données réussie se caractérise par un minimum de redondance.
La normalisation de tableaux de données permet d’éviter de dupliquer les entrées. Trois
formes normales se sont établies dans le cadre des modèles de bases de données
relationnelles pour que vous puissiez mettre en place des règles pour une structuration
optimale des données.

1. forme normale
Un tableau correspond à la première forme normale si toutes les valeurs d’attributs sont
atomiques. Les valeurs d’attributs sont considérées comme atomiques si elles ne
contiennent que des informations. Nous illustrons cela plus cela plus clairement avec un
exemple négatif.
Intéressons-nous par exemple les colonnes album_title et interpret du tableau album. Au lieu
d’exécuter chaque information contenue dans le tableau dans une colonne séparée, nous
avons inscrit les informations sur l’année de l’album entre parenthèses après le titre de
l’album ou déclaration de l’artiste. Cela ne s’utilise que lorsque nous voulons interroger tous
les titres par exemple, qui ont été publiés dans une année donnée.
Nous vous recommandons de créer des tableaux de données toujours selon les règles de la
première forme normale. Pour notre exemple, le tableau se présente de la manière suivante
:

Toutes les données sont maintenant séparées et donc facilement lisibles. Cependant, notre
tableau contient encore des redondances. Découvrez comment surmonter ces dernières
dans les prochaines étapes.

44
2. forme normale
Un tableau correspond à la deuxième forme normale lorsque toutes les conditions de la
première forme normale sont remplies et que chaque attribut non clé est pleinement
dépendant de l’ensemble de la clé primaire du tableau.
Les tableaux de données ne contiennent souvent qu’une seule colonne, faisant office de clé
primaire. Les tableaux de ce type sont automatiquement réglés sur la deuxième forme
normale, si les conditions de la première forme normale sont remplies. Il arrive cependant
parfois que la clé primaire d’un tableau découle de deux colonnes. C’est le cas dans notre
tableau exemple.
Pour charger le titre souhaité de la colonne titre du tableau, nous avons besoin
d’un album_id mais aussi du numéro de titre de la colonne track. Le titre Sympathy for the
Devil peut par exemple être chargé via la clé primaire album_ID = 3 et track = 1. Nous avons
donc affaire à une clé primaire composite. Ce dernier n’est cependant que nécessaire pour
les requêtes liées à la colonne title. Les colonnes album_title, released,
interpret et years_active sont exclusivement dépendantes d’album_id. Il n’y a donc pas de
dépendance fonctionnelle pour ces deux colonnes avec l’ensemble de la clé primaire. Les
conditions de la deuxième forme normale ne sont pas remplies.
Cela peut être modifié en stockant la colonne title dans un nouveau tableau et en la reliant à
une clé étrangère (album_id) avec le tableau de sortie.

45
Le tableau retravaillé album comporte seulement une clé primaire d’une seule pièce et
remplit donc automatiquement les conditions pour la deuxième forme normale. Le nouveau
tableau title ne comprend que le titre de la colonne non-clé. Ce dernier est dépendant
(fonctionnellement) des deux parties des clés primaires (album_id und track) et correspond
donc à la deuxième forme normale.
Mais des entrées redondantes sont présentes dans la deuxième forme normale de notre
tableau de données album.

3. forme normale
Un tableau de la troisième forme normale se conforme à toutes les conditions de la
deuxième forme normale, et donc aussi de la première forme normale. De plus, il ne doit pas
y avoir d’attribut non-clé en dépendance transitive. Cette condition peut sembler
compliquée, mais peut être expliquée en quelques mots : une dépendance transitive existe
toujours quand un attribut non-clé dépend d’un autre attribut non-clé. De plus, un attribut
non-clé ne doit pas être en dépendance transitive avec un attribut clé.
C’est exactement ce qui s’applique à notre tableau exemple album. Vous y trouverez les
colonnes interpret et years_active. Tandis que l’interprète peut être déterminé
par album_id, l’indication de l’année de la bande existante dépend transitivement
de album_id. Cela présente l’inconvénient que le système de gestion de base de données
stocke automatiquement une valeur redondante dans la colonne years_active à chaque fois
qu’un nouvel album d’un artiste est entré.
Afin de remplir les conditions de la troisième forme normale et ainsi retirer toutes les
redondances de notre tableau, nous devons aussi stocker la
colonne interpret incluant years_active dans un tableau séparé et le relier avec un tableau de
sortie album via une clé étrangère (interpret_id).
Nous obtenons ainsi trois tableaux normalisés : interpret, album et title.

46
Si nous voulons maintenant distribuer un titre précis incluant les informations de l’album
ainsi que de l’interprète, nous devons relier les trois tableaux séparés à l’aide de la
commande SQL JOIN et de la clé étrangère respective.
Définir une clé étrangère via phpMyAdmin
Dans la mesure où vous avez choisi InnoDB comme moteur de base de données, définissez
des relations de clés étrangères via l’interface graphique de votre programme
d’administration phpMyAdmin. La clé primaire d’un tableau peut ici être mise en œuvre
comme clé étrangère d’un certain nombre d’autres tableaux.
Dans notre exemple, nous avons besoin de deux connexions pour relier les trois tableaux
normalisés album, interpret et title :
• Nous utilisons comme première connexion la clé primaire album_id du
tableau album en tant que clé étrangère dans le tableau title.
• Nous utilisons pour la deuxième connexion la clé primaire interpret_id du
tableau interpret en tant que clé étrangère dans le tableau album.
Les relations des clés étrangères peuvent être illustrées par le graphique suivant :

47
Les tableaux normalisés album, title et interpret, reliés par des clés étrangères
Ceci vaut pour la liaison de tableaux de données : une colonne, qui agira comme une clé
étrangère, doit être fournie avec les attributs ou un index unique.
La relation entre clé primaire et clé étrangère correspond en général au type de relation 1:n.
Chaque champ de données dans la colonne de clé primaire du tableau A se trouve avec un
nombre quelconque (n) de champs de saisie dans la colonne de clé étrangère du tableau B.
Cependant, chaque champ de données dans la colonne de clé étrangère du tableau B se
réfère toujours à un seul champ de données dans la colonne de clé primaire du tableau A.
Nous avons par exemple quatre entrées dans la colonne de clé primaire album_id du
tableau, qui sont reliées via des clés étrangères title.album_id avec huit entrées du
tableau title.

48
Clé primaire et clé étrangère se trouvent dans une relation 1:n
Pour mettre en place les liens souhaités, nous avons placé les
tableaux album, interpret et title dans phpMyAdmin et nous avons défini nos clés primaires
dans le cadre de la création de tableau comme décrit dans l’option « Index ». Faites
également attention au fait que les colonnes qui font ensuite office de clés étrangères sont
également marquées via l’option Index en tant que INDEX ou UNIQUE. Seul INDEX s’avère
adapté pour les relations 1:n car les valeurs dans le champ UNIQUE ne doivent pas être
répétées par la suite.
Nous définissons lors de l’étape suivante la clé étrangère. Démontrons ceci avec l’exemple du
tableau album. Nous sélectionnons pour cela le tableau dans le panneau de navigation et
chargeons l’onglet structure depuis la barre de menu. C’est ici que se trouve le bouton
« Relation View » (aperçu des relations) :

Le bouton Relation view de l‘onglet « Structure » (marqué en rouge)

49
Les relations de clés étrangères sont définies dans l’aperçu des relations d’un tableau de
données via le champ de saisie « Foreign key constraints » :

Les relations de clés étrangères sont définies dans le masque de saisie « Foreign key
contraints »
La colonne Interpret_id du tableau album doit faire office de clé étrangère, qui repose sur la
clé primaire interpret_id du tableau interpret.

Sous « Foreign key constraint (INNODB) «, vous définissez à quelles clés primaires les clés
étrangères font référence
Nous sélectionnons par conséquent le menu déroulant sous « Column » la
colonne interpret_id en tant que clé étrangère. Notez que seules les colonnes qui ont été
marquées comme INDEX, UNIQUE ou PRIMARY sont répertoriées. Dans le champ de saisie en
trois partie « Foreign key constraint (InnoDB) », nous choisissons quelle clé primaire de quel
tableau repose sur quelle base de données de notre clé étrangère. Nous avons fait les choix
suivants :
Base de données : test
Tableau : interpret
Clé primaire : interpret_id
Le champ « Constraint name » peut rester vide. Le système de gestion de base de données
attribue automatiquement un nom à cet endroit. Vous devez cependant définir, comment un
tableau avec une clé étrangère se comporte lorsque la clé étrangère sous-jacente à la clé
primaire est modifiée ou supprimée.
Si un artiste par exemple est supprimé du tableau-parent Interpret, la clé primaire également
associée disparait. Il s’agit ainsi de clarifier ce qu’il peut se produire avec les entrées qui se
rapportent à cette entrée via clé étrangère : les albums d’un artiste, dans notre exemple.
Pour déterminer le comportement d’un tableau avec une clé étrangère en cas
d’un UPDATE ou DELETE, quatre options sont à votre disposition sur MySQL ou MariaDB.
• RESTRICT: l’option RESTRICT comprend un changement dans le tableau-parent, dans
la mesure où d’autres tableaux existants y font référence. Dans notre cas, un paquet

50
de données dans le tableau interpret ne peut être supprimé, car les paquets de
données du tableau album y sont reliés.
• CASCADE : l’option CASCADE assure qu’un changement de tableau-parent sera
transmis dans tous les autres tableaux se référant à ce tableau-parent. Si nous
déplaçons par exemple l’interpret_id de The Rolling Stones de 2 à 8, ce changement
se reflète dans l’option Foreign-Key CASCADE, ainsi que dans tous les tableaux qui
utilisent interpret_id comme clé étrangère. Si une entrée dans un tableau-parent est
supprimée, cela signifie que tous les paquets de données reliés à cette entrée dans
d’autres tableaux seront supprimés. Attention : de cette façon, la suppression d’une
seule entrée peut entraîner la disparition de nombreux paquets de données.
• SET NULL : sélectionnez l’option SET NULL pour que la valeur dans la colonne de clé
étrangère soit placée sur NULL, dès que la clé primaire est modifiée ou supprimée
dans le tableau-parent.
• NO ACTION : l’option MySQL NO ACTION est équivalente à l’option RESTRICT.
Si vous avez défini l’option souhaitée pour la relation de clé étrangère, vous pouvez
confirmer la saisie en cliquant sur « enregistrer ». Le système de gestion de base de données
attribue automatiquement un nom pour la relation nouvellement créée.

Toutes les relations de clés étrangères définies sont répertoriées sous « Foreign key
constraints » dans l’onglet « Structure »
Types de JOIN-Typen dans MySQL et MariaDB
Les relations de clés étrangères vous permettent des données de différents tableaux
simultanément, et ce seulement à l’aide d’une instruction SQL. Vous avez pour cela quatre
types de JOIN à disposition sur MySQL et MariaDB :
• INNER JOIN : avec un INNER JOIN, le système de gestion de base de données cherche
des entrées communes dans les tableaux joints par JOIN. Seuls les paquets de
données comportant des matchs, disons, dans lesquels les valeurs correspondent aux
colonnes de liaison (clé primaire et clé étrangère) dans les deux tableaux.
• OUTER JOIN : avec un OUTER JOIN, on différencie des tableaux de gauche ainsi que
des tableaux de droite. A la différence d’un INNER JOIN, non seulement les paquets
de données comportant des similitudes dans les deux tableaux sont entrés, mais
aussi tous les paquets de données restants du tableau de droite ou de gauche.

51
• LEFT JOIN : tous les paquets de données du tableau de gauche sont entrés ainsi que
tous les paquets de données du tableau de droite dans lesquels se trouvent des
concordances.
• RIGHT JOIN : tous les paquets de données du tableau de droite sont entrés ainsi que
tous les paquets de données du tableau de gauche dans lesquels se trouvent des
concordances.
Nous nous limiterons à INNER JOIN dans le cadre de notre tutoriel MySQL pour débutants.
La syntaxe d’un INNER JOIN suit le schéma de base suivant :
SELECT * FROM tableau1
INNER JOIN tableau2 ON tableau1.cléétrangère = tableau2.cléprimaire
WHERE colonne = valeur

La commande SQL SELECT, en combinaison avec le bouton *, indique au système de gestion


de base de données de sélectionner les valeurs de toutes les colonnes pour lesquelles les
conditions ON et WHERE sont en vigueur.
Etant donné qu’il s’agit d’un INNER JOIN, seuls les paquets de données qui présentent des
concordances entre la clé étrangère du tableau1 et la clé primaire du tableau2 sont extraits
de la base de données. On peut par ailleurs définir une fonction facultative de filtre à l’aide
de la clause WHERE.
Nous illustrons ceci avec un exemple faisant référence à nos tableaux
normalisés album, interpret et title :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT * FROM album
INNER JOIN interpret ON album.interpret_id = interpret.interpret_id";
foreach ($pdo->query($sql) as $row) {
echo $row['album_title'] . " was released by " . $row['interpret'] . " in " .
$row['released'] . ".<br /><br />";
}
?>

Le script exemple montre un INNER JOIN dans lequel le tableau album est relié au
tableau interpret. Nous lisons seulement les paquets de données avec lesquels il y a des
concordances entre clé primaire et clé étrangère.
album.interpret_id = interpret.interpret_id

Dans notre tableau de données, choisir entre LEFT et RIGHT JOIN n’entraînerait pas de
différence. Nous entrons alors les valeurs lues à l’aide d’une boucle foreach et la construction
de langue echo dans le navigateur.
52
L’exemple de script nous donne tous les albums stockés dans la base de données, incluant les
artistes et l’année de la première publication
Dans le cadre d’une instruction SQL, nous avons ainsi sélectionné l’indication de l’artiste du
tableau interpret et les données des titres des albums ainsi que la date de première
publication du tableau album.
La condition dans la clause WHERE permet de déterminer quels paquets de données
distribuer. Si nous voulons nous limiter aux albums publiés en 1968 seulement, nous
pouvons utiliser le script suivant :
<?php

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');

$sql = "SELECT * FROM album

INNER JOIN interpret ON album.interpret_id = interpret.interpret_id WHERE released =

1968";

foreach ($pdo->query($sql) as $row) {

echo $row['album_title'] . " was released by " . $row['interpret'] . " in " .

$row['released'] . ".<br /><br />";

?>

53
La condition WHERE released = 1968 limite les sorties à un album dans le navigateur. Beggars
Banquet des Rolling Stones est le seul album de notre base de données qui a été publié en
1968.

Avec la condition dans la clause WHERE, nous limitons la distribution à un paquet de


données
A l’aide de la commande JOIN, vous pouvez fusionner un certain nombre de tableaux en une
jonction de données. Dans l’exemple suivant, nous relions le tableau album avec le
tableau interpret et title via INNER JOIN afin de délivrer l’ensemble des informations sur les
données stockées dans les bases de données de chansons.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT * FROM album
INNER JOIN interpret ON album.interpret_id = interpret.interpret_id
INNER JOIN title ON album.album_id = title.album_id";
foreach ($pdo->query($sql) as $row) {
echo $row['title'] . " was released by " . $row['interpret'] . " as Track " . $row['track'] .
" on " . $row['album_title'] . " in " . $row['released'] . ".<br /><br />";
}
?>

54
Reliez des tableaux de données selon vos souhaits avec la commande SQL JOIN
Les clauses WHERE peuvent ici aussi être définies selon le besoin avec une fonction de filtre :
si nous souhaitons uniquement récolter seulement les informations de la 7ème piste sur
l’album « Abbey Road » par exemple.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sql = "SELECT * FROM album
INNER JOIN interpret ON album.interpret_id = interpret.interpret_id
INNER JOIN title ON album.album_id = title.album_id WHERE track = 7 AND
album_title = 'Abbey Road'";
foreach ($pdo->query($sql) as $row) {
echo $row['title'] . " was released by " . $row['interpret'] . " as Track " . $row['track'] .
" on " . $row['album_title'] . " in " . $row['released'] . ".<br /><br />";
}
?>

55
INNER JOIN avec deux conditions analogiques AND
Notez que nous devons effectuer ceci avec une clé primaire en plusieurs parties sur le
tableau title. Si nous voulons faire référence à un titre particulier, nous avons besoins, en
dehors du numéro de piste, de l’album_id, qui est stocké avec le titre de l’album dans le
tableau album.

56

Vous aimerez peut-être aussi