Page 1 sur 1

Récupérer les résultats d'une requête répétée plusieurs fois

Posté : 24 avr. 2009, 19:05
par Clicky
Salut,

J'essaie depuis quelques jours de modifier (plusieurs fois un des codes de mon script de concours pour "automatiser" le plus possible son utilisation. J'explique un peu plus le bazar...

En fait, j'ai un script pour proposer un concours à mes éventuels futurs membres. Il est question, dans une des parties du script, de récupérer le nombre d'id de chaque critère choisis, via quatre requêtes -une pour chaque critère- puis d'afficher ensuite le résultat de chacune d'entre elles, avec quatre boucles for.

La première des quatre requêtes :
<?php
$req3a = mysql_query("SELECT COUNT(icv_id) 
FROM concours_insc_crit_vot cicv 
JOIN concours_inscrits ci 
ON cicv.icv_inscrit_id = ci.inscrit_id 
JOIN concours_criteres cc
ON cicv.icv_valeur = cc.critere_id
WHERE icv_inscrit_id='".$inscrit_id."' 
AND icv_valeur='1'") or die ("erreur3 sql ".mysql_error());
?>
$req3a, req3b, ..c et ..d, en changeant la valeur de `icv_valeur` à chaque fois pour 2, 3, et enfin 4.

Ensuite les boucles :
<?php
for ($i=0;$i<sizeof($resultat3a = mysql_fetch_array($req3a));$i++)
{
     echo ' <img src="images/barre_vote_5x10px.gif" height="10" width="'.$resultat3a[$i].'"</img>';
     echo '  '.$resultat3a[$i].' choix.<br /><br />';
}
?>
Quatre boucles donc, $resultat3a, b, c, d.
Ce qui me donne :
"Critère 1 : (img barre de progression) tel pourcentage.
tant de choix."
Et ainsi de suite jusqu'au critère 4. Tout ça fonctionne bien.

Mais ici, le nombre de critères est limité à quatre, et j'aimerais qu'il n'y ait plus cette limite et pouvoir en entrer autant que je veux dans mon administration, sans devoir rajouter de requêtes et autres boucles en conséquence dans le fichier. D'où l'intérêt d'avoir les résultats en ayant écrit une seule requête et n'afficher les résultats qu'en une seule boucle.
Ma dernière modification (qui ne fait pas ce que je voudrais et ça me frustre un peu beaucoup) :

La requête répétée plusieurs fois avec le changement de la valeur de $i pour icv_valeur, à chaque fois, et la boucle pour le résultat censé être de chaque requête :
<?php
for ($i=1;$i<$total_criteres+1;$i++)
{
     //Récupération des résultats du membre, critère par critère
     $req_resultats = mysql_query('SELECT icv_id 
     FROM concours_insc_crit_vot cicv 
     JOIN concours_inscrits ci 
     ON cicv.icv_inscrit_id = ci.inscrit_id 
     JOIN concours_criteres cc
     ON cicv.icv_valeur = cc.critere_id
     WHERE icv_inscrit_id="'.$inscrit_id.'" 
     AND icv_valeur="'.$i.'"')
     or die ("erreur sql req_resultats ".mysql_error());
}
for($i=0;$i<sizeof($req_resultats);$i++)
{
     for($i=0;$i<sizeof($res_resultats = mysql_num_rows($req_resultats));$i++)
     {
          $mess_result = ' <img src="../images/concours/barre_vote_gauche_5x10px.png" height="10" />
          <img src="../images/concours/barre_vote_5x10px.gif" height="10" width="'.round($i*100/$total, 1).'" />
          <img src="../images/concours/barre_vote_droite_5x10px.png" height="10" />  '.round($i*100/$total, 1).'%.<br />'
          .intval($i).' choix.<br /><br />';
     }
}
?>

Puis l'affichage de ces résultats (le while juste avant sert pour l'affichage du nom de chaque critère) :
<?php
while($res_criteres = mysql_fetch_array($req_criteres))
{
	echo protect_var_court(stripslashes($res_criteres['critere_nom'])).' :';
	if(isset($mess_result))
	{
		echo $mess_result;
	}
	else
	{
	echo '';
	}
}
?>
Ce qui me donne :
"Critère 1 : (img barre de progression) 0%.
0 choix.

Critère 2 : (img barre de progression) 0%.
0 choix.

Critère 3 : (img barre de progression) 0%.
0 choix.

Critère 4 : (img barre de progression) 0%.
0 choix."

Alors que je devrais avoir 3 choix au trois premiers critères, et 2 au dernier, ainsi que les pourcentages qui vont bien. Je n'arrive donc pas à récupérer le résultat de chaque requête. Ma logique a visiblement atteint ses limites... :-# .

J'espère avoir été assez claire dans mes explications pour avoir un peu d'aide. En vous remerciant :) .

