Problème de boucle dans un tableau

Willy
Invité n'ayant pas de compte PHPfrance

09 févr. 2007, 00:35

Bonsoir à toute la communauté.
Voici mon problème :
Dans une première requête, je selectionne un certains nombre d’enregistrement dans ma BD.
Le résultat de cette requête est déclaré en tant que tableau.

$query1 = « SELECT Item1,Item2,Item3 FROM MaTable1”;
$result = mysql_query($query1);
$resultat = mysql_fetch_array($result);


Je m’intéresse ensuite aux différentes valeurs de Item1 dans le tableau $resultat.
Admettons que la première requête me donne 3 enregistrements (donc 3 valeurs de Item1). Je souhaite, dans une deuxième requête, passer une à une les 3 valeurs de Item1 pour voir si 1 des 3 passages me donne au moins un enregistrement. Je dois, à la suite de la deuxième requête avoir un « témoin » m’indiquant si les 3 test me donnent au moins un résultat, ou bien rien du tout.
J’ai donc bricolé la suite de mon code avec un foreach, puis un test dont je sors( break) dès qu’une valeur est retournée. Mais cela ne me donne pas satisfaction :
foreach($resultat7 as $val)
{
$query2 = "SELECT Champs1, champs2, Champs3 FROM MaTable2 WHERE Champs1 = ‘”.CritèreItem1.”’”;
$result2 = mysql_query($query2);
$resultat2 = mysql_fetch_array($result2);
if(!empty($resultat2['Champs1s']))
{$zzz = "A";
break;
}
else
{
$zzz = "B";
}
}

Je pense que ma solution est très alambiquée et qu’il doit y avoir bien plus simple.
Pourrez-vous me donner votre avis ?
Merci d'avance.

Eléphanteau du PHP | 49 Messages

09 févr. 2007, 06:25

Dans une première requête, je selectionne un certains nombre d’enregistrement dans ma BD.
Là tu récupère UNE ligne à chaque requête.
Le résultat de cette requête est déclaré en tant que tableau.
Tableau associatif, oui puisque tu utilises mysql_fetch_assoc().
$query1 = « SELECT Item1,Item2,Item3 FROM MaTable1”;
$result = mysql_query($query1);
$resultat = mysql_fetch_array($result);
Une seule ligne sera récupérée, et quelque soit le nombre de lignes que tu testera mysql te renverra toujours un certain nombre de lignes mais tu n'en utilisera qu'une.



Je m’intéresse ensuite aux différentes valeurs de Item1 dans le tableau $resultat.
Lesquelles ? il n'y en aura qu'une à chaque fois ! et tout le temps la même.
Admettons que la première requête me donne 3 enregistrements (donc 3 valeurs de Item1).
mwé
Je souhaite, dans une deuxième requête, passer une à une les 3 valeurs de Item1 pour voir si 1 des 3 passages me donne au moins un enregistrement.
??? où est l'utilité ? SQL permet de savoir si le champs est vide ou pas:

Code : Tout sélectionner

SELECT champs FROM matable WHERE champs is not null;
Je dois, à la suite de la deuxième requête avoir un « témoin » m’indiquant si les 3 test me donnent au moins un résultat, ou bien rien du tout.
totalement inutile.
J’ai donc bricolé la suite de mon code avec un foreach, puis un test dont je sors( break) dès qu’une valeur est retournée. Mais cela ne me donne pas satisfaction :
normal :D (que ça ne donne pas satisfaction)
foreach($resultat7 as $val)
{
$query2 = "SELECT Champs1, champs2, Champs3 FROM MaTable2 WHERE Champs1 = ‘”.CritèreItem1.”’”;
$result2 = mysql_query($query2);
$resultat2 = mysql_fetch_array($result2);
if(!empty($resultat2['Champs1s']))
{$zzz = "A";
break;
}
else
{
$zzz = "B";
}
}
Je pense que ma solution est très alambiquée et qu’il doit y avoir bien plus simple.
Pourrez-vous me donner votre avis ?
Merci d'avance.
En fait je n'ai pas tout compris ...
Que cherches tu à faire ?
S'il s'agit de récupérer trois valeurs différentes de item1 tu peux le faire ainsi :

Code : Tout sélectionner

SELECT distinct(item1) FROM matable WHERE item1 is not null ORDER BY Rand() LIMIT 0,3
Tout dépend maintenant de ta version de MySQL.
S'il s'agit d'une version antérieure à la 4.1 effectivement il faut passer par du code (quoique ça puisse être jouable avec des jointures). Sinon tu peux utiliser les requêtes imbriquées :

Code : Tout sélectionner

SELECT champs1,champs2,champs3 FROM matable2 WHERE champs1 in ( SELECT distinct(item1) FROM matable WHERE item1 IS NOT NULL);
Si tu dois passer par le code :

Code : Tout sélectionner

$flag = false; while($ligne = mysql_fetch_assoc($res)) { $champs1 = $ligne["champs1"]; $req2 = "SELECT champs1,champs2,champs3 FROM matable2 WHERE champs1='" . $champs1. "'"; $res2 = mysql_query($req2); if (mysql_num_rows($res2) > 0) { $flag[$champs1] = true; } }
Tu sauras alors quels $champs1 correspondent à des données dans matable2.

Pour finir tes noms de variables n'aident pas vraiment à compréhension...