Ecrire des données avec PDO
Sommaire
- 1- Objectifs
- 2- Présentation
- 3- Insertion des données
- 3.1- Création d'un formulaire HTML
- 3.2- Requête SQL
- 3.3- Traitement PHP
- 3.4- Requête
INSERT
avec des espaces réservés de position - 3.5- Requête
INSERT
avec des espaces réservés nommés - 3.6- Enchaîner
execute ()
pourprepare ()
- 3.7- Contrôler les champs mot de passe
- 4- Requête
UPDATE
en utilisant PDO - 4.1- Requête
UPDATE
avec espaces réservés positionnels - 4.2- Requête
UPDATE
avec des espaces réservés nommés - 4.3- Application
- 4.3.1- Cours PHP
Écrire des données avec PDO
-
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:
-
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 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
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. - 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. -
Enchaîner
execute ()
pourprepare ()
- Pour les deux méthodes vous pouvez enchainer execute() et prepare() comme suit:
-
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é
- Formulaire de saisie
-
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.
- ou vous pouvez enchaîner
execute()
pourprepare()
: - 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
- ou vous pouvez enchaîner
execute()
pourprepare()
: -
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
Requête INSERT
avec des espaces réservés de position
Requête INSERT
avec des espaces réservés nommés
Vous n’avez pas à vérifier le résultat de
execute()
. Car en cas d’erreur, une exceptionPDOException
sera 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 ... catch
ne doit être utilisé.
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.
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>
Requête UPDATE
avec espaces réservés positionnels
-
Méthode 01
Méthode 02
Requête UPDATE
avec des espaces réservés nommés
Méthode 01
Méthode 02
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();
}
}