Page 1 sur 1

Besoin d'aide pour un affichage et probléme concaténation !

Posté : 31 janv. 2007, 11:04
par angebleu17
Bonjour,

J'ai 3 tables dans ma base : questionnaire, question et réponse
La table Questionnaire contient un id auto incremente, titre du sondage...etc
La table Question contient un id_question et num_sondage
La table Réponse contient un id_réponse et num_sondage.

Donc c'est 3 tables sont liés.

J'aimerais afficher un sondage, c a d :
afficher une question et les réponses qui correspondent, puis la 2eme question et les réponses, puis la 3eme question et les réponses...etc

Mais je ne vois pas trop comment faire, je suis un peu perdue !
J'ai réussi a afficher toutes les questions d'afficler mais je n'arrive pas a afficher la question et les réponses correspondantes en dessous !!

J'espére que j'ai été compréhenssible,sinon posez moi des questions !

J'ai aussi un probléme pour concaténer 2 variables :
if ($methode = 'radio')
{		
   for ($j=1; $nb_reponses >= $j; $j++)
  { 
   echo'<input type="radio" name="vote" value=vote"><br>';
   echo ".$reponse.$j.";
   }
}
Il me met cette erreur : Notice: Undefined variable: reponse in...
Par contre il affiche bien 1,2,3...

De plus, est ce qu'on peut mettre dans un bouton radio :
echo'<input type="radio" name="vote" value=vote">".$reponse.$j.";<br>';


En fait j'aimerais qu'il maffiche la reponse1, puis la reponse2..etc
Sachant que quand je met echo $reponse1; il me l'affiche bien !

Merci d'avance pour vos réponses ![/php]

Posté : 31 janv. 2007, 11:32
par Ryle
C'est peut être qu'un oubli, mais ne te manquerait-il pas un lien entre les réponses et les questions pour savoir à quelle question est associée la réponse ? :)

Le plus simple c'est d'aller chercher la liste de tes questions, boucler dessus avec un simple while, et pour chacune, aller chercher la liste des réponses associées. L'inconvénient, c'est que cela peut faire beaucoup de requête s'il y a beaucoup de questions...


Pour limiter le nombre de requêtes vers le serveur, j'utiliserais personnellement des tableaux php :)

- Un premier select ramène les infos du sondage (titre, description, ...) et affiche ce que tu as besoin d'afficher.

- Une deuxième requête ramène toutes les réponses du sondage (WHERE num_sondage = ...). A partir de là, je ferais un tableau associatif des réponses, en associant chacune d'elle à l'identifiant de la question...
$tabReponse = array();
while ($row = mysql_fetch_assoc($rsReponses)) {
  if(!isSet($tabReponse[$row['num_question']])) // on créer un sous-tableau par question
    $tabReponse[$row['num_question']] = array();

  $tabReponse[$row['num_question']][] = $row['reponse'] ... ; // on y colle la réponse et autre infos si besoin
}
Je vais ainsi obtenir un tableau du genre

Code : Tout sélectionner

array ( 5 => array ( reponse1, reponse2, reponse3 ), 7 => array ( reponse1, reponse2, reponse3 ), 12=> array ( reponse1, reponse2, reponse3 ) )

