Page 1 sur 1

Requête dans foreach

Posté : 02 avr. 2011, 17:05
par lexarino
Bonjour à tous,

Voilà, je m'arrache les cheveux sur une boucle dans laquelle se trouve une instruction mysql :

Code : Tout sélectionner

$amis = explode(",", "Dom, JM, Zaza,..."); foreach ( $amis as $amis ) { # affiche les infos des amis : mysql_select_db($database_base, $base); $query_ami = "SELECT adresse FROM inscrits WHERE pseudo = '$amis'"; $ami = mysql_query($query_ami, $base) or die(mysql_error()); $row_ami = mysql_fetch_assoc($ami); echo $row_ami['adresse']; }
Il n'y a que l'adresse du premier ami qui est retournée. Comme si la boucle ne répétait pas ma requête pour chaque 'ami'. En testant avec $i++ la boucle est pourtant correcte et s'exécute autant de fois que d'amis dans la liste initiale.

Snirf ! J'ai d'autres boucles du même genre qui fonctionnent, je ne comprends pas.

Merci à tous

Re: Requête dans foreach

Posté : 02 avr. 2011, 18:09
par stealth35
fait var_dump de $amis, sinon pour t'utilise pas IN dans la requete ?

Re: Requête dans foreach

Posté : 03 avr. 2011, 15:22
par lexarino
Bien vu pour "IN" : je viens de ressortir mon tout premier livre sur les requêtes SQL !
J'imagine que faire une seule requête mysql là où j'en faisait autant de fois que d'amis, ça rend le tout plus léger.
J'ai un tas de bout de code comme ça qui mériterait d'être optimisé. Mais c'est vrai que je me rends pas bien compte de l'importance d'avoir des requêtes plus souples sur l'affichage d'une page ou sur la "surcharge" de la base...

Oh ben tiens puisque je suis là, j'en profite pour éviter de développer une usine à gaz une nouvelle fois sur un bout de code :
Ma liste "amis" qui sort de la base est stockée sous la forme : Dom, JM, Zaza...

Comment faire au plus simple pour transformer cette chaine en 'Dom','JM','Zaza'... str_replace ?
Repasser toutes les valeurs en tableau "explode" et les reformater ?

Merci pour tout !

Re: Requête dans foreach

Posté : 03 avr. 2011, 15:32
par lexarino
Voilà ce que j'ai fait pour transformer la chaîne : Dom, Zaza, Yves... en 'Dom','Zaza','Yves'...

Code : Tout sélectionner

$amis = explode(", ", $amis); $amis = implode("','", $amis);
C'est propre ? Y a mieux ?!

Re: Requête dans foreach

Posté : 04 avr. 2011, 13:27
par macgawel
Là, je ne suis pas trop...

Ce qui serait bien c'est d'avoir le bout de code qui te crée la liste d'amis, parce que c'est là, normalement, que tu va définir ta chaîne.

Et au passage, ça c'est à éviter :
foreach ( $amis as $amis ) {
Il vaut mieux - au moins pour la lisibilité - éviter d'utiliser le même nom de variable pour deux choses différentes...
foreach ( $amis as $un_ami ) {

Re: Requête dans foreach

Posté : 05 avr. 2011, 13:03
par lexarino
La chaîne originale provient d'une base de données ou toutes les entrées amis sont sous ce même format : Zaz, Jean Pierre, Dominique... (virgule espace entre chaque entrée).
Oui il est vrai que pour la lisibilité c'est mieux de renommer les deux variables mais sinon techniquement il n'y a pas de problème.

Merci en tout cas.

Re: Requête dans foreach

Posté : 05 avr. 2011, 13:18
par macgawel
La chaîne originale provient d'une base de données ou toutes les entrées amis sont sous ce même format : Zaz, Jean Pierre, Dominique... (virgule espace entre chaque entrée).
Si c'est possible, revoir le schéma de la BDD, après avoir (re)vu les Formes normales. En gros,

Parce que là, tu t'exposes à des casse-têtes en série (update multiples, cohérence des données, etc.).

Sinon, ton explode + implode me semble bien. Il y a peut-être plus efficace, mais c'est lisible et compréhensible (je trouve).

Re: Requête dans foreach

Posté : 05 avr. 2011, 13:30
par Mazarini
Bonjour,

A priori, ton erreur initiale provenait de "foreach ( $amis as $amis )" avec un remplacement de $amis par le premier ami.