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

Signaler
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
-
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
-
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.

4 réponses

Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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 ?
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
9
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.
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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 ^^
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
9
ok ok.

Donc j'ai plusieurs projets avec une checkbox à coté de chacun des projets et cette checkbox à pour valeur l'id du projet.

Ces projets sont soient sous forme de lien(si on ne sélectionne qu'un seul projet et cela nous emmène sur une page spécifique).Soit l'utilisateur clique sur plusieurs cases à cochées et appuies sur le bouton qui emmène sur la page qui nous interesse.

Voici le code du formulaire avec le bouton. Le Action et le Etape me permettent d'aller à la page du formulaire.
$html .= <<<END
 <form method=POST action='$_SERVER[PHP_SELF]' name=form_projet id=form_projet >
                <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))
	{ 
	$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>


Voilà. J'espère que c'est de plus en plus clair.
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
9 >
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011

en fait je pense que ce qu'il faut que je fasse c'est récupérer mes cases à cocher dans un input hidden.
Mais je sais pas trop comment faire. Un petit coup de main?
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846 >
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011

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.
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
9 >
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013

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.
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
9 >
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011

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.
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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 :)
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
9
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])
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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 ?
Messages postés
170
Date d'inscription
mardi 27 septembre 2005
Statut
Membre
Dernière intervention
28 janvier 2011
9
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.