Requête dans foreach

Eléphanteau du PHP | 17 Messages

02 avr. 2011, 17:05

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

ViPHP
ViPHP | 5462 Messages

02 avr. 2011, 18:09

fait var_dump de $amis, sinon pour t'utilise pas IN dans la requete ?

Eléphanteau du PHP | 17 Messages

03 avr. 2011, 15:22

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 !

Eléphanteau du PHP | 17 Messages

03 avr. 2011, 15:32

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 ?!

Mammouth du PHP | 672 Messages

04 avr. 2011, 13:27

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 ) {

Eléphanteau du PHP | 17 Messages

05 avr. 2011, 13:03

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.

Mammouth du PHP | 672 Messages

05 avr. 2011, 13:18

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).

ViPHP
ViPHP | 2577 Messages

05 avr. 2011, 13:30

Bonjour,

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