- Enfin, une dernière requête ramène toutes les questions du sondage (WHERE num_sondage = ...). Il me suffit alors de boucler sur ma liste de question, et d'afficher pour chacune la liste des réponses associées depuis mon tableau :
while ($row = mysql_fetch_assoc($rsQuestions)) {
  echo $row['libelle']; // affiche la question par ex...

  if(isSet($tabReponses[$row['id_question']]) // s'il y a des réponses dans le tableau
    foreach($tabReponses[$row['id_question']] as $reponse) {
      echo $reponse; // affiche la réponse ou autre
    }
}

On peut très bien envisager d'associer un autre tableau pour les réponses afin de conserver d'avantage d'information... En fonction de ce dont tu as besoin, il pourrait ressembler à ca :


Je vais ainsi obtenir un tableau du genre

Code : Tout sélectionner

array ( num_qestion => array ( reponse1 => array ( id_reponse => xx, lib_reponse => xx, auteur => xx, date => xx ), reponse2=> array ( id_reponse => xx, lib_reponse => xx, auteur => xx, date => xx ), ... )
HTH

Posté : 31 janv. 2007, 11:38
par angebleu17
Oui, j'ai oublié de le préciser, j'ai un champ num_question dans ma table réponse !

Merci beaucoup pour ta réponse, je vais étudier tout ça... :wink:

Mais en fait dans ma table réponse, j'ai mis :

id_reponse (auto_increment)
num_sondage reference à sondage (id_sondage)
num_question reference à question (id_question)
nb_reponse
reponse1
reponse2
reponse3
....

Enfin je n'arrive pas trop à comprendre ton code..

Je vais re-regradé pour essayé de le comprendre..mais si tu pouvais m'éclairer un peu plus, ça serait sympa ! :wink:

Posté : 31 janv. 2007, 17:13
par Ryle
Faudrait que tu détailles un peu l'usage de tes champs parce que là c'est pas évident :)

Dans ma solution, ça partait du principe qu'à une question était associé 0 à n réponses. Donc qu'en gros ton shéma avait la forme suivante :
Question : id_question, texte
Reponse : id_reponse, id_question, texte

A quoi correpond ton nb_reponse ? tes reponse1, reponse2 .. sont-elles les réponses d'un qcm avec pour valeur oui/non ? s'agit-il de texte saisi ? ...

Posté : 31 janv. 2007, 17:36
par angebleu17
Alors en fait dans la table sondage, il ya : id_sondage, titre, résumé...etc

Dans la table question : id_question, num sondage, titre de la question, la méthode et le nombre de réponse.

En fait, je fait un systéme de sondage, l'utilisateur choisi la méthode (liste déroulante, bouton radio, case a cocher, zone de texte...etc), ensuite il saisi le nombre de réponse.

Dans la table réponse : id_rep, num_ sondage, num_question, reponse1, reponse2,reponse 3 ...etc qui correspondent au réponse saisi au dessus.

Voilà pour les tables !

Donc en fait je veux afficher un sondage, c a d afficher la premiére question, ensuite afficher la méthode choisi avec les réponses saisi, pareil pour la 2eme...etc

Mais pour afficher par exemple des bouton radios avec les réponses saisi ça ne marche pas (voir plus haut) !

Enfin voilà en gros..

Posté : 31 janv. 2007, 17:58
par Ryle
Il me met cette erreur : Notice: Undefined variable: reponse in... Par contre il affiche bien 1,2,3...
Pour construire dynamiquement le nom de ta variable il faut utiliser des accolades et la chaine de caractère correspondant au nom de la variable : $resultat1 équivaut donc à ${ 'resultat' . $i } (avec $i == 1)
Le message d'erreur t'indique ici que $reponse n'est pas une variable définie (puisque la variable c'est $reponse1)?
De plus, est ce qu'on peut mettre dans un bouton radio :
echo'<input type="radio" name="vote" value=vote">".$reponse.$j.";<br>';
Attention aux guillemets/apostrophes. Si une variable contient une chaine, inutile (et il vaut mieux éviter) de la mettre entre guillemets (encore moins entre apostrophes, car le comportement est différent). En sortant la variable précédente de ta chaine :
echo'<input type="radio" name="vote" value=vote">' . ${'reponse'.$j} . '<br>'; 

Posté : 31 janv. 2007, 18:08
par angebleu17
Ok merci, ça marche, ça m'affiche bien les boutons radios avec les réponses saisies.

Pour finir, pour afficher le sondage j'ai fait plusieurs requête pour récupérer tous les champs des tables. J'ai récupéré les résultat avec mysql_fetch_array. Et ensuite j'ai fait plusieurs boucles pour tout afficher !

En tout cas merci beaucoup pour ton aide, je n'aurais pas trouver toute seule... :wink:

Posté : 31 janv. 2007, 18:52
par angebleu17
Encore un petit probléme. J'arrive bien à afficher les boutons radio, case à cocher, zone de texte, textarea, mais les listes déroulante ne fonctionne pas !

Voici mon code :
echo'<select name="vote">';
$requete3 = "SELECT * FROM reponse WHERE num_sondage = '$id_sondage' AND num_question = '$id_question'";	
		
$resultat3 = mysql_query($requete3) or die ('Erreur SQL : impossible d\'effectuer la requête : <br />'.$requete3);
			
while($val=mysql_fetch_array($resultat3)) 
{
for ($j=1; $nb_reponses >= $j; $j++)
   {
   $liste1= $val["'.${'reponse'.$j}.'"];
   $liste .= "<option>".$liste1."</option>\n";
   }
}
echo $liste;  
echo'</select>';
Il m'affiche une liste déroulante vide mais aucune erreur !

je ne vois pas trop où est l'erreur !

Posté : 01 févr. 2007, 10:25
par angebleu17
up :)

