Se connecter / S'enregistrer
Votre question

Problème variable foreach

Tags :
  • messagerie
  • MySQL
  • Programmation
Dernière réponse : dans Programmation
15 Juillet 2009 23:02:33

Bonjour,

Je me permet de revenir vous voir car j'ai besoin de votre aide.
J'ai créer une messagerie sur le site qui marche à merveille. Les messages devaient être supprimés un par un sans checkbox avec un lien unique.
Seulement j'ai voulu faire en sorte que les messages pouvaient être supprimés en masse avec un checkbox.

Mais quand je sélectionnais plusieurs messages et que je cliqué sur supprimer, cela en supprimé qu'un seul.
J'ai donc essayer en vain la fonction foreach que voici mais cela m'affiche Warning: Invalid argument supplied for foreach() in ...

Voici ma requête (formulaire):
Citation :
<form name="myform" action="" method="post">
<table>
<tr>
<th class="row2">Cocher</th>
<th class="row2">Sujet</th>
<th class="row2">Reçu</th>
<?php


$retour = mysql_query("SELECT * FROM dossier WHERE id_receiver='$pseudo_membre' ORDER BY id DESC") or die(mysql_error());
while ($donnees = mysql_fetch_array($retour))
{

[ J'ai enlevé une partie pour alléger le code ]

?>

<tr>
<td align="center"><input type="checkbox" name="erase" value="<? echo $donnees['id']; ?>" /></td>
<td width="350" class="row1"><? echo $titre; ?></td>
<td class="row1"><? echo $recu; ?></td>


<?
}
?>

Voici le traitement :
Citation :
if (isset($_POST['delete']))
{

$asupprimer=htmlentities($_POST['erase']);
if(isset($_POST['erase'])){

foreach($asupprimer as $key=>$value)
{
$sql = "DELETE FROM $folder WHERE id = '$eraser'";
$query = mysql_query($sql) OR die("Erreur Mysql : <br />".mysql_error());
echo 'Les messages sélectionnés ont bien été supprimé !';
}

mysql_close();

}else{
echo 'Les champs sont vides !';
}

}



Merci pour votre aide.
Cordialement.

Autres pages sur : probleme variable foreach

16 Juillet 2009 00:29:49

D'après la doc, la sortie de htmlentities est très clairement un string.

$asupprimer n'est donc surement pas un tableau et il est donc impossible de faire un foreach avec.

$_POST['erase'] peut être un tableau si ton url ressemble à index.php?erase=1&erase=2 mais dans ce cas tu dois faire un test is_array() sur cette variable puis appliquer via array_map() la fonction html_entities().

Je te conseille pour une meilleur sécurité de plutôt utiliser du code ressemblant à :

  1. foreach($asupprimer as $key=>$value)
  2. {
  3. if(!is_numeric($value)) trigger_error("Données invalides, risque de détrusion de la base de donnée", E_USER_ERROR);
  4. $sql = "DELETE FROM $folder WHERE id = $value;
  5. $query = mysql_query($sql) OR trigger_error("Erreur Mysql : <br />".mysql_error());
  6. echo 'Les messages sélectionnés ont bien été supprimé !';
  7. }


Avec l'usage de trigger_error() au lieu de die() tu peux facilement masquer les messages d'erreurs aux visiteurs en diminuant le niveau d'affichage d'erreur avec error_reporting() :)  C'est pas beau d'afficher des "Erreur MySQL" aux visiteurs :D 
m
0
l
16 Juillet 2009 01:05:23

Il me semble qu'il faut aussi rajouter [] à erase pour dire qu'il s'agit d'un tableau.
Je me rappel avoir proceder comme ça il y'a quelques temps quand j'ai voulu faire la meme chose ;) 

<input type="checkbox" name="erase[]" value="<? echo $donnees['id']; ?>" />
m
0
l
16 Juillet 2009 13:20:09

Voilà après avoir pris en compte ce que vous m'avez dit et fait les modifications nécessaire, ça marche :p 
Je vous remercie du fond du cœur :) 
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS