[RESOLU] Effacer messages avec cases à cocher

Eléphanteau du PHP | 47 Messages

03 déc. 2018, 22:21

Bonjour,

J'aimerais effacer des messages dans ma base de données. J'ai fait une boucle pour afficher la liste avec une case à cocher à côté de chaque message.

J'arrive à afficher la liste, mais je n'arrive pas à effacer. Voici mon script php :

Code : Tout sélectionner

<?php /** ==================== Effacement ==================== */ // En cas d'envoi de formulaire : if ($_SERVER["REQUEST_METHOD"] == "POST") { $requete = $db->query('SELECT * FROM messages ORDER BY id DESC'); $result = $requete->fetchAll(); // Une boucle pour parcourir la liste de messages. On efface un message si une case est cochée foreach ($result as $res) { if (isset($_POST['name'])) { $id = $res['id']; $query = $db->prepare('DELETE FROM messages WHERE id='.$id); $query->bindValue(':id', $id, PDO::PARAM_INT); $query->execute(); } } } /** ==================== Affichage de liste de messages ==================== */ else { $requete2 = $db->query('SELECT * FROM messages ORDER BY id DESC'); $result2 = $requete2->fetchAll(); echo '<form method="post">'; // Une boucle pour afficher la liste de messages et une case à cocher à côté foreach ($result2 as $res) { echo '<div class="flex"> <div class="flex-child">ID: '.$res['id'].'<input name="'.$res['id'].'" type="checkbox"></div> <div class="flex-child">Pseudo: '.$res['username'].'</div> <div class="flex-child">Message: '.$res['content'].'</div> <div class="flex-child">Date: '.$res['created_at'].'</div> <hr> </div>'; } echo '<div class="center"> <button type="submit">Effacer</button> </div> </form>'; } ?>

Avatar du membre
Mammouth du PHP | 1609 Messages

03 déc. 2018, 22:52

Salut, tu devrais plutôt avoir sur les input checkbox un attribut name="idmessages[]" (les crochets pour en faire un tableau) et l'id devrait aller dans l'attribut value.
Ainsi $_POST['idmessages'] serait un tableau contenant tous les id des checkbox sélectionnées.
Ensuite tu pourrais conditionner la suppression en reprenant ton if par un if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['idmessages'])) et au lieu de faire un select de tous les messages puis une boucle de suppression, tu pourrais faire directement un 'DELETE FROM messages WHERE id IN ('.implode(', ', $_POST['idmessages']).')'.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 47 Messages

04 déc. 2018, 22:40

Merci, mais ça ne marche pas. En faisant le var_dump sur $_POST['idmessage'], je constate qu'il n'y a pas de virgule, donc impossible de faire implode().

Code : Tout sélectionner

<?php /** ==================== Effacement (2e méthode)==================== */ // En cas d'envoi de formulaire : if ( ($_SERVER["REQUEST_METHOD"] == "POST") and (isset($_POST['idmessage'])) ) { var_dump ($_POST['idmessage']); // $_POST['idmessage'] est un tableau contenant tous les id des checkbox sélectionnées $chaine = implode(",", $_POST['idmessage']); // implode() rassemble les éléments d'un tableau en une chaîne $db->query('DELETE FROM messages WHERE id IN $chaine'); if ($query->execute()) { echo 'Message(s) effacé(s) !<br>'; } } /** ==================== Affichage de liste de messages ==================== */ else { $requete2 = $db->query('SELECT * FROM messages ORDER BY id DESC'); $result2 = $requete2->fetchAll(); echo '<form method="post">'; // Une boucle pour afficher la liste de messages et une case à cocher à côté foreach ($result2 as $res) { echo '<div class="flex"> <div class="flex-child">ID: '.$res['id'].'<input name="idmessage[]" value="'.$res['id'].'" type="checkbox"></div> <div class="flex-child">Pseudo: '.$res['username'].'</div> <div class="flex-child">Message: '.$res['content'].'</div> <div class="flex-child">Date: '.$res['created_at'].'</div> <hr> </div>'; } echo '<div class="center"> <button type="submit">Effacer</button> </div> </form>'; } ?>

Avatar du membre
Mammouth du PHP | 1609 Messages

05 déc. 2018, 19:59

Le var_dump devrait afficher un Array de toutes les valeurs cochées. Le implode sert justement à joindre ces valeurs avec des virgules ainsi dans la requête tu peux obtenir un IN (id1, id2, id3, etc).

A noter que si tu veux mettre une variable dans une chaîne de caractères (WHERE id IN $chaine) tu dois entourer la chaîne par des " et non des '. Sinon la variable n'est pas interprétée. De plus tu dois ajouter les parenthèses autour de la variable sinon tu vas obtenir un IN id1, id2, id3, etc. Erreur garantie.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 47 Messages

06 déc. 2018, 00:22

C'est bon, j'ai réussi :

Code : Tout sélectionner

$chaine = implode(",", $_POST['idmessage']); // implode() rassemble les éléments d'un tableau en une chaîne $query = $db->prepare("DELETE FROM messages WHERE id IN ($chaine)"); // Doubles guillemets obligatoire pour une variable $query->bindValue(':chaine', $chaine, PDO::PARAM_STR); if ($query->execute()) {echo 'Message(s) '.$chaine.' effacé(s) !';}
Merci !

Avatar du membre
Mammouth du PHP | 1609 Messages

06 déc. 2018, 11:06

Bravo =D>
Développeur web depuis + de 20 ans