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.

Formulaire Modifier

MéthodeRé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.

1
// création de la requête
2
$requete = "SELECT * FROM auteurs";
3
4
// envoi de la requête
5
$listeAuteurs = $db->query($requete)->fetchAll(PDO::FETCH_OBJ);

MéthodeAfficher 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.

1
<form action='' method='post'>
2
...
3
</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.

1
<input type="text" value="<?php echo $auteur->nom; ?>" name="nom[<?php 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[]

1
<input type="hidden" value="<?php echo $auteur->id; ?>" name="id[]"/>

Ce qui donne :

1
<form action='' method='post'>
2
  <ul>
3
  <?php foreach ($listeAuteurs as $auteur) { ?>
4
    <li>
5
      <input type="hidden" value="<?php echo $auteur->id; ?>" name="id[]"/>
6
      <input type="text" value="<?php echo $auteur->nom; ?>" name="nom[<?php echo $auteur->id; ?>]"/>
7
      <input type="text" value="<?php echo $auteur->prenom; ?>" name="prenom[<?php echo $auteur->id; ?>]"/>              
8
    </li>
9
  <?php } ?>
10
  </ul>
11
  <div><input type='submit' value='modifier' /></div>
12
</form>

MéthodeTraiter 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 :

1
if($_SERVER['REQUEST_METHOD'] == 'POST')
2
{
3
...
4
}

Il faut récupérer les variables envoyées par le formulaire et les nettoyer.

1
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
2

Nous recevons pour chaque identifiant plusieurs champs.

Chaque fiche récupérée doit être modifiée dans la table.

1
foreach ($_POST['id'] as $id) {
2
  // création de la requête
3
  $sql = "UPDATE auteurs SET 
4
              nom = '{$_POST['nom'][$id]}', 
5
              prenom = '{$_POST['prenom'][$id]}' 
6
          WHERE id = '$id'";
7
  // envoi de la requête      
8
  $db->exec($sql);
9
}

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 :

1
"UPDATE auteurs SET nom = 'Flanagan', prenom = 'David' WHERE id = '1'"
2
"UPDATE auteurs SET nom = 'Chaffer', prenom = 'Jonathan' WHERE id = '2'"
3
"UPDATE auteurs SET nom = 'Swedberg', prenom = 'Karl' WHERE id = '3'"
4
"UPDATE auteurs SET nom = 'Van Lancker', prenom = 'Luc' WHERE id = '4'"
5
"UPDATE auteurs SET nom = 'Templier', prenom = 'Thierry' WHERE id = '5'"
6
"UPDATE auteurs SET nom = 'Gougeon', prenom = 'Arnaud' WHERE id = '6'"
7
"UPDATE auteurs SET nom = 'Crockford', prenom = 'Douglas' WHERE id = '7'"

Ce qui nous donne :

1
<?php
2
// ouverture de la connexion
3
...
4
// modification des données
5
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
6
    $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
7
    // modification des données du formulaire
8
    foreach ($_POST['id'] as $id) {
9
      // création de la requête
10
      $sql = "UPDATE auteurs SET 
11
                nom = '{$_POST['nom'][$id]}', 
12
                prenom = '{$_POST['prenom'][$id]}' 
13
              WHERE id = '$id'";
14
      // envoi de la requête      
15
      $db->exec($sql);
16
    }
17
}
18
// création de la requête
19
$requete = "SELECT * FROM auteurs";
20
21
// envoi de la requête
22
$listeAuteurs = $db->query($requete)->fetchAll(PDO::FETCH_OBJ);
23
?>

HTML généré

HTML généré - Modifier