Dans cette nouvelle leçon, nous allons voir comment insérer une ou plusieurs entrées dans une table et allons également comprendre l’intérêt de préparer ses requêtes SQL et voir comment faire cela.
Insérer des données dans une table
Pour insérer des données dans une table, nous allons cette fois-ci utiliser l’instruction SQL INSERT INTO
suivie du nom de la table dans laquelle on souhaite insérer une nouvelle entrée avec sa structure puis le mot clef VALUES
avec les différentes valeurs à insérer.
Concrètement, la structure de la requête SQL va être la suivante :
INSERT INTO nom_de_table (nom_colonne1, nom_colonne2, nom_colonne3, …)
VALUES (valeur1, valeur2, valeur3, …)
Il y a cependant quelques règles de syntaxe à respecter afin que cette requête fonctionne :
- Les valeurs de type chaine de caractère (String) doivent être placées entre apostrophes ;
- La valeur NULL ne doit pas être placée entre apostrophes ;
- Les valeurs de type numérique ne doivent pas être placées entre apostrophes.
AUTO_INCREMENT
ou TIMESTAMP
ni leurs valeurs associées puisque par définition MySQL stockera automatiquement les valeurs courantes.Reprenons par exemple notre table « Clients » créée dans la leçon précédente. Cette table possède neuf colonnes dont une colonne Id avec un attribut AUTO_INCREMENT et une colonne DateInscription qui possède un attribut TIMESTAMP.
Essayons d’insérer une première entrée dans cette table en utilisant PHP et PDO :
<!DOCTYPE html> <html> <head> <title>Cours PHP / MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Bases de données MySQL</h1> <?php $servname = 'localhost'; $dbname = 'pdodb'; $user = 'root'; $pass = 'root'; try{ $dbco = new PDO("mysql:host=$servname;dbname=$dbname", $user, $pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO Clients(Nom,Prenom,Adresse,Ville,Codepostal,Pays,Mail) VALUES('Giraud','Pierre','Quai d\'Europe','Toulon',83000,'France','pierre.giraud@edhec.com')"; $dbco->exec($sql); echo 'Entrée ajoutée dans la table'; } catch(PDOException $e){ echo "Erreur : " . $e->getMessage(); } ?> </body> </html>
Ici, on insère dans notre table Clients une entrée. Pour cela, on utilise INSERT INTO
et on précise le nom des colonnes pour lesquelles on doit renseigner une valeur : Nom, Prénom, Adresse, Ville, Codepostal, Pays et Mail.
Ensuite, dans la même requête SQL, on transmet les valeurs relatives à ces colonnes. Le reste du script est très classique (connexion à la base de données, exécution de notre requête SQL et gestion des exceptions).
Notez une nouvelle fois que nous n’avons pas à préciser nos colonnes Id et DateInscription ni les valeurs relatives à ces colonnes puisque celles-ci possèdent respectivement un AUTO_INCREMENT et un TIMESTAMP. Le MySQL mettra donc à jour les valeurs automatiquement par lui-même.
Une fois notre code exécuté, nous pouvons aller voir notre table dans phpMyAdmin pour voir si l’entrée a bien été ajoutée comme on le désirait.
Insérer plusieurs entrées dans une table
Nous allons pouvoir insérer plusieurs entrées d’un coup dans une table de différentes façons en PDO.
Nous allons déjà tout simplement pouvoir réutiliser l’écriture précédente en la répétant plusieurs fois.
<!DOCTYPE html> <html> <head> <title>Cours PHP / MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Bases de données MySQL</h1> <?php $servname = 'localhost'; $dbname = 'pdodb'; $user = 'root'; $pass = 'root'; try{ $dbco = new PDO("mysql:host=$servname;dbname=$dbname", $user, $pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql1 = "INSERT INTO Clients(Nom,Prenom,Adresse,Ville,Codepostal,Pays,Mail) VALUES('Durand','Victor','Rue des Acacias','Brest',29200,'France','v.durand@gmail.com')"; $dbco->exec($sql1); $sql2 = "INSERT INTO Clients(Nom,Prenom,Adresse,Ville,Codepostal,Pays,Mail) VALUES('Julia','Joly','Rue du Hameau','Lyon',69001,'France','july@gmail.com')"; $dbco->exec($sql2); echo 'Entrées ajoutées dans la table'; } catch(PDOException $e){ echo "Erreur : " . $e->getMessage(); } ?> </body> </html>
L’un des gros défauts de cette méthode est que s’il y a un problème d’exécution en cours du script, certaines entrées vont être insérées et pas d’autres et certaines entrées pourraient ne pas avoir toutes leurs données insérées.
Pour éviter cela, nous pouvons ajouter les méthodes beginTransaction()
, commit()
et rollBack()
dans notre code.
La méthode beginTransaction()
permet de démarrer ce qu’on appelle une transaction et de désactiver le mode autocommit
. Concrètement, cela signifie que toutes les manipulations faites sur la base de données ne seront pas appliquées tant qu’on ne mettra pas fin à la transaction en appelant commit()
.
La méthode commit()
sert donc à valider une transaction, c’est-à-dire à valider l’application d’une ou d’un ensemble de requêtes SQL. Cette méthode va aussi replacer la connexion en mode autocommit
.
La méthode rollBack()
sert à annuler une transaction si l’on s’aperçoit d’une erreur. Cette méthode restaure le mode autocommit
après son exécution.
<!DOCTYPE html> <html> <head> <title>Cours PHP / MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Bases de données MySQL</h1> <?php $servname = 'localhost'; $dbname = 'pdodb'; $user = 'root'; $pass = 'root'; try{ $dbco = new PDO("mysql:host=$servname;dbname=$dbname", $user, $pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbco->beginTransaction(); $sql1 = "INSERT INTO Clients(Nom,Prenom,Adresse,Ville,Codepostal,Pays,Mail) VALUES('Doe','John','Rue des Lys','Nantes',44000,'France','j.doe@gmail.com')"; $dbco->exec($sql1); $sql2 = "INSERT INTO Clients(Nom,Prenom,Adresse,Ville,Codepostal,Pays,Mail) VALUES('Dupont','Jean','Bvd Original','Bordeaux',33000,'France','jd@gmail.com')"; $dbco->exec($sql2); $dbco->commit(); echo 'Entrées ajoutées dans la table'; } catch(PDOException $e){ $dbco->rollBack(); echo "Erreur : " . $e->getMessage(); } ?> </body> </html>
Dans le code ci-dessus, on commence par désactiver l’autocommit
avec beginTransaction()
.
Si aucune erreur n’est détectée, la méthode commit()
s’exécute après nos requêtes SQL, valide donc les transactions et replace la connexion en mode autocommit
.
Note : Ici, les deux dernières entrées dans ma table possèdent les id 6 et 7 et non pas 4 et 5 tout simplement car j’ai effectué un petit test entre temps et que j’ai supprimé les deux lignes portant les id 4 et 5 que j’avais inséré durant ce test.
Si en revanche une exception est lancée, alors la méthode rollBack()
s’exécute et annule toutes les transactions avant de restaurer le mode autocommit
.
Par exemple, si je tente de ré-exécuter mon code en modifiant la valeur « mail » de la première entrée mais pas celle de la seconde, une erreur va être lancée car j’ai une contrainte UNIQUE
sur le champ Mail de ma table. La méthode rollBack()
va donc s’exécuter et aucune transaction ne va être validée.
<!DOCTYPE html> <html> <head> <title>Cours PHP / MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Bases de données MySQL</h1> <?php $servname = 'localhost'; $dbname = 'pdodb'; $user = 'root'; $pass = 'root'; try{ $dbco = new PDO("mysql:host=$servname;dbname=$dbname", $user, $pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbco->beginTransaction(); $sql1 = "INSERT INTO Clients(Nom,Prenom,Adresse,Ville,Codepostal,Pays,Mail) VALUES('Doe','John','Rue des Lys','Nantes',44000,'France','mod@gmail.com')"; $dbco->exec($sql1); $sql2 = "INSERT INTO Clients(Nom,Prenom,Adresse,Ville,Codepostal,Pays,Mail) VALUES('Dupont','Jean','Bvd Original','Bordeaux',33000,'France','jd@gmail.com')"; $dbco->exec($sql2); $dbco->commit(); echo 'Entrées ajoutées dans la table'; } catch(PDOException $e){ $dbco->rollBack(); echo "Erreur : " . $e->getMessage(); } ?> </body> </html>
Cette deuxième façon de procéder est déjà meilleure que la première. Cependant, en pratique, nous utiliserons plutôt les requêtes préparées pour insérer plusieurs entrées d’un coup dans nos tables, notamment lorsque les données seront fournies par les utilisateurs.