Posté : 01 févr. 2007, 10:34
par zeus
Modération :
angebleu17, les "up" sont interdits sur PHPFrance.

Si tu n'as pas obtenu de réponse, c'est (au choix) :
- que ta question est mal formulée : reformule-la différemment ;
- que personne ne connaît la réponse ici : faire un "up" ne te donnera pas davantage de résultats ;
- que la réponse demandée exige un travail important que personne ne va faire à ta place ;
- que trop peu de temps s'est écoulé depuis ton précédent message pour qu'un membre ait pu y répondre.

Merci de prendre le temps de lire les règlements.

Posté : 01 févr. 2007, 10:39
par angebleu17
ok désolée...

Mais je travail de mon côté sur mon probléme aussi..

Posté : 01 févr. 2007, 11:50
par angebleu17
j'ai trouvé la solution, je met la réponse :
$requete3 = "SELECT * FROM reponse WHERE num_sondage = '$id_sondage' AND num_question = '$id_question'";	
$resultat3 = mysql_query($requete3) or die ('Erreur SQL : impossible d\'effectuer la requête : <br />'.$requete3);
		
while($row=mysql_fetch_array($resultat3)) 
{ 
for ($j=1; $nb_reponse >= $j; $j++)
	{ 
	echo '<option>' .${'reponse'.$j} .'</option>'; 
	echo '<p></p>';	
	}
}
echo'</select>';

Posté : 01 févr. 2007, 12:14
par Ryle
Juste quelques petites remarques sur ce dernier code :

le echo '<p></p>'; ne sert à rien, et n'a pas sa place dans un <select> qui ne peut contenir que des <option> ou <optgroup>. Cela rendrait ton code html invalide, même si concrètement le navigateur va l'ignorer, alors autant le virer :)

En SQL, lorsque tu utilises des champs de type numérique (id, int, float, ...) il ne faut pas utiliser d'apostrophe pour passer les valeurs. Si tu en ajoutes, mysql devra convertir ta chaine en nombre avant de pouvoir la traiter. Autant lui donner directement la valeur dont il a besoin ;)

Quand tu fais un SELECT * , tu ramènes tous les champs de tous les enregistements. Il serait plus judicieux de spécifier uniquement ceux dont tu as besoin pour des questions de performance.

Et en l'occurence, dans le code ci-dessus, tu n'utilises aucune de ces informations, et tu les ramènes pour rien (sauf pour connaitre le nombre de lignes) :) Donc à moins que tu ne t'en serve par ailleurs, dans ce cas, il vaut mieux faire un SELECT COUNT(*) qui va juste compter le nombre d'enregistrement.
$requete3 = "SELECT COUNT(*) AS nb FROM reponse"; // "AS nb" est un alias pour utiliser la valeur plus facilement ensuite
$requete3.= " WHERE num_sondage = ".$id_sondage; // j'ai viré les apostrophes en supposant qu'il s'agissait de nombre
$requete3.= " AND num_question = ".$id_question; // idem

$resultat3 = mysql_query($requete3) // exécute la requête
   or die ('Erreur SQL : '. $requete3 .'<br />'. mysql_error()); // tu auras même le message d'erreur mysql s'il y en a un

$row = mysql_fetch_assoc($resultat3); // $row['nb'] contient le nombre d'enregistrements trouvés
// j'ai également remplacé le fetch_array par un fetch assoc, plus optimisé

for ($i = 0; $i < $row['nb']; $i++) {
  ...
}
C'est un petit peu plus long à écrire, mais ça l'est beaucoup moins à s'exécuter :)


Pour le fetch_array tout dépend de l'usage que tu en as :
- mysql_fetch_rows va te retourner un tableau indexé selon l'ordre des champs ramené par le select : array (0 => 'xxx', 1 = 'yyy', ...) (d'où l'importance de spécifier la liste des champs dans le SELECT au lieu de juste faire un SELECT * :))
- mysql_fetch_assoc va te retourner un tableau associatif selon le nom des colonnes : array ('colonne1' => 'xxx', 'colonne2' = 'yyy', ...) (d'où l'intérêt de l'alias pour renommer certaines colonnes)
- mysql_fetch_array fait un mix des deux : array (0 => 'xxx', 'colonne1' => 'xxx', 1 = 'yyy', 'colonne2' = 'yyy', ...)

Donc autant utiliser une fonction plus légere si tu n'as que faire des index ou des colonnes :)

Edit : j'ai décidement du mal avec les guillemets moi aujourd'hui

Posté : 01 févr. 2007, 12:28
par angebleu17
merci pour les précisions :wink: