Page 1 sur 1

Boucler sur Array contenant un résultat de SELECT par index.

Posté : 17 janv. 2010, 20:28
par NuDub
Bonsoir à toutes et tous.

Il y a juste a côté de mon topics un qui traite des boucles imbriqué mais étant données que j'ai plusieurs résultat de requête stocké dans un tableaux du coup ce topics ne m'as pas apporté de réponse, mes des infos pour la prochaine fois où j'aurais juste un résultat.

Donc à la base j'ai réussi (après beaucoup de galère) à faire une boucle de SELECT sur un tableau de checkbox.

Voici le code où je fais mes SELECT et où ensuite les résultat ce retrouve dans le tableau dont je parle plus bas:
if (sizeof($options) != 0) {
	foreach ($options as $valeur){// Requête si des options sont cochées (au moins 1) en utilisant une boucle pour gérer plusieur option
	//
	$ref_opt = $valeur;
	for ($i=0; $i < count($options); ++$i){
	$devis_opt[$i] = mysql_query("SELECT prestations.ref_prestation,
					prestations.cat_prestation,
					prestations.qte_prestation,
					prestations.label_prestation,
					prestations.tarif_prestation,
					categories.id,
					categories.label_categorie
					FROM prestations
					LEFT JOIN categories
					ON prestations.cat_prestation = categories.id
					WHERE categories.id = '".$opt_cat."' AND prestations.ref_prestation = '".$ref_opt."'");
	  //echo $result = $valeur.' ';
	}				
	}
Au final je récupère chaque résultat dans un index de mon tableaux :
$devis_opt;
// Son var_dump est = à
array(3) { [0]=> resource(12) of type (mysql result) [1]=> resource(13) of type (mysql result) [2]=> resource(14) of type (mysql result) } 
Ensuite plus bas dans mon code je souhaite affiché chaque résultat de chaque option.

Mais c'est là que les ennuis commences.

Voici un des code que j'ai fais :
$count = count($devis_opt);
$i = 0;
$j = 0;
var_dump($devis_opt);
foreach ($devis_opt as $opt){
	while($row = mysql_fetch_assoc($opt)){
		echo '<tr><br />';
		echo '<td>'.$row['ref_prestation'].'</td><br/>';
		echo '<td>'.$row['qte_prestation'].'</td><br/>';								
		echo '<td>'.$row['label_prestation'].'</td><br/>';
		echo '<td>'.$row['label_categorie'].'</td><br/>';
		echo '<td>'.$row['tarif_prestation'].'</td><br/>';							
		echo '</tr><br />';
									
	}
 }
Mais le problème c'est :
Au lieu de bouclé sur chaque résultat, je sais pas comment je m'y prend, mais ce code boucle sur la dernière options et la répète autant de fois que j'ai récupérer de résultat.

Alors que ce que je souhaite est de bouclé chaque entrée du tableau(donc chaque résultat de requête).
Et grâce au While affiché le résultat de la requête.

J'ai beau cherché et relire les tutoriels sur les Array et boucle, je ne saisi pas la bonne synthax que je dois utilisé.

Pourtant au vu des tuto je pars bien.

Le foreach pour chaque entré du tableau contenant chaque résultat de requête.

Ensuite avec While, tant que row est égale à une donné d'un champ de ma table fais tel echo de tel champs.

On est d'accord ?

Donc je comprend pas pourquoi seul le dernier résultat est pris, et pourquoi il est répété.

En résumé je vois pas comment lui dire de faire tous le block While pour chaque entré du tableau $devis_opt.

Je vous remercie pour les pistes que vous pourrez m'apporter pour que je puisse comprendre et résoudre mon problème.

EDIT 1
Des fois je me demande si c'est pas lors du SELECT où je récupère le même résultat à chaque fois, non ?

Mais en même temps comment le savoir, c'est pas possible.

Sauf si ma syntaxe pour l'affichage est correcte.

Auriez vous des pistes de travail à me donner pour résoudre mon problème ?

Merci.

Re: Boucler sur Array contenant un résultat de SELECT par index.

Posté : 17 janv. 2010, 21:56
par Ryle
Ton code semble correct et je ne vois pas ce qui peut clocher... il faudrait procéder par étape et vérifier à chacune des itérations de ton foreach, ce que contient la ressource mysql...

En revanche, puisque tu récupères les mêmes champs pour chacun de tes selects, ne serait-il pas plus judicieux de faire un seul SELECT en cumulant les conditions avec des "OR" ou avec un "UNION" ? Tu n'aurais qu'une seule boucle à faire...

Par ailleurs (mais ça n'a rien à voir :)), tes balises <br /> ne sont pas bien placées. Dans un tableau, tu ne devrais strictement rien avoir en dehors des balises TD ou TH. Les retours à la lignes se font par l'ajout de nouvelle ligne TR ;)

Re: Boucler sur Array contenant un résultat de SELECT par index.

Posté : 17 janv. 2010, 22:09
par NuDub
Bonsoir Ryle,

On c'est croisé car justement j'ai édité mon premier post en me demandant si je récupérai aps à chaque fois la même chose.

Au début je voulais faire une requête mais enre les titre eet option je n'utilisai pas les même champs de recherche.

Mais surtout j'avais parfois des pb pour tous mettre ensemble.

Mais je vais suivre tes instruction et retenter une seul requête pour les options choisi.

Et du coup moins de soucis effectivement pour l'affichage.

Merci pour l'infos des <br/> en fin de ligne des TD, je vais rectifié.

Par contre du coup j'ai une question pour repartir sur l'idé d'une unique requête pour toutes les options.

Mes options se récupère ainsi :
<input type = "checkbox" name="options[]" value="OMA01" id="master_cd" /> <label for="master_cd">Master CD</label>
<input type="checkbox" name="options[]" value="OMA02" id="reference_cd" /> <label for="reference_cd">Référence CD d'écoute</label>
<input type="checkbox" name="options[]" value="OMA03" id="stems" /> <label for="stems">Stems</label>
Comme mon $_POST['options'] va être un tableau, du coup moi comme je l'ai compris je croyais que je devais boucler pour pouvoir faire un SELECT des différente option qui peuvent être coché ?

Je dois reconnaitre que une fois que l'on sort des exemple de tuto je suis pas a l'aise avec les boucles et tableaux

PS : Le SELECT que je fais actuellement je l'ai ajouté dans mon post n°1.

Je vais regarder à mettre ça en place et je viendrai donner mon retour.

Merci de ton aide.

Re: Boucler sur Array contenant un résultat de SELECT par index.

Posté : 17 janv. 2010, 23:00
par Ryle
Tu as effectivement un soucis au niveau de tes boucles qui exécutent ta requête (en fait, tu as une boucle en trop) :

Tu as une première boucle qui parcours les options cochées (foreach ($options as $valeur)) et à l'intérieur de cette boucle, tu as une autre boucle (for ($i=0; $i < count($options); ++$i)) qui exécute ta requête autant de fois ta requête que tu as d'option, en écrasant les précédentes...

En gros, si je coche A et B, tu vas boucler sur A (foreach), exécuter deux fois la requête avec la référence de A (for), puis tu vas boucler sur B (foreach), exécuter deux fois la requête avec la référence B (for) et écraser dans ton tableau les résultats précédents.

Ceci devrait donc fonctionner comme tu le souhaites :
if (sizeof($options) != 0) {
$devis_opt = array();
        foreach ($options as $valeur){// Requête si des options sont cochées (au moins 1) en utilisant une boucle pour gérer plusieur option

                  $devis_opt[] = mysql_query("SELECT prestations.ref_prestation,
                                        prestations.cat_prestation,
                                        prestations.qte_prestation,
                                        prestations.label_prestation,
                                        prestations.tarif_prestation,
                                        categories.id,
                                        categories.label_categorie
                                        FROM prestations
                                        LEFT JOIN categories
                                        ON prestations.cat_prestation = categories.id
                                        WHERE categories.id = '".$opt_cat."' AND prestations.ref_prestation = '".$valeur."'");
        }
Mais tu peux également le faire en une seule requête en utilisant la fonction IN() pour spécifier plusieurs valeurs dans ton select : ref_prestation IN ('valeur1', 'valeur2', ...)

Re: Boucler sur Array contenant un résultat de SELECT par index.

Posté : 17 janv. 2010, 23:21
par NuDub
Merci beaucoup de l'explication détaillé des boucle au niveau du SELECT.
En gros, si je coche A et B, tu vas boucler sur A (foreach), exécuter deux fois la requête avec la référence de A (for), puis tu vas boucler sur B (foreach), exécuter deux fois la requête avec la référence B (for) et écraser dans ton tableau les résultats précédents.
Quand tu dis que je vais écraser les résultat précédent, tu veux dire que au final il restera que le résultat de B éxécuté deux fois (for) ?

Car je vais pas te caché que pour arrivé a cette syntaxe j'y suis aller par tatonement.

Et surement à tort, je me référais à je crois à ce moment à un test de count pour voir si il me retournai le nombre de résultat identique au nombre d'option coché.
Ce qui ma fait continué dans mon erreur.

Ensuite avec seulement le Foreach par contre j'avais pas mis de []. Du coup sa me semblai ne pas fonctionner et du coup je me suis dis sa boucle pas, et j'ai tenter l'ajout du For en mettant non pas : [], mais [$i] à la variable $devis_opt

Je vais reprendre tous ça demain au frais car depuis quelque jours je passe mes journée sur ça du coup le soir je fatigue.

Je ferais les deux méthode car je voudrai profité de ton explication très clair pour comprendre le fonctionnement et bien cerner mon erreur.

Je te ferai mon retour, et après ces deux test je me tournerai vers la mise en place de la requête unique.

Merci beaucoup Ryle.

PS : pour le moment je laisse ouvert car je ferai un suivis de l'avancé, et je souhaite reprendre ton post précédent avec la tête reposé.

Re: Boucler sur Array contenant un résultat de SELECT par index.

Posté : 18 janv. 2010, 15:47
par NuDub
Bonjour,

Ryle merci beaucoup, cette fois sa marceh du tonnerre, mais surtout merci pour l'explication du processus, qui m'a aidé un bien comprendre le fonctionnement de mon erreur. =D>

Je vais tenter la requête avec le IN, mais je garde pour le moment la boucle.

Je met en résolu, car si je bloque sur la requête le sujet sera différent, donc autant resté clair et mettre celui-ci en résolu.

Encore merci pour ton aide et surtout ton explication très clair, qui m'aide beaucoup.