Récupération de données

Eléphant du PHP | 259 Messages

07 mars 2007, 13:03

J'arrive a afficher les données du tableau avec ce code :
<?
foreach ($_POST as $sousTablo) 
{ 
   foreach ($sousTablo as $sousnum=>$valeur) 
   { 
   echo ''.$sousnum.' : '.$valeur.'<br />'; 
   } 
} 
?>
par contre il me met cette erreur : Warning: Invalid argument supplied for foreach() in /var/www/gpsondage/envoyer_questionnaire2.php on line 30

Ca m'affiche :

Code : Tout sélectionner

2 : Array 4 : t 3 : 10 87 : 215 95 : tt 96 : ttt id_sondage
c'est bon sauf qu'a la premiére ligne c'est un deuxième tableau, et je ne vois pas comment faire pour l'afficher !!
Modifié en dernier par angebleu17 le 21 mars 2007, 12:17, modifié 2 fois.

Eléphant du PHP | 82 Messages

07 mars 2007, 13:14

Re...

Code : Tout sélectionner

<? foreach ($_POST as $CleQuestion=>$Reponse) { ##Vérifie que c'est bien un tableau avant de faire un foreach :) if(is_array($Reponse)){ echo 'Question "'.$CleQuestion.'" - Plusieurs réponses<br />'; foreach ($Reponse as $sousnum=>$valeur) { echo 'Réponse n° '.$sousnum.' : '.$valeur.'<br />'; } }else{ echo 'Question N°'.$CleQuestion.' -> Réponse '.$Reponse.'<br />'; } } ?>
Je suis pas tout à fait sur de moi, mais essaye ça :)
par contre il me met cette erreur : Warning: Invalid argument supplied for foreach() in /var/www/gpsondage/envoyer_questionnaire2.php on line 30
Comme je t'ai mis en commentaires le foreach n'apprécie guère les variables autres que tableaux :)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

07 mars 2007, 13:40

Dans $_POST tous les paramètres postés ne sont pas forcement des tableaux.
Mais tu devrais savoir lequel des paramètres est un tableau et écrire donc un foreach le concernant.

Exemple:
J'envoi l'URL suivante à mon programme :
programme.php?variable=1&tableau[0]=1&tableau[1]=2

Je sais d'avance que j'envoi 2 paramètres : variable et tableau
où le deuxième est effectivement un tableau (Array) de 2 cases
Je peux donc explorer ce tableau par un foreach mais pas ma simple variable.

