VIVEZ LE
FOOTBALL !

Posez votre question Signaler

[PHP]Invalid argument supplied for foreach() [Résolu]

kifouillou 128Messages postés 4 novembre 2005Date d'inscription 28 janvier 2011Dernière intervention - Dernière réponse le 19 mai 2008 à 09:56
Bonjour,
J'ai un petit problème avec un foreach.
j'affiche une page avec toutes les infos relatives aux différents projets qui ont été coché sur une page précédente. Donc j'ai besoin d'un foreach pour chaque case cochée. Tout cela fonctionne à merveille. Mais lorsque je modifie des infos et que j'appuie sur un bouton qui m'enregistre les infos et réaffiche la page ben là j'ai un beau :
Warning: Invalid argument supplied for foreach() in /k/i/httpd/developpement/k2/mod-k2-tache.php on line 1313
ma ligne 1313 c'est : foreach($_REQUEST['coche'] as $key =>$prj_id)
Si vous avez une petite idée.
Merci d'avance.
Lire la suite 

[PHP]Invalid argument supplied for foreach() »

12 réponses
Réponse
+1
moins plus
Salut,

En fait je n'arrive pas du tout à faire le lien entre tes deux pages.
Comment tu appel le deuxième script ? Car dans le formulaire des checkbox je vois que ca rappelle la même page, or si c'est la même page qui est rappelée, comment la page du deuxième script est-elle appelée, et à quel moment précisément, peux-tu expliquer à nouveau ?
kifouillou- 16 mai 2008 à 12:06
salut,

bien sur que je peux réexpliquer.

1) Dans une page j'ai des boutons radio pour chaque projet.

2) Lorsque je coche une ou plusieurs cases et que j'appuie sur un bouton, cela m'envoie vers une autre page avec formulaire qui contient toutes les infos concernant chaque case cochée.

3)Je veux valider la modification des infos d'un projet donc j'appuie sur le bouton valider qui m'exécute la fonction de validation et revient ensuite sur la page avec les formulaires correspondant à chaque case(enfin c'est ce que j'aimerais car il revien bien à la page mais sans formulaire).

Voilà. J'espère que c'est un peu plus clair.
Ajouter un commentaire
Réponse
+1
moins plus
Ok mais je ne vois toujours pas comment tu passe de la première page (ou tu as tes checkbox) à la page 2.
Dans ta première page tu as ton seul et unique formulaire que voici :
<form method=POST action='$_SERVER[PHP_SELF]' name=form_superviseur id=form_superviseur >

La page qui est chargée lors du submit est la même page ($_SERVER[PHP_SELF]), et il n'y a pas de fonction de validation avec un 'onsubmit="..."'.
Pour ce qui est du bouton de submit du formulaire :
<input type=submit value='Reporting'>

Aucune fonction n'est déclenchée lorsque l'on clique dessus, ce qui veut donc dire : pas de fonction de validation.

Donc, quand tu parle de : 'quand je clique sur une checkbox puis sur un bouton', ca t'emmène sur une seconde page.
Quel est ce fameux bouton dont tu parle ?
Apparemment ce n'est pas non plus les liens qui vont avec les checkbox puisque là aussi la référence porte sur la même page :
href='$PHP_SELF?Action=tch&Etape=reporting&prj_id=$r[prj_id]'


Je suis désolé je n'arrive pas trop à comprendre le mécanisme que tu as utilisé, ce qui me bloque pour essayer de résoudre ton problème ^^
kij_82- 16 mai 2008 à 17:35
L'input caché n'y changera rien je pense.
Je n'arrive toujours pas à comprendre comment fonctionne ton truc. Je crois que tu utilise une façon de faire que je ne connais pas donc je ne vais pas pouvoir t'aider plus ^^
Désolé, en espérant qu'une autre personne vole à ton secours.
kifouillou- 18 mai 2008 à 20:35
salut,

ben je peux essayé de te réexpliqué alors, ou on peut faire à ta facon.

Donc j'ai une page avec 2 fonctions : ces 2 fonctions correspondent chacunes à une page de mon module. J'ai une première fonction qui m'amène vers la page des cases à cochées dont le code est fourni précédemment. Quand l'utilisateur a cliqué sur une ou plusieurs case, il valide donc le formulaire et sa l'amène vers une autre page qui correspond à ma deuxième fonction. C'est à dire la créatiion d'autant de formulaire que de case cochées et dont les infos de chaque formulaire correspond à chaque valeur de case à cochées.
Bon jusque là pas de problème.

