comment executer une requete en boucle d'apres des éléments séparés par un ';' ?

Eléphant du PHP | 115 Messages

17 mars 2008, 12:00

Bonjour à tous,

J'ai une chaine de type:
$valeur="22;139;2089;...";

Je cherche à faire une requete SQL qui permettrait de remplacer chaque élément séparé par un ; par sa va valeur d'apres les champs d'une table.
Mais je ne vois pas comment y arriver dans la logique.
while(), if (), switch().... 
{
$requete="SELECT titre FROM matable WHERE id='$valeur extraite'";
$resultat=mysql_query ($requete) or die (mysql_error());
$row=mysql_fetch_array($resultat)
echo $row['titre'];
}
Vers quoi devrais-je me tourner d'après vous (si vous comprenez ce que je veux dire ? :wink: )
Quelques réalisations www.cdi-interactiv.com

Mammouth du PHP | 19672 Messages

17 mars 2008, 12:19

Évite donc les requêtes en boucle et procède autrement. Utilise une clause IN qui sera plus efficace.

-1- mettre les valeurs dans une chaine avec explode() :
$vals = explode(',', $valeur);
-2- Construire la requête :
$requete="SELECT titre FROM matable WHERE id IN (". $vals .")"; 
Ce qui donnera une requête du genre :

Code : Tout sélectionner

SELECT titre FROM matable WHERE id IN (22,139,2089)
Teste déjà la requête telle quelle avec phpMyAdmin : après, tu pourras virer la boucle while() devenue inutile pour l'exécution de la requête qui n'a plus besoin d'être exécuté qu'une seule fois.

Tu auras après peut-être besoin d'une boucle pour le traitement du retour, mais ceci est un autre chapitre ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 115 Messages

17 mars 2008, 12:29

Excellent ! merci!

Quel gain de temps pour la requete, en effet!

Voila la solution "bucheron" que j'avais trouvé:
$tab = split(';', $valeur);
foreach($tab as $elem) {
	$requete="SELECT titre FROM matable WHERE id='$elem'";
	$resultat=mysql_query ($requete) or die (mysql_error());
	$row=mysql_fetch_array($resultat);
	$liste_ok .=$row['titre'].", ";
}
Et pour extraire les valeurs maintenant ? :wink:
Comment doit-on procéder ?
Quelques réalisations www.cdi-interactiv.com

Mammouth du PHP | 19672 Messages

17 mars 2008, 12:34

Alors deux points : split() est un alias de explode().

Ensuite la récupération ? Une boucle while ira très bien.
<?php
//.. code de création et d'exécution de la requête
$exec = mysql_query($requete);
while(false !== ($ligne = mysql_fetch_assoc($exec)))
{
    // traitement de la ligne de données récupérée... chaque tour de la boucle traitera une nouvelle ligne tant qu'il y en aura.
}
//etc... 
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 115 Messages

17 mars 2008, 12:53

Ah ok!

C'est toujours bon à savoir pour l'alias...

Merci!
Quelques réalisations www.cdi-interactiv.com

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mars 2008, 14:06

Bon c'est juste pour pinailler et tout le monde aura sans doute déjà rectifié...
-1- mettre les valeurs dans une chaine avec explode() :
$vals = explode(',', $valeur);
explode() transforme une chaine en tableau. Pour mettre les valeurs d'un tableau dans une chaine, c'est bien implode() qu'il faut utiliser ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 19672 Messages

17 mars 2008, 14:07

Tu as parfaitement raison, me suis gouré :oops:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: