affichage tableau pour mise à jour enregistrement (case à cocher)

Eléphant du PHP | 331 Messages

09 oct. 2007, 10:19

Bonjour,

J'ai une table contenant un certain nombre d'enregistrements qui ont chacun une dizaine de champs dont le dernier est un bouléen.
Je voudrais créer une page qui m'affiche dans un tableau l'ensemble des enregistrents retournés par ma requete, mais avec la dernière colonne qui me présenterait sous forme de case à cocher l'état du booléen pour chaque enregistrement. Ensuite, je voudrais être capable d'agir sur cette case à cocher et ainsi mettre à jour mes enregistrements concernés.

Je ne sais pas trop comment "fabriquer" la chose. Pourriez-vous m'aider ?

Merci !

Jay

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 oct. 2007, 10:39

PHP génère du code html, tu peux donc l'utiliser pour générer un input de type checkbox, voire même simplement pour définir si la case est cochée où non en ajoutant l'attribut "checked" à l'intérieur de ton input :
<input type="checkbox" name="xxx" value="true" <?php if (...) echo 'checked'; ?> />
Le test étant simplement de vérifier si ton booléen est à vrai.

Lorsque le formulaire est soumit, une case à cocher n'est envoyée que si elle a été cochée. Ainsi, si tu récupères la variable $_POST['xxx'] (ou $_GET le cas échéant), c'est que la case 'xxx' a été cochée.

Tu peux voir également la FAQ pour trouver des expliquations sur comment récupérer une liste de case à cocher :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 443 Messages

09 oct. 2007, 11:04

<input type="checkbox" name="xxx" value="true" <?php if (...) echo 'checked'; ?> />
Tu peux même aller un peu plus loin. Comme tu génères un tableau (donc plusieurs enregistrement) et souhaites appliquer un traitement aux éléments selectionnés une fois les données postées, tu peux utiliser des noms de champs indexés pour les check:
?><table><?php 
while ($row = ....)
{
?><tr>.....<input type="checkbox" name="cb[<?php echo $row['id'] ?>]" value="true" <?php if (...) echo 'checked="checked"'; ?> />....</tr><?php
}
?></table><?php
Coté serveur, la variable $_POST['cb'] est un tableau contenant en clé les id selectionnés...

Eléphant du PHP | 331 Messages

10 oct. 2007, 11:32

Ok, c'est parfait, jusqu'à là, je m'en sors !

Maintenant, là où je coince, c'est pour exploiter mon tableau retourné par $_POST['cb']

En effet, je voudrais que pour tous mes Id récupérés dans ce tableau, je puisse faire un update des enregistrements correspondants. :?

Je ne sais donc pas comment formuler ma boucle en récupérant chaque Id du tableau ...

Merci !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2007, 11:41

Ce que je ferais, c'est définir mes lignes ainsi :
<input type="text" name="champ1[<?php echo $id; ?>]" ... />
<input type="text" name="champ2[<?php echo $id; ?>]" ... />
<input type="checkbox" name="cb[]" value="<?php echo $id; ?>" ... />
...
Ainsi, lorsque tu soumets le formulaire, tu vas récupérer tous les champs sous forme d'un tableau indexé par l'id (print_r($_POST['champ1'])) et la liste des id qui ont été cochés dans $_POST['cb'].
Tu peux ainsi parcourir le tableau $_POST['cb'] avec un foreach() pour récupérer les id cochés un a un et aller chercher la valeur correspondante dans les tes tableaux de valeurs ($_POST['champ1'][$id]) pour constituer ton update :)

(chais pas si chuis très clair)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 331 Messages

10 oct. 2007, 12:06

Tu peux ainsi parcourir le tableau $_POST['cb'] avec un foreach() pour récupérer les id cochés un a un et aller chercher la valeur correspondante dans les tes tableaux de valeurs ($_POST['champ1'][$id]) pour constituer ton update :)
Merci Ryle. Clair, tu l'es, si ce n'est que je ne sais pas comment rédiger mon foreach(). Je ne sais pas comment rédiger la structure de boucle selon ce tableau que je parcoure. :cry:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2007, 12:21

Le foreach() va simplement parcourir les élément du tableau "un à un" (dixit M. Rocard)
$tab = array (1, 2, 5);
foreach ($tab as $val) {
  ...
}
Cette instruction va parcourir le tableau $tab et stocker dans $val la valeur trouvée pour chaque itération. Tu vas donc avoir $val==1, puis $val==2 et enfin $val==5. C'est ce que va te retourner $_POST['cb'] : uniquement les valeurs des cases qui ont été cochées.

A côté de cela, tu vas avoir un tableau de résultat pour chaque champ auquels tu auras collé des [] dans le nom. Et puisque l'id aura été spécifé entre les crochets, ces tableaux seront indéxés :
$_POST['champ1'] => array (
  1 => 'valeur de champ1 à la ligne 1',
  2 => 'valeur de champ1 à la ligne 2',
  3 => 'valeur de champ1 à la ligne 3',
  4 => 'valeur de champ1 à la ligne 4',
  5 => 'valeur de champ1 à la ligne 5'
);
Il te suffit donc de récupérer les valeur de $_POST['champ1'][1], $_POST['champ1'][2] et $_POST['champ1'][5] pour avoir les valeur associées aux cases qui ont été cochés et construire ta requête de mise à jour :
foreach ($_POST['cb'] as $val) {
  $champ1 = $_POST['champ1'][$val];
  ...
  $sql = ...  
  mysql_query($sql) ... 
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 331 Messages

10 oct. 2007, 13:56

bon, je tourne autour du pot, il me manque un truc, malgré tes trés bonnes explications Ryle !

J'explique :
un "print_r($_POST['cb']);" me renvoie ceci : Array ( [15] => true )
Normal, je n'ai coché qu'une seule case dans mon formulaire source.

Dans ma boucle, ce ne sont pas les valeurs "true" qui m'intéressent, mais les différents identifiants d'enregistrements qui renvoient true.
Ici par exemple, c'est le 15 qui m'intéresse et que je voudrais utiliser pour mon update.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2007, 14:00

Vi, parce que tu n'as pas fait attention dans le formulaire que je te suggérais de mettre en place, j'ai viré l'id d'entre les crochets et ai remplacé la valeur "true" par l'id, puisqu'il n'est pas nécessaire d'avoir un tableau indexé de "true", tout ce que l'on veut étant juste les valeurs :)

Ceci dit, même à partir de ton tableau indexé, tu peux faire appel à la fonction array_keys() pour récupérer uniquement les clés du tableau. C'est un petit peu plus lourd au niveau traitement, mais le resultat est le même, un tableau simple contenant uniquement les ids des cases cochées qu'il ne te reste plus qu'à passer au foreach :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 331 Messages

10 oct. 2007, 14:30

Ok, c'est parfait, ça marche nickel en mettant à jour mon formulaire !
Merci Ryle ! :wink: