IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Invalid argument supplied for foreach()


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de kifouillou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 270
    Points : 84
    Points
    84
    Par défaut [Tableaux] Invalid argument supplied for foreach()
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    foreach($_REQUEST['coche'] as $key =>$prj_id)


    Si vous avez une petite idée.
    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Bonjour,

    Typiquement cette erreur arrive quand la variable passée au foreach est vide.
    Peut être au rechargement le request n'existe plus, auquel cas un simple test préalable sur celui-ci suffirait.

  3. #3
    Membre régulier Avatar de kifouillou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 270
    Points : 84
    Points
    84
    Par défaut
    Ah mon avis le test préalable serait la solution à mon problème. Mais je ne vois pas comment faire pour que si c'est vide le request se recharge.

    Merci de t'être penché dessus.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    C'est un peu juste niveau info pour t'aider d'avantage. Peut etre que tes cases à cocher non sont pas rerenseignées au rafraichissement, et donc tu perds l'info dans le request (une case à cocher non cochée ne renvoie aucune information lors de l'envoi du formulaire).

    Pour confirmer cette hypothèse j'ai bien peur d'avoir besoin d'un peu plus de code

  5. #5
    Membre régulier Avatar de kifouillou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 270
    Points : 84
    Points
    84
    Par défaut
    ben voici le code pour afficher les cases à cochées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    $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>
    Voici le code de la page de mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    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;
    }
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    J'avoue que l'enchaînement n'est pas très clair à mes yeux.
    Ceci dit si à un moment donné tu appelles à nouveau la génération de tes cases à cocher, à aucun moment n'y figure si celle-ci a été cochée précédemment, et donc tu perdras l'info dans ton request lors d'un second envoi.

    Je ne sais pas si je suis très clair

  7. #7
    Membre régulier Avatar de kifouillou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 270
    Points : 84
    Points
    84
    Par défaut
    Ben à part dans mon foreach,

    je ne m'occupe plus des cases à cochées dans la suite de la fonction. C'est donc surement pour cela qu'il me met un erreur.

    Mais après je sais pas trop comment résoudre cela.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Si ce n'est que ca, la méthode propre selon moi c'est un input hidden pour définir à quelle étape tu en es :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type='hidden' name='step' id='step' value='1'/>
    Comme ca tu mets 1 au premier passage, 2 quand tu t'es occupé des cases à cocher, et tu fais un test de la valeur de $_REQUEST['step'] avant le foreach.

    La méthode moins propre mais plus rapide, c'est de tester directement les cases :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(count($_REQUEST['coche']) > 0 ) {
       foreach($_REQUEST['coche'] as $key =>$prj_id)    
       {
         //blablabla
       }
    }

  9. #9
    Membre régulier Avatar de kifouillou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 270
    Points : 84
    Points
    84
    Par défaut
    Bon je n'ai plus l'erreur donc merci mais le problème c'est que mon tableau est vide.
    je fais cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    .....
    foreach($_REQUEST['coche'] as $key =>$prj_id)    
    { 
    echo $prj_id."<br>";
    ........

  10. #10
    Membre régulier Avatar de kifouillou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 270
    Points : 84
    Points
    84
    Par défaut
    au rechargement ma page est vide.donc le dilemme c'est comment remettre les même valeurs dans mon tableau coche à la validation ?

  11. #11
    Membre régulier Avatar de kifouillou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 270
    Points : 84
    Points
    84
    Par défaut
    Je pense pouvoir résoudre mon problème. Il faut que j'utilise un <input type=hidden> dans le formulaire que j'envoie. Puis je mets dans le value unevariable qui a implodé mon tableau. Mais après je ne sais pas trop. Voici mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $tableau = array();
    $tableau=$_REQUEST['coche'];
    $ma_chaine=implode("|",$tableau);
    echo $ma_chaine;
    $array_recu=explode("|",$ma_chaine);
    while(list($k,$v)=each($array_recu)) 
    {
    formulaire
    <input type=hidden name=ma_chaine value="$ma_chaine">
    }
    Bon maintenant il m'affiche cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Bad arguments to implode() in /k/i/httpd/developpement/k2/mod-k2-tache.php on line 1319
    qui correspond bien sur à la ligne de mon implode.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Invalid argument supplied for foreach()
    Par babou54 dans le forum Langage
    Réponses: 2
    Dernier message: 22/03/2009, 18h15
  2. Warning: Invalid argument supplied for foreach()
    Par billyrose dans le forum Langage
    Réponses: 1
    Dernier message: 27/02/2009, 15h36
  3. [Tableaux] Invalid argument supplied for foreach
    Par Lionel57 dans le forum Langage
    Réponses: 1
    Dernier message: 20/12/2007, 13h15
  4. Invalid argument supplied for foreach()
    Par Rajhonson dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2006, 14h31
  5. Réponses: 11
    Dernier message: 19/05/2006, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo