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
$sql = "SELECT * FROM auteurs";
3
4
// envoi de la requête
5
$statement = $db->prepare($sql);
6
$statement->execute();
7
$listeAuteurs = $statement->fetchAll();

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="<?= $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[]

1
<input type="hidden" value="<?= $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="<?= $auteur->id; ?>" name="id[]"/>
6
      <input type="text" value="<?= $auteur->nom; ?>" name="nom[<?= $auteur->id; ?>]"/>
7
      <input type="text" value="<?= $auteur->prenom; ?>" name="prenom[<?= $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
}

Nous recevons pour chaque identifiant plusieurs champs.

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

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

Ce qui nous donne :

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

HTML généré

HTML généré - Modifier

MéthodeUtilisation de compact

La fonction compact permet de créer un tableau associatif à partir de clés

1
<?php
2
$nom = 'dupont';
3
$prenom = 'jean';
4
$tab = compact('nom', 'prenom'); // ['nom'=>'dupont', 'prenom'=>'jean']

Ce qui donne :

1
<?php
2
// ouverture de la connexion
3
$dsn = 'mysql:host=localhost;dbname=bdd';
4
$username = 'root';
5
$password = '';
6
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
7
$db = new PDO($dsn, $username, $password, $options);
8
9
// modification des données
10
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
11
  // création de la requête
12
  $sql = "UPDATE auteurs SET nom = :nom, prenom = :prenom WHERE id = :id";
13
  $statement = $db->prepare($sql);
14
15
  // envoi des requêtes
16
  foreach ($_POST['id'] as $id) {
17
    $nom = $_POST['nom'][$id] ?? '';
18
    $prenom = $_POST['prenom'][$id] ?? '';
19
    $statement->execute(compact('id', 'nom', 'prenom'));
20
  }
21
}
22
23
// création de la requête
24
$sql = "SELECT * FROM auteurs";
25
26
// envoi de la requête
27
$statement = $db->prepare($sql);
28
$statement->execute();
29
$listeAuteurs = $statement->fetchAll(PDO::FETCH_OBJ);
30
?>
31
<form action='' method='post'>
32
  <ul>
33
    <?php foreach ($listeAuteurs as $auteur) { ?>
34
      <li>
35
        <input type="hidden" value="<?= $auteur->id; ?>" name="id[]" />
36
        <input type="text" value="<?= $auteur->nom; ?>" name="nom[<?= $auteur->id; ?>]" />
37
        <input type="text" value="<?= $auteur->prenom; ?>" name="prenom[<?= $auteur->id; ?>]" />
38
      </li>
39
    <?php } ?>
40
  </ul>
41
  <div><input type='submit' value='modifier' /></div>
42
</form>