Posté : 24 avr. 2009, 21:51
par D4Y
Le problème vient du fait que tu fais ta boucle "for" pour ta query puis ensuite une autre boucle "for" pour afficher les résultats. Donc en fait la boucle "for" pour les résultats ne se fait que sur le dernier passage dans la boucle de la query .
Pas facile a expliquer , j'espère que tu comprendras !
<?php
for ($i=1;$i<$total_criteres+1;$i++)
{
     //Récupération des résultats du membre, critère par critère
     $req_resultats = mysql_query('SELECT icv_id 
     FROM concours_insc_crit_vot cicv 
     JOIN concours_inscrits ci 
     ON cicv.icv_inscrit_id = ci.inscrit_id 
     JOIN concours_criteres cc
     ON cicv.icv_valeur = cc.critere_id
     WHERE icv_inscrit_id="'.$inscrit_id.'" 
     AND icv_valeur="'.$i.'"')
     or die ("erreur sql req_resultats ".mysql_error());
}
for($i=0;$i<sizeof($req_resultats);$i++)
{
     for($i=0;$i<sizeof($res_resultats = mysql_num_rows($req_resultats));$i++)
     {
          $mess_result = ' <img src="../images/concours/barre_vote_gauche_5x10px.png" height="10" />
          <img src="../images/concours/barre_vote_5x10px.gif" height="10" width="'.round($i*100/$total, 1).'" />
          <img src="../images/concours/barre_vote_droite_5x10px.png" height="10" />  '.round($i*100/$total, 1).'%.<br />'
          .intval($i).' choix.<br /><br />';
     }
}
?>


Posté : 25 avr. 2009, 11:37
par Clicky
Salut,

Merci D4Y pour ta réponse qui m'a bien éclairé, même si j'ai dû me creuser la tête encore tout ce matin mais j'y suis finalement arrivée \o/.

En fait, pour l'affichage, il fallait juste tout mettre dans un if et le tout dans la boucle for pour la requête, sur laquelle il fallait lui coller directement la fonction mysql_num_rows() pour avoir les résultats.

Voici donc la solution :
<?php
for ($i=1;$i<$total_criteres+1;$i++)
		{
			//Récupération des résultats du membre, critère par critère
			$req_resultats= mysql_num_rows(mysql_query('SELECT icv_id 
			FROM concours_insc_crit_vot cicv 
			JOIN concours_inscrits ci 
			ON cicv.icv_inscrit_id = ci.inscrit_id 
			JOIN concours_criteres cc
			ON cicv.icv_valeur = cc.critere_id
			WHERE icv_inscrit_id="'.$inscrit_id.'" 
			AND icv_valeur="'.$i.'"'));
			//Essai du while pour l'affichage des critères et leur barre et pourcentage des résultats
			if($res_criteres = mysql_fetch_array($req_criteres))
			{
				echo protect_var_court(stripslashes($res_criteres['critere_nom'])).' :';
				echo ' <img src="../images/concours/barre_vote_gauche_5x10px.png" height="10" />
				<img src="../images/concours/barre_vote_5x10px.gif" height="10" width="'.round($req_resultats*100/$total, 1).'" />
				<img src="../images/concours/barre_vote_droite_5x10px.png" height="10" />  '.round($req_resultats*100/$total, 1).'%.<br />'
				.intval($req_resultats).' choix.<br /><br />';
			}
		}
?>
C'était tout simple finalement.

Merci encore ! :wink:

Posté : 25 avr. 2009, 22:11
par zeus
Modération :
Clicky, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

Posté : 25 avr. 2009, 23:01
par Clicky
Ah oui c'est vrai, j'ai carrément oublié sur le coup, désolée :? et merci de me l'avoir rappelé :wink: .