Modifier des enregistrements
Principe
La réalisation de la modification des enregistrements d'une table, peut correspond à un formulaire dont le contenu est l'affichage des enregistrements de cette table.
Chaque contenu étant affiché dans une zone de saisie dont l'attribut name dépend du nom du champ et de l'identifiant de l'enregistrement.

Méthode : Récupérer les données
Comme pour l'affichage, nous récupérons les données de la base et nous les affectons à l'objet $listeAuteurs.
// création de la requête
$requete = "SELECT * FROM auteurs";
// envoi de la requête
$listeAuteurs = $db->query($requete)->fetchAll(PDO::FETCH_OBJ);
Méthode : Afficher les données.
Le formulaire de modification correspond à la page d'affichage sur laquelle on remplace les zones d'affichages par des zones de saisies.
On reprend l'affichage qu'on encadre par un formulaire qui pointe sur lui-même.
<form action='' method='post'>
...
</form>
Chaque champ contient un attribut name composé d'un tableau portant le nom du champ et dont la clé correspond à l'id de l'enregistrement : nom[id].
Ce qui permet de créer chaque case avec un name unique.
L'attribut value contient le contenu du champ.
<input type="text" value=" echo $auteur->nom; " name="nom[ echo $auteur->id; ]"/>
Un champ caché est ajouté, afin de récupérer l'ensemble des identifiants présents.
value : valeur de l'id
name : tableau id[]
<input type="hidden" value=" echo $auteur->id; " name="id[]"/>
Ce qui donne :
<form action='' method='post'>
<ul>
foreach ($listeAuteurs as $auteur) {
<li>
<input type="hidden" value=" echo $auteur->id; " name="id[]"/>
<input type="text" value=" echo $auteur->nom; " name="nom[ echo $auteur->id; ]"/>
<input type="text" value=" echo $auteur->prenom; " name="prenom[ echo $auteur->id; ]"/>
</li>
}
</ul>
<div><input type='submit' value='modifier' /></div>
</form>
Méthode : Traiter les données
Cette page faisant appel à elle-même pour le traitement, elle est donc appelée soit par l'utilisateur soit par le formulaire.
Nous devons vérifier dans quel cas nous nous trouvons :
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
...
}
Il faut récupérer les variables envoyées par le formulaire et les nettoyer.
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
Nous recevons pour chaque identifiant plusieurs champs.
Chaque fiche récupérée doit être modifiée dans la table.
foreach ($_POST['id'] as $id) {
// création de la requête
$sql = "UPDATE auteurs SET
nom = '{$_POST['nom'][$id]}',
prenom = '{$_POST['prenom'][$id]}'
WHERE id = '$id'";
// envoi de la requête
$db->exec($sql);
}
Dans notre exemple, les chaînes de caractères suivantes sont générées à chaque tour de boucle et affectées à la variable $sql qui est envoyée à la base de données :
"UPDATE auteurs SET nom = 'Flanagan', prenom = 'David' WHERE id = '1'"
"UPDATE auteurs SET nom = 'Chaffer', prenom = 'Jonathan' WHERE id = '2'"
"UPDATE auteurs SET nom = 'Swedberg', prenom = 'Karl' WHERE id = '3'"
"UPDATE auteurs SET nom = 'Van Lancker', prenom = 'Luc' WHERE id = '4'"
"UPDATE auteurs SET nom = 'Templier', prenom = 'Thierry' WHERE id = '5'"
"UPDATE auteurs SET nom = 'Gougeon', prenom = 'Arnaud' WHERE id = '6'"
"UPDATE auteurs SET nom = 'Crockford', prenom = 'Douglas' WHERE id = '7'"
Ce qui nous donne :
<?php
// ouverture de la connexion
...
// modification des données
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// modification des données du formulaire
foreach ($_POST['id'] as $id) {
// création de la requête
$sql = "UPDATE auteurs SET
nom = '{$_POST['nom'][$id]}',
prenom = '{$_POST['prenom'][$id]}'
WHERE id = '$id'";
// envoi de la requête
$db->exec($sql);
}
}
// création de la requête
$requete = "SELECT * FROM auteurs";
// envoi de la requête
$listeAuteurs = $db->query($requete)->fetchAll(PDO::FETCH_OBJ);
?>
HTML généré