J'arrive à l'étape de validation de mes formulaires, j'en valide qu'un à la fois, mais à la validation je lui demande d'exécuter la fonction de validation et de revenir ensuite à ma page avec mes différents formulaires pour qu'il valident ceux restants. Comme celà cela lui évite de revenir à chaque fois coché une case.

Mais donc le problème c'est qu'il ne reconnait pas que c'est un tableau vu qu'il n'y a plus de valeurs. Donc à la recréation du formualire il me met une erreur. C'est pour celà que j'avais pensé à un input pour qu'il me garde les différentes valeurs de mes cases à cochées.


Voilà. Je pense que je t'ai vraiment vraiment tout dit.Donc si tu pense pouvoir m'aider , n'hésite pas. En tout cas merci à toi pour ton courage à essayer de me comprendre.
kifouillou- 19 mai 2008 à 09:56
Bon ben finalement j'ai trouvé :

$tableau=$_REQUEST['coche'];
if (!is_array($tableau))
{
$tableau = array(1=>$_REQUEST['ma_chaine']);
}
$ma_chaine=implode("|",$tableau);
$array_recu=explode("|",$ma_chaine);
while(list($k,$v)=each($array_recu))
{
.......
<input type=hidden name=ma_chaine value=$ma_chaine>
}

Encore merci à toi pour t'être penché sur mon problème.
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Serait-il possible que tu poste le code de ton formulaire (comprenant les checkbox), ainsi que tout code s'y rattachant (javascript par exemple), ainsi que le code entier du script PHP de traitement (là où tu as la ligne que tu as donné ci-dessus)

Avec ces informations en plus nous devrions être en mesure de pouvoir te répondre :)
kifouillou- 15 mai 2008 à 14:03
salut,



voici la page avec mes checkbox



$sql  = " select distinct prj_id,concat(k2people.rs,'&rsaquo; ') as label1 ,prj_nom as label2 ,'',prj_status";
    $sql .= " from k2prjproject left join k2people on prj_kid = kid";
    $sql .= " left join k2prjwork on prj_id = wrk_prj_id";
    $sql .= " where 1";
    $sql .= " and prj_status != 'ferme'";
    $sql .= " order by prj_status,k2people.rs,prj_nom,wrk_date DESC" ;
	$sql .= " limit 0, 10";
	$q = dbiQuery($sql);
	if (! $q ) DbError($sql);

$html .= <<<END
 <form method=POST action='$_SERVER[PHP_SELF]' name=form_superviseur id=form_superviseur >                <input type=hidden name=Action value="tch">
                <input type=hidden name=Etape value="multiple">
                <input type=hidden name=prj_id value="$r[prj_id]">
    
END;
	
	while ( $r = dbiFetch($q))
	{ 
	//$b = "<a href='$PHP_SELF?Action=tch&Etape=reporting&prj_id=$r[prj_id]'>"."<b>".$r[label1] ." : ".$r[label2]."</b>"."<br />"."</a>";
	//$html .= "<input type=checkbox name='coche[]' value=$r[prj_id]>$b<br />";
	$html .="<input type=checkbox name='coche[]' value='$r[prj_id]' >"."<a href='$PHP_SELF?Action=tch&Etape=reporting&prj_id=$r[prj_id]'>"."<b>".($r['label1'].$r['label2'])."</b>"."</a>"."<br />";
	}
	
    
$html .= <<<END
	
       <br />
       <input type=submit value='Reporting'>
	   </form>



et voici la page avec le formulaire :

