Insérer des données dans une table MySQL

Une fois notre base de données et nos premières tables créées, nous allons pouvoir commencer à insérer des données dans ces dernières.

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.
A priori, vous devriez avoir autant de valeurs à insérer qu’il y a de colonnes dans votre table. Cependant, notez qu’il n’est pas nécessaire de préciser les colonnes possédant un attribut 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>

 

On utilise insert into pour insérer une entrée dans la base de données avec PDO en PHP

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.

On insère une entrée dans la base de données avec insert into et PDO en PHP

 

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>

 

On utilise insert into plusieurs fois pour insérer plusieurs entrées dans la base de données avec PDO en PHP

On insère plusieurs entrées dans la base de données avec insert into et PDO en PHP

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>

 

Utilisation de begintransaction et de commit avec PDO en PHP pour initier une transaction

On utilise la méthode commit pour engager une transaction en PHP PDO

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>

 

On utilise la méthode rollback pour annuler une transaction en PDO PHP

Utilisation de la méthode rollback avec PDO en PHP

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.

Laisser un commentaire