Re, en fait oubli mon explication du haut car entre temps j'ai fait des modifications sans mettre à jour mes explications :s (oubli de ma part, désolé)
Donc je ré-explique ton erreur.
Ce que tu fais avec cette première partie de code :
foreach ($lResult3 as $row3)
{
echo '<p>';
echo $row3['intitule_question'];
echo '</p>';
$question=$row3['id_question'];
$lResult4 = $lCoupon->SelectReponse($question);
?>
<select name="id_reponse" size=">1" id="id_reponse" value="<?=$row4['id_reponse']?>">
<p>
<? //affichage des reponse possible dasn option
foreach ($lResult4 as $row4)
{
echo '<option value='.$row4['id_reponse'].'>';
echo $row4['intitule_reponse'];
echo $row4['id_reponse'];
$id_reponse=$row4['id_reponse'];
echo'</option>';
}
?>
</select>
<input type="hidden" name="question" id="question" value="<?=$question?>" />
<input type="hidden" name="id_reponse" id="id_reponse" value="<?=$id_reponse?>" />
<input type="hidden" name="recherche2" id="recherche2" value="<?=$recherche2?>" />
Tu as une boucle principale (foreach ($lResult3 as $row3)) dans laquelle, pour chaque question tu vas mettre une liste de réponse à sélectionner, avec en plus des champs cachés (question,id_reponse et recherche2)
Je ne vois pas à quoi sert 'recherche2' mais ce champ n'étant pas gênant on en parlera pas.
Concernant les deux autres champs cachés, notamment 'id_reponse', si j'ai bien compris il s'agit du champ dans lequel tu veux enregistrer l'identifiant de la réponse sélectionnée par l'utilisateur.
Or, que fais ton script, pour chaque question :
- tu initialise et rempli une variable '$id_reponse' dans une boucle :
foreach ($lResult4 as $row4)
{
echo '<option value='.$row4['id_reponse'].'>';
echo $row4['intitule_reponse'];
echo $row4['id_reponse'];
$id_reponse=$row4['id_reponse'];
echo'</option>';
}
Remarque : A la fin de ta boucle, la variable prends donc bien la valeur de l'identifiant de ta dernière réponse (ce qui est ton problème actuellement)
- puis une fois cette boucle d'affichage des questions (comme des options de la liste de la question courante), tu repli les champs cachés, dont le champ 'id_reponse' avec pour valeur la valeur de la variable $id_reponse qui a donc comme je l'ai dis dans la remarque, pris la valeur de la dernière réponse (et non celle que l'utilisateur aura sélectionné, à moins qu'il ne sélectionne la dernière)
Résumé : Tu vois bien que le soucis c'est que tu met dans tes champs cachés, les identifiants des dernières réponses et non ceux des réponses sélectionnées par l'internaute.
Explication de comment résoudre ce problème :
Il faut simplement mettre à jour le champ caché 'id_reponse' correspondant à ta question lorsque l'utilisateur sélectionne / change de réponse. Pour cela j'ai mis en place la fonction javascript suivante (dont le code était érroné j'ai fais une erreur dans le code précédent) :
function updateValue ( index, selectObj ){
// --- Retrieve elements with name 'id_reponse'
var elems = document.getElementsByNames("id_reponse");
// --- And update the value of the one corresponding to the question (cf index)
elems[index].value = selectObj.options[selectObj.options.selectedIndex].value;
}
Que fais cette fonction ? Si tu n'es pas adepte du javascript je te propose de me faire confiance sur le code ^^
Cette fonction prends en paramètre deux valeur : un indice (qui correspond au numéro de la question (commencant par '0'), et un objet de type HTML SELECT qui correspond à la liste des réponses à une question.
La première instruction de la fonction :
var elems = document.
getElementsByNames("id_reponse");
permet de récupérer tous les éléments HTML de ta page dont le nom est 'id_reponse' et qui correspondront donc à l'ensemble des champs cachés 'id_reponse' (un par question normalement). L'instruction 'getElementsByNames' retourne un tableau de tous les éléments ainsi retrouvés.
C'est lors de la deuxième instruction que va nous servir l'indice (variable 'index') pour sélectionner le bon champ 'id_reponse' dans le tableau qui a été retourné, afin de pouvoir mettre à jour sa valeur avec celle que l'utilisateur a sélectionnée. Dans le tableau retourné, l'indice 0 (elems[0]) correspond au champ 'id_reponse' de la première question, l'indice 1 (elems[1]) correspond au champ 'id_reponse' de la deuxième question, etc. Donc si l'on fais elems[index] dans la fonction on récupèrera le champ 'id_reponse' correspondant à la question numéro 'index' (dont la valeur est celle qui est données lorsque l'on écrit le champ SELECT sur la page (cf le conpteur $count qui est incrémenté à chaque question)
Le deuxième paramètre fait référence donc à la liste des réponses d'une question, et nous permets de récupérer la valeur de l'option sélectionnée : selectObj.options[selectObj.options.selectedIndex].value;
Voilà pour l'explication de la fonction javascript, maintenant comment la mettre en place ? Et bien on veut la déclencher lorsque l'utilisateur change la réponse sélectionnée, on va donc mettre à jour l'évênement 'onchange' des élements SELECT de ta page, en donnant comme paramètre le numéro de la question (pour retrouver le bon champ 'id_reponse' correspondant, ainsi qu'un "pointeur" sur la liste des réponses de manière à pouvoir récupérer la valeur sélectionnée :
onchange="updateValue("<?=$count?>",this);"
Le compteur $count est bien sur initialisé à 0 au début de ta page et incrémenté à chaque nouvelle question :
$count = 0;
et
$count++; (en fin de boucle sur les questions)
Voilà, je pense avoir fait le tour concernant les explications, voici le code mis à jour :
<script language="javascript">
function updateValue ( index, selectObj ){
// --- Retrieve elements with name 'id_reponse'
var elems = document.getElementsByNames("id_reponse");
// --- And update the value of the one corresponding to the question
elems[index].value = selectObj.options[selectObj.options.selectedIndex].value;
}
</script>
<?
$lResult3 = $lCoupon->SelectQuestion();
$count = 0; // Nb questions
foreach ($lResult3 as $row3)
{
echo '<p>';
echo $row3['intitule_question'];
echo '</p>';
$question=$row3['id_question'];
$lResult4 = $lCoupon->SelectReponse($question);
?>
<select name="select_reponse" size=">1" id="id_reponse" value="<?=$row4['id_reponse']?>" onchange="updateValue('<? echo $count?>',this)">
<p>
<? //affichage des reponse possible dasn option
foreach ($lResult4 as $row4)
{
echo '<option value='.$row4['id_reponse'].'>';
echo $row4['intitule_reponse'];
echo $row4['id_reponse'];
$id_reponse=$row4['id_reponse'];
echo'</option>';
}
?>
</select>
<input type="hidden" name="question" id="question" value="<?=$question?>" />
<input type="hidden" name="id_reponse" id="id_reponse" value="<?=$id_reponse?>" />
<input type="hidden" name="recherche2" id="recherche2" value="<?=$recherche2?>" />
<?
if (!empty($_POST["ValideReponse"]))
{
if ( isset($_POST["id_reponse"]) )
{
{ //insertion dans bdd
$lCoupon->mIdQuestion = $question;
$lCoupon->mIdReponse = $id_reponse;
$lCoupon->mID = $recherche2;
$lResult = $lCoupon->AddReponse();
}
$liste = serialize($id_reponse);
echo $liste;
}
}
// --- Increase question counter
$count++;
}
?>
<input type="submit" value="Valider" name="ValideReponse"/>
<!--recuperation des IDcoupon,question et reponse pour envois dans coupon_client4.php-->
<p>
</fieldset>
</form>
Quelques autres explications : Attention à ne pas nommer de la même manière deux types de champs différent dans ta page ! Tu avais nommé tes listes de réponse 'id_reponse' comme pour tes champs cachés, ce que j'ai mis à jour en nommant tes listes 'select_reponse' pour ne pas avoir de confusion, tant au niveau de la conpréhension qu'au niveau du bon déroulement du script.
Une dernière chose, si ce que j'ai donné n'a pas de bug et fonctionne, tu verra que si tu ne modifie pas les choix de réponses et soumet ton formulaire directement, les identifiants des réponses ne sont pas mis à jour correctement (puisqu'il le sont uniquement lorsque l'utilisateur modifie la réponse).
Il faut donc forcer les champs cachés à être correctement initialisés dès le départ (après chargement de ta page).
Pour cela, tu peux rajouter une fonction javascript qui mettra à jour tes champs après avoir créé les listes (une sorte d'initialisation donc). Voici le code de la fonction javascript :
function initLists ( ){
// --- Retrieve a list of the select lists
var lists = document.getElementsByNames("select_reponse");
// --- Roll on each retrieved list
for ( var i = 0; i < lists.length; i++ ){
// --- Provoke the update function on this list
updateValue(i,lists[i]);
}
}
Cette fonction va mettre à jour tes champs cachés après la création de ton formulaire, il faut donc l'appeler à la fin de ton script.
Voici le code global de ta page (pour ce que tu m'as donné au départ) :
<script language="javascript">
function initLists ( ){
// --- Retrieve a list of the select lists
var lists = document.getElementsByNames("select_reponse");
// --- Roll on each retrieved list
for ( var i = 0; i < lists.length; i++ ){
// --- Provoke the update function on this list
updateValue(i,lists[i]);
}
}
function updateValue ( index, selectObj ){
// --- Retrieve elements with name 'id_reponse'
var elems = document.getElementsByNames("id_reponse");
// --- And update the value of the one corresponding to the question
elems[index].value = selectObj.options[selectObj.options.selectedIndex].value;
}
</script>
<?
$lResult3 = $lCoupon->SelectQuestion();
$count = 0; // Nb questions
foreach ($lResult3 as $row3)
{
echo '<p>';
echo $row3['intitule_question'];
echo '</p>';
$question=$row3['id_question'];
$lResult4 = $lCoupon->SelectReponse($question);
?>
<select name="select_reponse" size=">1" id="id_reponse" value="<?=$row4['id_reponse']?>" onchange="updateValue('<? echo $count?>',this)">
<p>
<? //affichage des reponse possible dasn option
foreach ($lResult4 as $row4)
{
echo '<option value='.$row4['id_reponse'].'>';
echo $row4['intitule_reponse'];
echo $row4['id_reponse'];
$id_reponse=$row4['id_reponse'];
echo'</option>';
}
?>
</select>
<input type="hidden" name="question" id="question" value="<?=$question?>" />
<input type="hidden" name="id_reponse" id="id_reponse" value="<?=$id_reponse?>" />
<input type="hidden" name="recherche2" id="recherche2" value="<?=$recherche2?>" />
<?
if (!empty($_POST["ValideReponse"]))
{
if ( isset($_POST["id_reponse"]) )
{
{ //insertion dans bdd
$lCoupon->mIdQuestion = $question;
$lCoupon->mIdReponse = $id_reponse;
$lCoupon->mID = $recherche2;
$lResult = $lCoupon->AddReponse();
}
$liste = serialize($id_reponse);
echo $liste;
}
}
// --- Increase question counter
$count++;
}
?>
<input type="submit" value="Valider" name="ValideReponse"/>
<!-- Initialise each answer list -->
<script language="javascript">
initLists ();
</script>
<!--recuperation des IDcoupon,question et reponse pour envois dans coupon_client4.php-->
<p>
</fieldset>
</form>
Voilà, si tu as des questions plus précises éventuellement, ou si le code ne fonctionne pas fais le moi savoir (si erreur, ce serait bien que tu fasse un minimum d'inverstigation dessus pour soit le résoudre, soit pouvoir me dire quel est le libellé de l'erreur (pour erreur javascript par exemple), la ligne où ça coince, etc, bref tout ce qui pourra aider pour résoudre le problème plus vite :)
~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~