[RESOLU] Checkbox + modifications

Eléphanteau du PHP | 36 Messages

27 févr. 2015, 19:43

Bonjour,

je suis confronté à un problème en essayant de modifier des infos dans un formulaire.

La question, c'est donc comment faire pour afficher mes checkbox en coché quand ils sont renseignés dans ma base.

Etape 1 : Je fais une requête sur ma table examens qui contient tous les examens et je fais une boucle pour récupérer tous les idexamens.
Etape 2 : Je fais une requête sur ma table examens_per_dossiers qui contient les examens préalablement renseignés dans le formulaire global (celui dont on a parlé plus haut).
Etape 3 : Je fais une condition si l'idexamen de ma table examens existe dans ma table examens_per_dossiers alors je rajoute l'attribut checked

Mais ça ne marche pas... Une idée ?

Merci à vous
$_queryCheckExamens = $connexion->query("SELECT *
                        FROM examens_per_dossiers EPD
                        LEFT JOIN examens E
                        ON EPD.epd_examensid = E.ex_id
                        WHERE epd_dossiersid = $ad_id
                        ORDER BY epd_examensid ASC");
                $rows = $_queryCheckExamens->fetchAll();
                foreach($rows as $row) {
                        $_checkedExamens = $row['epd_examensid'];
                }
                $_querySelectExamens = $connexion->query("SELECT *
                        FROM examens
                        WHERE ex_actif = 1
                        ORDER BY ex_ordre DESC");
                $rows = $_querySelectExamens->fetchAll();
                foreach($rows as $row) {
                        echo '
                        <tr>
                        <td><input type="checkbox" name="examens[]" value="'. $row['ex_id'].'" '; if($row['ex_id'] == $_checkedExamens) { echo 'checked'; } echo '> <label class="forcheckbox">'. utf8e($row['ex_nom']) .'</label></td>
                        <td><input type="text" name="comments_'. $row['ex_id'] .'"></td>
                        </tr>';
                }

Mammouth du PHP | 688 Messages

27 févr. 2015, 19:52

foreach($rows as $row) {
$_checkedExamens = $row['epd_examensid'];
}

$_checkedExamens vaut, après la boucle, la dernière valeur de $row['epd_examensid'].
ce qu'il faut faire, c'est tester si l'id est dans le tableau $_queryCheckExamens->fetchAll() avec http://php.net/manual/fr/function.in-array.php par exemple.

Eléphanteau du PHP | 36 Messages

27 févr. 2015, 20:11

Bonjour tof73 et merci pour ta réponse :)

Toutefois je ne comprends pas trop comment modéliser ce que tu me dis...

Eléphanteau du PHP | 36 Messages

02 mars 2015, 11:51

Un petit up ! Si quelqu'un peut me venir en aide :)

Mammouth du PHP | 571 Messages

02 mars 2015, 15:03

on peut faire encore plus simple en faisant qu'une seule requête.Tu récupères par une jointure à droite, entre la table examens_per_dossiers et examens, tous les examens actifs de la table examens.Les examens qui ne sont pas dans la table examens_per_dossiers retourneront NULL.Pour afficher les examens pré-cochés, il suffit de vérifier alors que l'id(ex_id) de la table examens n'est pas NULL:
$_querySelectExamens = $connexion->query(
"SELECT *
                FROM examens_per_dossiers EPD
                RIGHT JOIN examens E
                ON EPD.epd_examensid = E.ex_id
                WHERE epd_dossiersid = $ad_id
		and ex_actif = 1
                ORDER BY ex_ordre DESC"
         );
                $rows = $_querySelectExamens->fetchAll();
                foreach($rows as $row) {
                        echo '
                        <tr>
                        <td><input type="checkbox" name="examens[]" value="'. $row['ex_id'].'" '; if(!empty($row['ex_id'] )) { echo 'checked'; } echo '> <label class="forcheckbox">'. utf8e($row['ex_nom']) .'</label></td>
                        <td><input type="text" name="comments_'. $row['ex_id'] .'"></td>
                        </tr>';
                }

Eléphanteau du PHP | 36 Messages

02 mars 2015, 15:10

Bonjour yann18,

Ta proposition est tout à fait à l'attendue et je t'en remercie, toutefois, je n'affiche du coup plus que les deux examens qui ont été coché (dans l'exemple que j'ai fait) et non pas toute la liste d'examens qui existent en base (il existe aujourd'hui 10 examens pour autant de champs commentaires).

Du coup je coinçe toujours :)

Mammouth du PHP | 571 Messages

02 mars 2015, 16:35

pour afficher toute la liste d'examens
la liste d'examens provient-elle de la table examens)? si c'est le cas, il faut écrire cette requête :
$_querySelectExamens = $connexion->query(
"SELECT *
                FROM examens_per_dossiers EPD
                RIGHT JOIN examens E
                ON EPD.epd_examensid = E.ex_id
                WHERE epd_dossiersid = $ad_id
                ORDER BY ex_ordre DESC"
         );
                $rows = $_querySelectExamens->fetchAll();
                foreach($rows as $row) {
                        echo '
                        <tr>
                        <td><input type="checkbox" name="examens[]" value="'. $row['ex_id'].'" '; if(!empty($row['epd_examensid'] ) && $row['ex_actif ']==1) { echo 'checked'; } echo '> <label class="forcheckbox">'. utf8e($row['ex_nom']) .'</label></td>
                        <td><input type="text" name="comments_'. $row['ex_id'] .'"></td>
                        </tr>';
                }
Après j'ai pas connaissance de la structure exacte de tes tables ni de la signification de certains champs(comme ex_actif) pour me faire une idée de ce dont tu souhaites obtenir

Eléphanteau du PHP | 36 Messages

02 mars 2015, 16:56

yann18,

merci pour ta réponse.

examens contient la liste de tous les examens.
examens_per_dossiers contient la liste des examens qui ont été sélectionné par dossier et les commentaires qui vont pour chaque examen.

ex_actif correspond à l'activation ou non de l'examen dans le front office. 1 = oui 0 = non

J'ai mis un exemple ici, avec dans un premier temps tous les examens et dans un second temps les examens uniquement sélectionnés en base

Eléphanteau du PHP | 36 Messages

03 mars 2015, 10:04

Up !

J'ai un peu avancé mais le résultat n'est toujours pas à l'attendu...

Je fais un petit récapitulatif de mes deux tables :

Image

Et mon code :

Code : Tout sélectionner

<?php $_listAllExamens = array(); $_queryCheckExamens = $connexion->query("SELECT * FROM bsv_examens_per_dossiers EPD RIGHT JOIN bsv_examens E ON EPD.epd_examensid = E.ex_id WHERE (EPD.epd_dossiersid = $ad_id OR EPD.epd_dossiersid IS NULL) AND E.ex_actif = 1 ORDER BY E.ex_ordre DESC"); $rows = $_queryCheckExamens->fetchAll(); foreach($rows as $row) { $_listAllExamens[] = $row['epd_examensid']; $epd_comments = utf8e($row['epd_comments']); if(in_array($row['ex_id'], $_listAllExamens)) { $checked = 'checked'; } else { $checked = ''; } ?> <tr> <td><input type="checkbox" name="examens[]" value="<?php echo $row['ex_id']; ?>" <?php echo $checked; ?>> <label class="forcheckbox"><?php echo utf8e($row['ex_nom']); ?></label></td> <td><input type="text" name="comments_<?php echo $row['ex_id']; ?>" value="<?php echo isset($epd_comments) ? $epd_comments : ''; ?>"></td> </tr> <?php } ?>
Le rendu de ma requête :

Image

Il manque donc quelques examens... mais c'est presque ça !

Mammouth du PHP | 571 Messages

03 mars 2015, 12:44

le code de ton dernier post comme les précédents semblent répondre à ton problème c-a-d afficher la liste de tous les examens et pré-cocher les examens sélectionnés.
Qu'est-ce qui ne marche pas?y-a-t-il des erreurs affichées?

Eléphanteau du PHP | 36 Messages

03 mars 2015, 14:55

Edit : Autant pour moi, je dis une bêtise, je pense que j'avais un problème de cache... :)

Toujours dans cette problématique de modification de données, j'aimerai donc savoir comment faire pour ajouter / modifier ou supprimer un examen...

Je suis donc en mode édition, j'ai mes 12 examens et ceux qui sont déjà renseignés ont l'attribut checkbox et le commentaire si il est renseigné.

En admettant que je veuille rajouter un commentaire, ou décocher un examen et en recocher un autre... Comment puis-je faire pour vérifier cela et ensuite executer ma requête d'UPDATE ou de DELETE sur ma table bsv_examens_per_dossiers ?

On m'a parlé de faire un array_diff ?

Exemple ici

J'ai mis un var_dump($_POST);