8791 sujets

Développement web côté serveur, CMS

Bonjour,
Je cherche un exemple de code qui me permettrait de trier unn tableau.
J'éxécute un "select" et suis obligé de l'inclure dans un "foreach" et je souhaite récupérer le résultat dans un tableau pour pouvoir le trier sur le champ "nom_usuel"

foreach($segt as $segt1) {
      $query8 = "select * from eddypart where agcepo='$unite' and segt='$segt1' and convention='$conv1' and cbp='$cbp1' and cbi='$cbi1' and indig='$indig1' and iard='$iard1' and ctconso='$ctconso1' ORDER BY Nom_Usuel";
  	   $result=odbc_exec($conn, $query8);

Auriez-vous une idée ?
Merci
 /* ici je suppose que ce sont des chaines donc j'ajoute des quotes
  * a chaque élément de $segt
  * si ce sont des nombres, passe direct à l'étape 2
  */
$ss = array();
foreach($segt as $s)
    $ss[] = "'$s'";
$segt = $ss; // je reprends le premier tableau pour utiliser le même nom de variable si ce sont des nombres.
/* étape 2 */
$segtSelect = implode(',',$segt);
// var_dump( $segtSelect ) // pour voir la chaine générée.

$query8 = "
SELECT  * 
FROM    eddypart
WHERE   agcepo='$unite' 
        AND segt IN (".$segtSelect.")
        AND convention='$conv1' 
        AND cbp='$cbp1' 
        AND cbi='$cbi1' 
        AND indig='$indig1' 
        AND iard='$iard1' 
        AND ctconso='$ctconso1'
ORDER BY Nom_Usuel";
$result=odbc_exec($conn, $query8);
/* Et ici normalement tu as ton recordset avec tous les $segt mélangés mais le tout trié par Nom_Usuel.*/


Est-ce que c'est ça que tu voulais ?
Modifié par niahoo (12 Aug 2010 - 18:47)
Merci de la réponse,
J'ai copié/collé tes lignes et hélàs mon tableau ne me retourne aucune donnée.
Je vais continuer à chercher
Merci quand même.
Après vérification, ton code me restitue bien des données mais il m'en manque.
Je cherche, je cherche...
la variable segtSelect contient des données sous la forme 4D,4R alors que si je la remplace par des valeurs dans le select, je doit les rentrer sous cette forme : '4D','4R'.
Est-ce que cela a une importance ?
Merci
ben, si tes champs contiennent des donnés genre "4D,4R", dans le SELECT mon code devrait fonctionner, puisque ça donnera un truc du style
WHERE segt IN('4D,4R', '3C,3D', '5F,5H').

ensuite faudrait un extrait des données pour voir ou est le problème.

tu pourrais donner ce que contient ton tableau $segt au début du code et quelques lignes de ta table ?


edit: attends je suis pas sur d'avoir pigé... mais si tu as des lettres dans ton champ, oui il te faut des quotes.

la ligne $ss[] = "'$s'"; place ces quotes normalement
Modifié par niahoo (13 Aug 2010 - 13:33)
En effet, j'avais oublié la ligne $ss[] = "'$s'";
Donc on avance, mais j'ai du mal à comprendre pourquoi la ligne
SELECT * FROM eddypart WHERE agcepo='$unite' AND segt IN ".$segtSelect.") AND convention='$conv1' AND cbp='$cbp1' AND cbi='$cbi1' AND indig='$indig1' AND iard='$iard1' AND ctconso='$ctconso1' ORDER BY Nom_Usuel"; 

ne fonctionne que si auparavant je l'inclus dans foreach ($segt as $segt1){
select....
Mais là je multiplie les données restituées.
Les deux lignes

foreach($segt as $s) 
    $ss[] = "'$s'"; 


servent à ajouter des quotes à chaque élément du tableau.

il te faut faire des tests quand tu développes du genre

$ss = array(); 
foreach($segt as $s) 
    $ss[] = "'$s'";
var_dump( $ss );  
$segt = $ss; // je reprends le premier tableau pour utiliser le même nom de variable si ce sont des nombres. 
/* étape 2 */ 
$segtSelect = implode(',',$segt); 
var_dump( $segtSelect ) // pour voir la chaine générée. 
 
$query8 = " 
SELECT  *  
FROM    eddypart 
WHERE   agcepo='$unite'  
        AND segt IN (".$segtSelect.") 
        AND convention='$conv1'  
        AND cbp='$cbp1'  
        AND cbi='$cbi1'  
        AND indig='$indig1'  
        AND iard='$iard1'  
        AND ctconso='$ctconso1' 
ORDER BY Nom_Usuel"; 
var_dump( $query8 ); 
$result=odbc_exec($conn, $query8); 
/* Et ici normalement tu as ton recordset avec tous les $segt mélangés mais le tout trié par Nom_Usuel.*/
var_dump($result);
 
 
 etc...


voilà tu mets des var_dump partout pour voir ce qu'il se passe
Ok, merci je vais aller dans cette direction.
Par contre est-il possible de récupérer dans un tableau le résulat du "select" en dessous avec autant de lignes et de colones que le "select" en récupère et le trier sur "nom_usuel"
$query8 = "select * from eddypart where agcepo='$unite' and segt='$segt1' and convention='$conv1' and cbp='$cbp1' and cbi='$cbi1' and indig='$indig1' and iard='$iard1' and ctconso='$ctconso1' ORDER BY Nom_Usuel";
 $result8=odbc_exec($conn, $query8); 

J'arrive quand même à afficher un beau tableau en html avec
while (odbc_fetch_row($result8)) {...
Mais le problème est au niveau du tri.
Merci
et bien, avec

ORDER BY Nom_Usuel";


normalement ton tableau est trié.
comme tu as demandé, je t'ai donné un code permettant d'éviter le foreach et donc d'avoir une requete SQL qui renvoie toutes des demandes en un seul coup.

par contre, si

ORDER BY Nom_Usuel";


ne renvoie pas les données triées sur ce champ, ta DB a un problème...

tu peux ensuite utiliser un algorythme de tri comme QuickSort
Après avoir passé des heures , je suis revenu sur ta solution qui consistait à présenter les variables sous la forme 'var1','var2','var3' et faire "select ....where variable IN ($var).
J'ai toujours fait des "select ... where variable=$var
Pas bon d'avoir des habitudes.
Merci de ton aide
pas de quoi, le SQL est un langage à part entière et non pas une simple feature de PHP.
Parfois on peut résumer tout un algo de PHP en tirant profit des fonctionalités avancées de MySQL !