J'écris donc dans mon programme recepteur des paramètres :
<?php
   //traitement de mon tableau
   if ($_POST['tableau'] && is_array($_POST['tableau']){
       foreach ($_POST['tableau'] as $index=>$valeur){
           echo "<p>$index = $valeur";
       }
   }

   //traitement de ma variable
   if ($_POST['variable']) { echo "<p>$_POST[variable]"; }
?>
Remarque : les test if ne font qu'éviter les cas où les paramètres requis ne sont pas transmis ou correctement transmis selon les spécifications de mon programme. Et ainsi éviter les erreurs du style:
Undefined Index et Invalid argument supplied for foreach()
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 259 Messages

07 mars 2007, 15:09

jobi1722 avec ton code, ça m'affiche :

Code : Tout sélectionner

Question "question" - Plusieurs réponses Réponse n° 2 : Array Réponse n° 4 : a Réponse n° 3 : 10 Réponse n° 87 : 215 Réponse n° 95 : aa Réponse n° 96 : zz Question N°id_sondage -> Réponse 1
mais pour la réponse n°2, ça n'affiche pas tout, avec le print_r j'ai ça :

Array ( [question] => Array ( [2] => Array ( [6] => on [8] => on ) [4] => a [3] => 13 [87] => 216 [95] => b [96] => c ) [id_sondage] => 1 )

il manque 6 : on et 8 : on pour la question 2

Et pour les zones de textes et textarea, j'ai ajouté les id_reponse car j'en aurais besoin pour aprés (pour faire les statistique). Et du coup quand j'affiche il me met comme le n°2 c'est a dire : Réponse n° ...2 : Array

Je ne sais pas trop comment faire..

Eléphant du PHP | 259 Messages

07 mars 2007, 15:50

j'ai modifier un peu le code :
<?
 foreach ($_POST as $CleQuestion=>$Reponse) 
{ 
   ##Vérifie que c'est bien un tableau avant de faire un foreach :)    
   if(is_array($Reponse))
   { 
     // echo 'Question "'.$CleQuestion.'" - Plusieurs réponses<br />'; 
      foreach ($Reponse as $sousnum=>$valeur) 
      { 
         echo 'Question n° '.$sousnum.', réponse n° '.$valeur.'<br />'; 
		 
				if(is_array($valeur))
				{
				foreach ($valeur as $sousval=>$val) 
			    { 
			    echo 'réponse n° '.$sousval.' : '.$val.'<br />'; 
			    } 
				}

	      } 
   }
   else
   { 
      echo ''.$CleQuestion.' : '.$Reponse.'<br />'; 
   } 
} 
?>
ça m'affiche ça :

Code : Tout sélectionner

Question "question" - Plusieurs réponses Question n° 2, réponse n° Array réponse n° 6 : 6 Question n° 4, réponse n° Array réponse n° 205 : a Question n° 3, réponse n° 10 Question n° 87, réponse n° 215 Question n° 95, réponse n° Array réponse n° 227 : e Question n° 96, réponse n° Array réponse n° 228 : z Question n° 97, réponse n° 230 id_sondage : 1
Du coup pour la question numéro 2 (case a cocher) il ne me met plus on il met le numéro de la réponse, donc il me l'affiche 2 fois !

J'arrive a récupére l'id des réponses et le texte saisi pour les zones de textes mais il m'affiche toujours le Array...

Eléphant du PHP | 259 Messages

07 mars 2007, 15:59

ah..j'ai trouvé :D
<?
 foreach ($_POST as $CleQuestion=>$Reponse) 
{ 
   ##Vérifie que c'est bien un tableau avant de faire un foreach :)    
   if(is_array($Reponse))
   { 
     // echo 'Question "'.$CleQuestion.'" - Plusieurs réponses<br />'; 
      foreach ($Reponse as $sousnum=>$valeur) 
      { 
        
				if(is_array($valeur))
				{
					foreach ($valeur as $sousval=>$val) 
					{ 
					echo 'Question n° '.$sousnum.', réponse n° '.$sousval.' : '.$val.'<br />'; 
					} 
				}
					else
					{
					echo 'Question n° '.$sousnum.', réponse n° '.$valeur.'<br />'; 
					}
	
      } 
   }
   else
   { 
      echo ''.$CleQuestion.' : '.$Reponse.'<br />'; 
   } 
} 
?>
ca donne :

Code : Tout sélectionner

Question n° 2, réponse n° 6 : 6 Question n° 4, réponse n° 205 : aaa Question n° 3, réponse n° 10 Question n° 87, réponse n° 215 Question n° 95, réponse n° 227 : zz Question n° 96, réponse n° 228 : zze Question n° 97, réponse n° 229 id_sondage : 1
juste un petit soucis pour la question 2, il met deux fois le 6 !

Eléphant du PHP | 82 Messages

07 mars 2007, 16:00

Tente de faire ça plutôt:

Code : Tout sélectionner

foreach ($_POST['question'] as $CleQuestion=>$Reponse) {
Mon code du début devrait marcher

Eléphant du PHP | 82 Messages

07 mars 2007, 16:05

oups t'a répondu plus vite que moi :op

Surement que la valeur de ta checkbox est l'id de la réponse...

Eléphant du PHP | 259 Messages

07 mars 2007, 16:10

ton code est plus simple que le mien..et ça donne le meme résultat.

si j'enléve "value="'.$id_reponse.'" pour mes case a cocher, il me met :

Code : Tout sélectionner

Question "2" - Plusieurs réponses Réponse n° 6 : on Réponse n° 8 : on
donc c'est bon.. mais il n'y a pas un moyen d'avoir juste le numéro de la réponse cocher et pas le "on", car aprés je vais mettre les réponses dans ma base, et il va enregistré le on. Par contre pour les zones de textes c'est bon car je pourrais enregistré id question, id rep et le texte !

j'ai rajouter mes requete dans le code :
<?
foreach ($_POST['question'] as $CleQuestion=>$Reponse) 
{ 
   // on Vérifie que c'est bien un tableau avant de faire un foreach  
   if(is_array($Reponse))
   { 
      echo 'Question n°'.$CleQuestion.' - Plusieurs réponses : <br />'; 
      foreach ($Reponse as $sousnum=>$valeur) 
      { 
         echo 'Réponse n° '.$sousnum.' : '.$valeur.'<br />'; 
      }
	$sql = "INSERT INTO vote(id_sondage, id_question, id_reponse, texte_libre)VALUES('$id_sondage','$CleQuestion','$sousnum','$valeur')";
	$req = mysql_query($sql);  	  
   }
	   else
	   { 
	    echo 'Question n°'.$CleQuestion.' -> Réponse '.$Reponse.'<br />';
		$sql2 = "INSERT INTO vote(id_sondage, id_question, id_reponse)VALUES('$id_sondage','$CleQuestion','$Reponse')";
		$req2 = mysql_query($sql2); 		  
	   } 
} 
?<
voici la structure de ma table :

Create table vote (id_vote int(5) not null auto_increment,
id_sondage int(5) references sondage (id_sondage),
id_question int(5) references question (id_question),
id_reponse int(5) references reponse (id_reponse),
id_client int (5) not null,
texte_libre varchar (260),
primary key (id_vote, id_reponse, id_sondage, id_question));

Id client pr le moment, je m'en occupe pas. Donc en fait quand il y a plusieurs réponses j'affiche le texte dans texte_libre

Mais pour les cases a cochers qui correspond a la question 2, dans mon essai j'avais cocher 2 cases, et il en a enregistré qu'une dans ma table et il a enregistré "on" dans texte_libre !

comment faire pour q'il enregistre toutes les données et ne pas mettre de "on" ?!
Modifié en dernier par angebleu17 le 07 mars 2007, 16:24, modifié 1 fois.

Eléphant du PHP | 82 Messages

07 mars 2007, 16:23

C'est surement que tes checkbox n'ont pas de value

Eléphant du PHP | 259 Messages

07 mars 2007, 16:25

si je met le value, il me met deux fois la meme chose :

Code : Tout sélectionner

Question n°2 - Plusieurs réponses : Réponse n° 6 : 6 Réponse n° 8 : 8
et il enregistre q'une réponse dans la table !

Eléphant du PHP | 82 Messages

07 mars 2007, 16:28

il met la valeur de ta checkbox, si tu met l'id de ta réponse c'est normal qu'il affiche la meme chose.

Sinon dis-toi que les cases non cochés n'apparaissent pas dans ton $_POST, donc si elle existe c'est que la case a été cochée !!

Eléphant du PHP | 259 Messages

07 mars 2007, 16:32

ok mais comment faire pour qu'il enregistre toutes les réponses de la checkbox ?

Eléphant du PHP | 82 Messages

07 mars 2007, 16:50

La réponse de ta checkbox c'est ton numéro 6 et 8 !!!

Eléphant du PHP | 259 Messages

07 mars 2007, 17:08

oui j'ai bien compris, mais pour l'enregistrement des données, il n'enregistre qu'une réponse... par exemple si j'ai coché 6 et 8, il me l'affiche bien mais dans ma table il ne met que la 8.

Donc je ne sais pas comment faire pour enregistrer les 2 !
<? 
foreach ($_POST['question'] as $CleQuestion=>$Reponse)  
{  
   // on Vérifie que c'est bien un tableau avant de faire un foreach   
   if(is_array($Reponse)) 
   {  
      echo 'Question n°'.$CleQuestion.' - Plusieurs réponses : <br />';  
      foreach ($Reponse as $sousnum=>$valeur)  
      {  
         echo 'Réponse n° '.$sousnum.' : '.$valeur.'<br />';  
      } 
    $sql = "INSERT INTO vote(id_sondage, id_question, id_reponse, texte_libre)VALUES('$id_sondage','$CleQuestion','$sousnum','$valeur')"; 
    $req = mysql_query($sql);         
   } 
       else 
       {  
        echo 'Question n°'.$CleQuestion.' -> Réponse '.$Reponse.'<br />'; 
        $sql2 = "INSERT INTO vote(id_sondage, id_question, id_reponse)VALUES('$id_sondage','$CleQuestion','$Reponse')"; 
        $req2 = mysql_query($sql2);            
       }  
}  
?<