function tachReportingMultiple($prj_id)
{
foreach($_REQUEST['coche'] as $key =>$prj_id)    
{ 
$sql  = " select k2people.kid as kid,k2prjproject.*,date_format(prj_debut,'%d/%m/%Y') as prj_debut,date_format(prj_fin,'%d/%m/%Y') as prj_fin,k2prjtypeproject.*,k2people.rs as cli_rs, k2people.nom as cli_nom, k2people.prenom as cli_prenom, k2people.email as cli_email, k2people.tel as cli_tel, k2people.fax as cli_fax";
	$sql .= " from (k2prjproject left join k2people on prj_kid = k2people.kid) left join k2prjtypeproject on prj_typ_id = typ_id";	
	$sql .= " where prj_id = '$prj_id'"; 
	$q = dbiQuery($sql);
    if (! $q ) DbError($sql);
    $R = dbiFetch($q);

$tab_html .= <<< END

 <table cellpadding=0 cellspacing=0 width=100%>
 <tr>
    <td valign=top class=BG5 width=35%>
      <u><b>Projet</b></u><br><br>
      <table cellpadding=0 cellspacing=0 >
        <tr><td>Projet &nbsp; </td><td><b>$R[typ_label] : $R[prj_nom]</b></td></tr>
        <tr><td>Client &nbsp;</td><td><b>$cli_rs : $R[cli_prenom] $cli_nom</b></td></tr>
        <tr><td>Durée &nbsp; </td><td>$barre</td></tr>
        <tr><td>email &nbsp;</td><td><b><a href="mailto:$R[cli_email]">$R[cli_email]</a></b></td></tr>
        <tr><td>Tel &nbsp;</td><td><b>$R[cli_tel]</b></td></tr>
        <tr><td>Fax &nbsp;</td><td><b>$R[cli_fax]</b></td></tr>
      </table>
    </td>
    <td valign=top class=BG3 width=65%>
    <u><b>Taches</b></u><br><br>
END;


        $tab_html .= <<<END
      <table cellpadding=0 cellspacing=0 border=1 width=100% >
      <form method=post name=form_work$i id=form_work$i action='$_SERVER[PHP_SELF]'>
  
      <input type=hidden name=Action value="tch">
      <input type=hidden name=Etape value="validerSuiviDeveloppeur2">
      <input type=hidden name=prj_id value="$prj_id">
      <input type=hidden name=wrk_date$i value="$date_formate">
      <input type=hidden name=wrk_id$i  value="$R[wrk_id]">
      <input type=hidden name=wrk_usr_id$i value="$usr_id">
      <input type=hidden name=tache_id$i  value="$tache_id">
      
      
      <tr>
      <th colspan="3" rowspan="4" width=30%>Tache$i</th>
      <td width=30%>Temps&nbsp;estimé :</td><td><b>$time_estime2</b></td>
      </tr><tr>
      <td width=30%>Temps&nbsp;travaillé&nbsp; :</td><td><b>$time4</b></td>
      </tr><tr>
      <td width=30%>Etat :</td><td><b>$r4[tache_etat]</b></td>
      </tr><tr>
      <td>Auteur :</td><td><b>$r4[nick]</b></td>
      </tr> 
      <tr>
      <td colspan=5 class=BG5><input type=button value='reporting' onclick = "report('reporting$tache_id')"></td>
      </tr>
      <tr>
      <td  colspan=5>
      <div style=display:none id=reporting$tache_id width=100%>
           
      <textarea  name=wrk_com$i style='height:80px;width:100%'></textarea>
      Temps : <input name=wrk_time$i style='text-align:center;width:50px'><br>      
      Etat  :  $etat<br/><br />
      <input type=submit value='Valider'>
      </div>
      </td>
      </tr>     
      </tr>
      </form>
      </table>
END;




Pour infos:
j'envoie le formulaire des checkbox avec étape = multiple qui correspond à la fonction avec mon formulaire.
j'envoie le formulaire(celui du foreach) avec étape = validerSuiviDeveloppeur qui correspond à une fonction de validation qui me ramène ensuite à ce formulaire. etape = validerSuiviDeveloppeur correpond donc à valider().tachReportingMultiple($_REQUEST[prj_id])
Ajouter un commentaire
Réponse
+0
moins plus
Re,

1°) Je ne sais pas si tu as mis vraiment tout ton code pour la deuxieme partie car je vois que tu ouvres un bloc foreach :
foreach($_REQUEST['coche'] as $key =>$prj_id)    
{ 


Mais je ne vois nul part où il soit fermé.

2°) dans la première page, je ne suis pas sur que ça change quelque chose, personnellement pour les checkbox je ne met jamais le nom sous forme de tableau :
<input type=checkbox name='coche[]'

mais simplement comme un nom :
<input type=checkbox name='coche'


Surtout que tu fais bien $_REQUEST["coche"] dans la seconde page. Si tu change ça ne fonctionne pas mieux ?
kifouillou- 16 mai 2008 à 08:49
salut,

non c'est pas mieux.

Pour le foreach je le ferme bien. J'ai fais un test en fait et c'est mon tableau qui est vide au rechargement. Alors je ne sais pas comment lui faire reprendre les valeurs qu'il avait.
Ajouter un commentaire
Ce document intitulé « [PHP]Invalid argument supplied for foreach() » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?