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
$sql = "SELECT * FROM auteurs";
// envoi de la requête
$statement = $db->prepare($sql);
$statement->execute();
$listeAuteurs = $statement->fetchAll();
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="= $auteur->nom; " name="nom[= $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="= $auteur->id; " name="id[]"/>
Ce qui donne :
<form action='' method='post'>
<ul>
foreach ($listeAuteurs as $auteur) {
<li>
<input type="hidden" value="= $auteur->id; " name="id[]"/>
<input type="text" value="= $auteur->nom; " name="nom[= $auteur->id; ]"/>
<input type="text" value="= $auteur->prenom; " name="prenom[= $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')
{
...
}
Nous recevons pour chaque identifiant plusieurs champs.
Chaque fiche récupérée doit être modifiée dans la table.
// création de la requête
$sql = "UPDATE auteurs SET
nom = :nom,
prenom = :prenom
WHERE id = :id";
$statement = $db->prepare($sql);
// envoi des requêtes
foreach ($_POST['id'] as $id) {
$statement->execute(['id'=>$id, 'nom'=> $_POST['nom'][$id], 'prenom' => $_POST['prenom'][$id]]);
}
Ce qui nous donne :
<?php
// ouverture de la connexion
...
// modification des données
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// création de la requête
$sql = "UPDATE auteurs SET
nom = :nom,
prenom = :prenom
WHERE id = :id";
$statement = $db->prepare($sql);
// envoi des requêtes
foreach ($_POST['id'] as $id) {
$statement->execute(['id'=>$id, 'nom'=> $_POST['nom'][$id], 'prenom' => $_POST['prenom'][$id]]);
}
}
// création de la requête
$sql = "SELECT * FROM auteurs";
// envoi de la requête
$statement = $db->prepare($sql);
$statement->execute();
$listeAuteurs = $statement->fetchAll();
?>
HTML généré
Méthode : Utilisation de compact
La fonction compact permet de créer un tableau associatif à partir de clés
<?php
$nom = 'dupont';
$prenom = 'jean';
$tab = compact('nom', 'prenom'); // ['nom'=>'dupont', 'prenom'=>'jean']
Ce qui donne :
// ouverture de la connexion
$dsn = 'mysql:host=localhost;dbname=bdd';
$username = 'root';
$password = '';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
$db = new PDO($dsn, $username, $password, $options);
// modification des données
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// création de la requête
$sql = "UPDATE auteurs SET nom = :nom, prenom = :prenom WHERE id = :id";
$statement = $db->prepare($sql);
// envoi des requêtes
foreach ($_POST['id'] as $id) {
$nom = $_POST['nom'][$id] ?? '';
$prenom = $_POST['prenom'][$id] ?? '';
$statement->execute(compact('id', 'nom', 'prenom'));
}
}
// création de la requête
$sql = "SELECT * FROM auteurs";
// envoi de la requête
$statement = $db->prepare($sql);
$statement->execute();
$listeAuteurs = $statement->fetchAll(PDO::FETCH_OBJ);
<form action='' method='post'>
<ul>
foreach ($listeAuteurs as $auteur) {
<li>
<input type="hidden" value="= $auteur->id; " name="id[]" />
<input type="text" value="= $auteur->nom; " name="nom[= $auteur->id; ]" />
<input type="text" value="= $auteur->prenom; " name="prenom[= $auteur->id; ]" />
</li>
}
</ul>
<div><input type='submit' value='modifier' /></div>
</form>