Ecrire des données avec PDO

Écrire des données avec PDO

  1. Objectifs

    • Utiliser PDO de PHP, pour manipuler des données insérer, modifier et supprimer les données d’une base de données
  2. Présentation

    • Nous avons vu dans la section précédente que l’on pouvait facilement récupérer des informations de notre base de données en utilisant le PDO.
    • Dans cette section on va voir comment ajouter, modifier et supprimer des données. Pour cela, nous allons aborder de nouvelles requêtes SQL fondamentales et qu’il vous faut connaître :INSERT,UPDATE et DELETE.
    • Dans ce tutoriel, vous allez créer et mettre en place la base de données pour votre site “gestion des apprenants“.
    • Le schéma de la base de données est la suivante:
    • Ecrire des données avec PDO

      Afficher la solution

      Télécharger la base


  3. Insertion des données

    • Création d’un formulaire HTML
      • Le formulaire HTML est l’outil privilégié pour saisir des données et les envoyer vers le serveur PHP/MySQL.
      • La méthode du formulaire "post" est privilégié, car elle permet de ne pas rendre visible les données à l’utilisateur par l’URL
    • Requête SQL
      • Pour ajouter un enregistrement à une base de donnée, vous aurez besoin de connaître la requête SQL INSERT INTO.
      • Il est possible d’écrire l’instruction INSERT INTO de deux manières.
        • La première méthode spécifie à la fois les noms des colonnes et les valeurs à insérer:
          • INSERT INTO nom_de_la_table (colonne1, colonne2, colonne3, ...)
            VALUES (valeur1, valeur2, valeur3, ...);
        • Pour ajouter des valeurs à toutes les colonnes de la table, vous n’avez pas besoin de spécifier les noms de colonne dans la requête SQL. Cependant, assurez-vous que l’ordre des valeurs est dans le même ordre que les colonnes du tableau. La syntaxe INSERT INTO serait la suivante:
          • INSERT INTO nom_de_la_table
            VALUES (valeur1, valeur2, valeur3, ...);
      • Syntaxe d’insertion alternative (propre à MySQL) :
        • INSERT INTO nom_de_la_table set colonne1=valeur1, colonne2=valeur2, colonne3=valeur3, ...;



    • Traitement PHP
      • Appeler le fichier de connexion.php crée dans la section précédente
      • Vérifier l’existence des saisies obligatoires correspondant aux variables $_POST[‘variable01’], $_POST[‘variable02’] ….
      • Cette fois, au lieu de faire appel à la fonction query()(que l’on utilisait dans la section précédente pour récupérer des données), on va utiliser cette fois ci la fonction exec() qui est prévue pour exécuter des modifications sur la base de données
      • L’insertion de données variables se réalise grâce à une requête préparée pour plus d’information concernant les requêtes préparées lire l’article suivant
      • Seule la commande SQL INSERT distingue cette opération de celle de lecture de données. Le script de l’exemple suivant réalise ce type d’insertion en récupérant les données saisies par l’utilisateur dans un formulaire lors d’un ajout d’un apprenant à la table apprenants.
      • Requête INSERT avec des espaces réservés de position

          Ecrire des données avec PDO

        • Vous n’avez pas à vérifier le résultat de execute()(comme il est souvent montré dans les didacticiels de mauvaise qualité). Une telle condition n’aura aucun sens, car en cas d’erreur, une exception PDOException sera lancée et l’exécution du script sera terminée, ce qui signifie qu’une telle condition n’atteindra jamais la partie else .
        • Aucun opérateur try ... catch ne doit être utilisé, sauf si vous disposez d’un scénario spécifique pour gérer l’erreur, tel qu’une annulation de transaction illustrée ci-dessous. Veuillez consulter l’article sur les rapports d’erreurs pour plus de détails.

        Requête INSERT avec des espaces réservés nommés

          Ecrire des données avec PDO

          Vous n’avez pas à vérifier le résultat de execute(). Car en cas d’erreur, une exception PDOException sera lancée et l’exécution du script sera terminée, ce qui signifie qu’une telle condition n’atteindra jamais la condition else.
          L’opérateur try ... catch ne doit être utilisé.

      • Enchaîner execute () pour prepare ()
        • Pour les deux méthodes vous pouvez enchainer execute() et prepare() comme suit:
        • Ecrire des données avec PDO

    • Contrôler les champs mot de passe
      • Pour plus d’information consulter l’article :Contrôler les champs mot de passe
      • Avant d’envoyer les données au serveur les deux champs mot de passe et réécriture de mot de passe doivent être égaux.
      • L’utilisateur doit être averti du fiabilité de mot de passe selon les conditions suivantes:
        • Un mot de passe est correcte s’il contient:
          • Au moins 1 caractère majuscule.
          • Au moins 1 caractère minuscule.
          • Au moins 1 chiffre.
          • Au moins 1 caractère spécial.
          • Minimum 10 caractères.
      • Le mot de passe doit être crypté
      • Vous l’aurez compris, stocker un mot de passe en clair est une faute grave et ne se justifie jamais. Votre mot de passe est une donnée ultrasensible et ne doit être connu que de vous.

    • Formulaire de saisie
    • Ecrire-des-donnees-avec-PDO-1

      Afficher la solution

      Partie HTML :

       <div class="container">
      
          <div class="card " style="border-width: 1px;">
              <div class="card-header bg-primary text-white">
                  <h5>Ajouter un apprenant</h5>
              </div>
              <div class="card-body ">
                  
                
      <form class="row g-3"  method="post" action="#" id="formAjoutApprenant" onsubmit="return validate()">
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-credit-card-2-front"></i></span>
          <input type="text" class="form-control" name="txtCIN" placeholder="Veuillez saisir votre numéro CIN">
      </div>
        </div>
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-person"></i></span>
            <input type="text" class="form-control" name="txtPrenom" placeholder="Veuillez saisir votre Prénom">
          </div>
        </div>
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-person-circle"></i></span>
          <input type="text" class="form-control" name="txtNom" placeholder="Veuillez saisir votre nom de famille">
      </div>
        </div>
        
        <div class="col-2"><div class="input-group">
            <span class="input-group-text"><i class="bi-alarm"></i></span>
          <input type="date" class="form-control" name="dteNaissance">
        </div> 
        </div>
        <div class="col-md-2"> 
        
        <div class="btn-group">
      
      <label class="btn btn-cyan btn-rounded active form-check-label">
        <input class="form-check-input" type="radio" name="rdbCivilite" value="1">
         <i class="bi bi-gender-male"></i> H
      </label>
      
      <label class="btn btn-cyan btn-rounded form-check-label">
        <input class="form-check-input" type="radio"  name="rdbCivilite" value="2">
        <i class="bi bi-gender-female"></i> F
      </label>
      </div>
        </div>
        <div class="col-8 ">
          <div class="input-group">
            <span class="input-group-text"><i class="bi bi-bank2"></i></span>
            <input type="text" class="form-control" name="txtAdresse" placeholder="Veuillez saisir votre adresse personnelle">
          </div>
        </div>
      
        <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-at"></i></span>
          <input type="email" class="form-control" name="txtAdresseMail" placeholder="Veuillez saisir votre adresse e-mail">
        </div>
      </div>
        <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-flag"></i></span>
          <select name="lstGouvernorat" class="form-select">
            <option selected>Veuillez choisir votre gouvernorat</option>
            <?php
              foreach($gouvListe as $row) {
                $ligne = htmlentities($row[1], ENT_QUOTES,'iso-8859-1'); 
                echo "<option value='$row[0]'>$ligne</option>\n";
              }
            ?>
          </select>
        </div>
      </div>
      <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-people-fill"></i></span>
          <select name="lstGroupe" class="form-select">
            <option selected>Veuillez saisir votre groupe</option>
            <?php
              foreach($groupListe as $row) {
                $lignegroup = htmlentities($row[1], ENT_QUOTES,'iso-8859-1'); 
                echo "<option value='$row[0]'>$lignegroup</option>\n";
              }
            ?>
          </select>
        </div>
         </div>
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-person-badge"></i></span>
          <input type="text" class="form-control" name="txtUser" placeholder="Veuillez saisir votre identifiant">
        </div>
      </div>
        <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-unlock"></i></span>
          <input type="password" class="form-control" id="txtpwd" name="txtpwd" placeholder="Veuillez saisir votre mot de passe">
        </div></div>
         <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-unlock"></i></span>
          <input type="password" class="form-control" id="txtpwd2" name="txtpwd2" placeholder="Veuillez retaper votre mot de passe">
        </div>
         </div>
        <div class="col-12">
          <div class="row">
              <div class="col-md-8 justify-content-end">
                <span id="msg"></span>
              </div>
              <div class="col-md-4 justify-content-end">
                <button type="submit" name="btnAjoutApprenants" class="btn btn-primary float-end " "><i class="bi bi-archive"></i><span style="padding-left: 10px;">Ajouter un apprenant</span></button>
            </div>
        </div>
        </div>
      </form>
      
          </div>
      </div>
      </div>
      

      Partie PHP :

       <?php 
      include('header.php');
      if(isset($_POST['btnAjoutApprenants'])){
       try {
          $sql = "INSERT INTO apprenants 
          (cinapprenant, prenom, nom, datenaissance, 
          civilite, adresse, adressmail, cdegouvernorat, 
          cdegroupe, pwd, cdeuser) VALUES (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            $stmt=$pdo-> prepare($sql);   
            $exec = $stmt->execute(array($_POST['txtCIN'], $_POST['txtPrenom'], $_POST['txtNom'], $_POST['dteNaissance'], 
            $_POST['rdbCivilite'], $_POST['txtAdresse'], $_POST['txtAdresseMail'], $_POST['lstGouvernorat'], $_POST['lstGroupe'], $_POST['txtpwd'], $_POST['txtUser'])); 
        } catch(PDOException $e) {
            echo $e->getMessage();
            
        }
        
      }
      //Sélection des gouvernorats
      $gouv = "select cdegouvernorat,intituleFr from gouvernorats";
      $stmt = $pdo->prepare($gouv);
      $stmt->execute();
      $gouvListe = $stmt->fetchall();
      //Sélection des groupes
      $group = "select cdegroupe,intitulegr from groupes";
      $stmt = $pdo->prepare($group);
      $stmt->execute();
      $groupListe = $stmt->fetchall();
      ?>
      
      

      Partie JS :

       <script type="text/javascript"> 
              function validate() { 
                  var msg; 
                  var str = document.getElementById("txtpwd").value; 
                  if (str.match( /[0-9]/g) && 
                          str.match( /[A-Z]/g) && 
                          str.match(/[a-z]/g) && 
                          str.match( /[^a-zA-Z\d]/g) &&
                          str.length >= 10 &&
                          document.getElementById("txtpwd").value==document.getElementById("txtpwd2").value) {                    
                  //msg = "<p style='color:green'>Mot de passe fort.</p>";
                  }else {            
                    msg = "<p style='color:red'>Mot de passe faible.</p>"; 
                    document.getElementById("msg").innerHTML= msg;
                    return false; 
                    }       
              } 
          </script>
  4. Requête UPDATE en utilisant PDO

    • Pour exécuter une requête UPDATE avec PDO, suivez simplement les étapes ci-dessous :
      • créer une instruction SQL UPDATE correcte
      • remplacer toutes les valeurs réelles par des espaces réservés
      • préparer la requête résultante
      • exécutez l’instruction, en envoyant toutes les valeurs réelles à execute()sous la forme d’un tableau.

      Requête UPDATE avec espaces réservés positionnels

        Méthode 01

          Ecrire des données avec PDO

        Méthode 02

        • ou vous pouvez enchaîner execute() pour prepare() :
        • Ecrire des données avec PDO

      Requête UPDATE avec des espaces réservés nommés

      • Dans le cas où vous avez un tableau prédéfini avec des valeurs, ou préférez les espaces réservés nommés en général, le code serait
      • Méthode 01

          Ecrire des données avec PDO

        Méthode 02

        • ou vous pouvez enchaîner execute() pour prepare() :
  5. Application
    • Un utilisateur doit pouvoir modifier des enregistrements dans la table "apprenants" ses coordonnées, son adresse ou son adresse mail par exemple.
    • L’exemple suivant crée une page contenant un formulaire qui permet la saisie du code de l’apprenant dans une zone de texte.
    • Formulaire de modification
    • Ecrire-des-donnees-avec-PDO-2

      Afficher la solution

      Partie HTML à ajouter dans le fichier header.php :

       <!-- Bootstrap Font Icon CSS -->
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css">
      

      Partie HTML recherche apprenant :

       <!--Formulaire de rechercche-->
      <div class="card " style="border-width: 1px;">
              <div class="card-header bg-primary text-white">
              <div class="row">
                    <div class="col-lg-8 justify-content-start">
                        <h5>Modifier un apprenant</h5>
                    </div>
                    <div class="col-lg-4 justify-content-end">
                        <form class="form-inline" method="post" action="#">
                            <div class="input-group">
                                <input id="search-input" type="search" class="form-control" name="txtAfficher"placeholder="Rechercher...">  
                                <button id="search-button" type="submit" class="btn btn-primary" name="btnAfficher">
                                <i class="bi bi-search"></i>
                                </button>
                            </div>
                        </form>     
                    </div>
               </div> 
               </div>        
              <div class="card-body ">
      

      Partie HTML modifier un apprenant :

       <!--Formulaire HTML de modification-->
              <div class="card-body ">
                  
                
      <form class="row g-3" method="post" action="#">
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-credit-card-2-front"></i></span>
          <input type="text" class="form-control" name="txtCIN" placeholder="Veuillez saisir votre numéro CIN" value="<?php if(isset($_POST["btnAfficher"])){echo $ligneApp[0];} ?>">
      </div>
        </div>
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-person"></i></span>
            <input type="text" class="form-control" name="txtPrenom" placeholder="Veuillez saisir votre Prénom" value="<?php if(isset($_POST["btnAfficher"])){echo $ligneApp[1];} ?>">
          </div>
        </div>
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-person-circle"></i></span>
          <input type="text" class="form-control" name="txtNom" placeholder="Veuillez saisir votre nom de famille" value="<?php if(isset($_POST["btnAfficher"])){ echo $ligneApp[2];} ?>">
      </div>
        </div>
        
        <div class="col-2"><div class="input-group">
            <span class="input-group-text"><i class="bi-alarm"></i></span>
          <input type="date" class="form-control" name="dteNaissance" value="<?php if(isset($_POST["btnAfficher"])){echo $ligneApp[3];} ?>">
        </div> 
        </div>
        <div class="col-md-2"> 
        
        <div class="btn-group">
      
      <label class="btn btn-cyan btn-rounded active form-check-label">
        <input class="form-check-input" type="radio" name="rdbCivilite" <?php if(isset($_POST["btnAfficher"])){ if($ligneApp[4]== 1) { echo 'checked'; }}?> value="1">
         <i class="bi bi-gender-male"></i> H
      </label>
      
      <label class="btn btn-cyan btn-rounded form-check-label">
        <input class="form-check-input" type="radio"  name="rdbCivilite" <?php if(isset($_POST["btnAfficher"])){ if($ligneApp[4]== 2) { echo 'checked'; }}?> value="2">
        <i class="bi bi-gender-female"></i> F
      </label>
      </div>
        </div>
        <div class="col-8 ">
          <div class="input-group">
            <span class="input-group-text"><i class="bi bi-bank2"></i></span>
            <input type="text" class="form-control" name="txtAdresse" placeholder="Veuillez saisir votre adresse personnelle" value="<?php if(isset($_POST["btnAfficher"])){ echo $ligneApp[5];} ?>">
          </div>
        </div>
      
        <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-at"></i></span>
          <input type="email" class="form-control" name="txtAdresseMail" placeholder="Veuillez saisir votre adresse e-mail"value="<?php if(isset($_POST["btnAfficher"])){ echo $ligneApp[6];} ?>">
        </div>
      </div>
        <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-flag"></i></span>
            <select name="lstGouvernorat" class="form-select">
            <option selected>Veuillez choisir votre gouvernorat</option>
            <?php
              foreach($gouvListe as $row) {
                $ligne = htmlentities($row[1], ENT_QUOTES,'iso-8859-1');
                if(isset($_POST["btnAfficher"])){
                  if ($ligneApp[7]== $row[0]) {
                    $selected = 'selected="selected"';
                  }
                  else {
                      $selected = '';
                  } 
                }
                echo "<option value='$row[0]'. $selected >$ligne</option>\n";
              }
            ?>
          </select>
        </div>
      </div>
      <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-people-fill"></i></span>
            <select name="lstGroupe" class="form-select">
            <option selected>Veuillez saisir votre groupe</option>
            <?php
              foreach($groupListe as $row) {
                $lignegroup = htmlentities($row[1], ENT_QUOTES,'iso-8859-1');
                if(isset($_POST["btnAfficher"])){
                  if ($ligneApp[8]== $row[0]) {
                    $selected = 'selected="selected"';
                  }
                  else {
                      $selected = '';
                  } 
                } 
                echo "<option value='$row[0]'. $selected >$lignegroup</option>\n";
              }
            ?>
          </select>
        </div>
         </div>
        <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="bi bi-person-badge"></i></span>
          <input type="text" class="form-control" name="txtUser" placeholder="Veuillez saisir votre identifiant"value="<?php if(isset($_POST["btnAfficher"])){ echo $ligneApp[10];} ?>">
        </div>
      </div>
        <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-unlock"></i></span>
          <input type="password" class="form-control" name="txtpwd" placeholder="Veuillez saisir votre mot de passe"value="<?php if(isset($_POST["btnAfficher"])){ echo $ligneApp[9];} ?>">
        </div></div>
         <div class="col-md-4"><div class="input-group">
            <span class="input-group-text"><i class="bi bi-unlock"></i></span>
          <input type="password" class="form-control" name="txtpwd2" placeholder="Veuillez retaper votre mot de passe"value="<?php if(isset($_POST["btnAfficher"])){ echo $ligneApp[9];} ?>">
        </div>
         </div>
        <div class="col-12">
        <button type="submit" name="btnModifierApprenants" class="btn btn-primary float-end "><i class="bi bi-arrow-clockwise"></i><span style="padding-left: 10px;">Modifier les données de l'apprenant</span></button>
        </div>
      </form>
          </div>
      </div>
      </div>
      

      Partie PHP recherche apprenant :

       //Recherche d'un apprenant
      if(isset($_POST["btnAfficher"]) && isset($_POST["txtAfficher"]))
          {
              $apprenant=$_POST["txtAfficher"];
              $stmt=$pdo-> prepare("SELECT * FROM apprenants where 	cinapprenant LIKE ?");
                  $stmt->execute(['%'.$apprenant.'%']);
                  $ligneApp=$stmt->fetch();
          }
      

      Partie PHP modifier apprenant :

       //Modifier un apprenant
      if(isset($_POST['btnModifierApprenants'])){
        try {
             $cin=$_POST['txtCIN'];$prenom= $_POST['txtPrenom'];$nom= $_POST['txtNom'];$dtenaissance=$_POST['dteNaissance']; 
             $civilite=$_POST['rdbCivilite'];$adresse= $_POST['txtAdresse'];$adressemail= $_POST['txtAdresseMail'];
             $gouv= $_POST['lstGouvernorat'];$group= $_POST['lstGroupe'];$pwd= $_POST['txtpwd'];
             $user= $_POST['txtUser']; 
             $data=[
             'cinapprenant'=>$cin, 'prenom'=>$prenom, 'nom'=>$nom, 'datenaissance'=>$dtenaissance,
             'civilite'=>$civilite, 
             'adresse'=>$adresse, 'adressemail'=>$adressemail, 'gouv'=>$gouv, 'group'=>$group, 'pwd'=>$pwd, 
             'user'=>$user,'cinapprenant'=>$cin,
             ];
             $sql = "update apprenants set
               cinapprenant=:cinapprenant, prenom=:prenom, nom=:nom, datenaissance=:datenaissance,
               civilite=:civilite, 
               adresse=:adresse, adressmail=:adressemail, cdegouvernorat=:gouv, cdegroupe=:group, pwd=:pwd, cdeuser=:user 
               where cinapprenant=:cinapprenant";
               $stmt=$pdo-> prepare($sql);   
               $stmt->execute($data);
           } catch(PDOException $e) {
               echo $e->getMessage();     
           }
       }



Abonnez vous à notre chaîne YouTube gratuitement