Page 1 sur 1

Supprimer des membres en PHP

Posté : 23 juil. 2013, 12:53
par chymel
Bonjour tout le monde, je viens demander votre aide après avoir passé 5 jours à chercher l'erreur dans mon code vainement. Bon je veux afficher ma liste d'utilisateurs avec des cases à cocher pour pouvoir supprimer. Tout marche bien jusqu'au moment où je clique sur supprimer rien ne se passe. Si quelqu'un pourrait m'aider je lui serai très reconnaissante. Voilà le code que j'ai fait :

Code : Tout sélectionner

Voici la liste des utilisateurs: <table> <tr> <td class="left"> <th> Id </th> <th>Nom d'utilisateur</th> <th>Email</th> </tr> <form action="users.php" method="post"> <ul> <?php //On recupere les identifiants, les pseudos et les emails des utilisateurs $req = mysql_query('select id, username, email from users ORDER BY id'); while($dnn = mysql_fetch_array($req)) { ?> <tr> <td class="left"><input type="checkbox" name="id_supp[]" value="<?php echo $dnn['id']; ?>" class="id" /> <td class="left"><?php echo $dnn['id']; ?></td> <td class="left"><a href="profile.php?id=<?php echo $dnn['id']; ?>"> &nbsp; &nbsp; &nbsp; &nbsp;<?php echo htmlentities($dnn['username'], ENT_QUOTES, 'UTF-8'); ?></a></td> <td class="left"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <?php echo htmlentities($dnn['email'], ENT_QUOTES, 'UTF-8'); ?></td> </tr> <?php if(isset($_POST['btnAction'])){ //si on a cliqué sur 1 bouton action if($_POST['btnAction']=="supprimer"){ //si l'action est supprimer if(!empty($_POST['id_supp'])){ //si on a coché aux moins une case foreach($_POST['id_supp'] as $id_suppr) { mysql_query('DELETE FROM users WHERE id = \'' . $_GET['id_supp'] . '\''); } } }else{ //si aucune case n'a été cochée echo 'vous n\'avez selectionné aucun fichier à déplacer'; } } } ?> </form> </table> </div>

Re: Supprimer des membres en PHP

Posté : 23 juil. 2013, 14:58
par yann18
bonjour,

$_GET n'a pas sa place dans ton cas, car tu récupères déjà les données(id_supp) transmises par le formulaire avec $_POST.tu fais simplement comme ceci:
foreach($_POST['id_supp'] as $id_suppr) {
              mysql_query('DELETE FROM users WHERE id ="'. $id_supp.'" ');

             
          }

Re: Supprimer des membres en PHP

Posté : 27 juil. 2013, 11:00
par momox
bonjour,

$_GET n'a pas sa place dans ton cas, car tu récupères déjà les données(id_supp) transmises par le formulaire avec $_POST.tu fais simplement comme ceci:
foreach($_POST['id_supp'] as $id_suppr) {
              mysql_query('DELETE FROM users WHERE id ="'. $id_supp.'" ');

             
          }
Allez hop, une faille...
L'injection SQL ça vous dit quelque chose ?

Re: Supprimer des membres en PHP

Posté : 27 juil. 2013, 11:49
par moogli
@momox : une solution constructive serait tout aussi intéressante :)

comme exemple indiquer mysql_real_escape_string

et dans un cas comme celui ci les fonctions array_map et la clause SQL in afin de ne faire qu'une requête plutôt que de faire une requête par élément à supprimer.


@+

Re: Supprimer des membres en PHP

Posté : 27 juil. 2013, 11:52
par momox
Moui, pas faux, mais j'ai tendance à laisser les gens chercher au premier coup et à donner la solution ensuite.

Re: Supprimer des membres en PHP

Posté : 29 juil. 2013, 08:59
par imikado
Une chose toute bête, vu que ce sont des entiers :)
foreach($_POST['id_supp'] as $id_suppr) {
              mysql_query('DELETE FROM users WHERE id ="'. (int)$id_supp.'" ');

             
          }

Re: Supprimer des membres en PHP

Posté : 29 juil. 2013, 13:23
par moogli
Requête SQL foireuse les entiers n'ont pas a être entourée de quote.
Implode + le in SQL fait la même chose en plus rapide, faire une requête dans une boucle c'est une ineptie sur tout quand on peux faire autrement !

Re: Supprimer des membres en PHP

Posté : 29 juil. 2013, 13:28
par yann18
Une chose toute bête, vu que ce sont des entiers :)
foreach($_POST['id_supp'] as $id_suppr) {
              mysql_query('DELETE FROM users WHERE id ="'. (int)$id_supp.'" ');

             
          }
très bien vu, dans la mesure où l'on attends que des entiers il est tout à fait raisonnable de procéder à une vérification du type attendu.Du point de vue optimisation on y gagne parceque la fonction mysql_real_escape_string crée toujours une instance de connexion(si elle n'existe pas) à la bd.

En reprenant la proposition de @moogli celle de faire une seule requête en lieu et place de la boucle foreach, là aussi le code est mieux optimisé car les accès à la bd sont réduits.Un exemple d'une implémentation:

  if(!empty($_POST['id_supp'])){
  $idTab = array_map('intval', $_POST['id_supp']);
   $id=   '('. implode(',', $idTab) .')';
    mysql_query('DELETE FROM users WHERE id IN "'.$id.' " ');
  }
On pouvait aussi utiliser un filtre de validation des entiers (filter_var_array) pour s'assurer qu'on ne récupère au final que des entiers

Re: Supprimer des membres en PHP

Posté : 07 août 2013, 16:48
par timotebx
Il y a pleins de trucks à ce sujet ici : http://www.lephpfacile.com/cours/16-sup ... votre-base