Objectifs
- Utiliser PDO de PHP, pour manipuler des données insérer, modifier et supprimer les données d'une base de données
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:

Afficher la solution
Télécharger la baseInsertion 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 INTOde 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 INTOserait la suivante:INSERT INTO nom_de_la_table VALUES (valeur1, valeur2, valeur3, ...);
- La première méthode spécifie à la fois les noms des colonnes et les valeurs à insérer:
- Syntaxe d'insertion alternative (propre à MySQL) :
INSERT INTO nom_de_la_table set colonne1=valeur1, colonne2=valeur2, colonne3=valeur3, ...;
- Pour ajouter un enregistrement à une base de donnée, vous aurez besoin de connaître la requête SQL
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 fonctionexec()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
INSERTdistingue 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. - 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 ... catchne 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. Enchaîner
execute ()pourprepare ()- Pour les deux méthodes vous pouvez enchainer execute() et prepare() comme suit:

Requête
INSERTavec des espaces réservés de position
Requête
INSERTavec des espaces réservés nommés
Vous n'avez pas à vérifier le résultat de
execute(). Car en cas d'erreur, une exceptionPDOExceptionsera lancée et l'exécution du script sera terminée, ce qui signifie qu'une telle condition n'atteindra jamais la conditionelse. L'opérateurtry ... catchne doit être utilisé.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.
- Un mot de passe est correcte s'il contient:
- 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

Afficher la solution
Partie HTML :
Partie PHP :<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 JS :<?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(); ?><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>Requête
UPDATEen utilisant PDO- Pour exécuter une requête
UPDATEavec 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
UPDATEavec espaces réservés positionnels-
Méthode 01
- ou vous pouvez enchaîner
execute()pourprepare():


Requête
UPDATEavec 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
- ou vous pouvez enchaîner
execute()pourprepare():

- Pour exécuter une requête
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

Afficher la solution
Partie HTML à ajouter dans le fichier header.php :
Partie HTML recherche apprenant :<!-- Bootstrap Font Icon CSS --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css">
Partie HTML modifier un 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 PHP recherche 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 modifier 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(); }//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(); } }