Comment trier un requete pdo en fonction des champs remplis
Résolu
Aaymeric
Messages postés
78
Date d'inscription
Statut
Membre
Dernière intervention
-
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je souhaite trier ma requête PDO en fonction des champs remplis par l'utilisateur qui est
- une recherche selon un titre
- selon une catégorie
- et selon le prix.
Mais comment je peux m'arranger pour éviter de faire 9 if et optimiser le code ? Et comment je peux éviter de faire un if avec 50 lignes de code du résultat de la requete sans trie et un else avec les 50 lignes de code avec trie.
Car ca fait 2h que j'essaie quelque chose mais j'ai des messages d'erreur et ca ne ressemble à rien. Je pense que ce n'est pas la bonne manière de faire. Je veux bien vous afficher le code mais vous risquerez de commencer les explications sur une mauvaise base et ca risque d'être une perte de temps :s
Je souhaite trier ma requête PDO en fonction des champs remplis par l'utilisateur qui est
- une recherche selon un titre
- selon une catégorie
- et selon le prix.
Mais comment je peux m'arranger pour éviter de faire 9 if et optimiser le code ? Et comment je peux éviter de faire un if avec 50 lignes de code du résultat de la requete sans trie et un else avec les 50 lignes de code avec trie.
Car ca fait 2h que j'essaie quelque chose mais j'ai des messages d'erreur et ca ne ressemble à rien. Je pense que ce n'est pas la bonne manière de faire. Je veux bien vous afficher le code mais vous risquerez de commencer les explications sur une mauvaise base et ca risque d'être une perte de temps :s
A voir également:
- Comment trier un requete pdo en fonction des champs remplis
- Comment trier par ordre alphabétique sur excel - Guide
- Fonction si et - Guide
- Logiciel pour trier les photos automatiquement - Guide
- Les documents remplis - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
4 réponses
Bonjour,
Sachant que tu parles de tri .... tu peux déjà utiliser (si ce n'est pas déjà fait) l'instruction ORDER BY (dans ta requête SQL).
Mais.... Sans voir ton code ... impossible de t'aider !
Il nous faut la structure de tes tables.....
Que tu nous montres ta requête actuelle
Que tu nous dises comment tu veux trier (et comment.. à partir de quels champs.......)
Sachant que tu parles de tri .... tu peux déjà utiliser (si ce n'est pas déjà fait) l'instruction ORDER BY (dans ta requête SQL).
Mais.... Sans voir ton code ... impossible de t'aider !
Il nous faut la structure de tes tables.....
Que tu nous montres ta requête actuelle
Que tu nous dises comment tu veux trier (et comment.. à partir de quels champs.......)
Bien sûr et le voici. Je n'ai pas de message d'erreur mais dans le codage je crois qu'il y a une erreur au niveau de de mon $exe
$reqa = "SELECT * FROM objet WHERE onoff = 'no' "; $reqb = " ORDER BY date DESC"; $search = false; $exe=NULL; if(isset($_GET['titre']) && !empty($_GET['titre'])) { $titre = htmlspecialchars($_GET['titre']); $reqa = $reqa.' AND titre = ?'; $exe = $titre; $search = true; } if(isset($_GET['categorie']) && !empty($_GET['categorie'])) { $categorie = htmlspecialchars($_GET['categorie']); $reqa = $reqa.' AND categorie = ?'; $search = true; if(isset($exe)){ $exe = $exe.','. $categorie.''; } else { $exe = $categorie; } } if(isset($_GET['prix']) && !empty($_GET['prix'])) { $prix = htmlspecialchars($_GET['prix']); $reqa = $reqa.' AND valeur = ?'; $search = true; if(isset($exe)){ $exe = $exe.','. $prix.''; } else { $exe = $prix; } } if ($search == true && isset($exe)){ echo $reqa.$reqb.'<br \>'; echo 'array('.$exe.')'; } else { $req = $bdd->prepare("".$reqa.$reqb.""); $req->execute($exe); while ($donnees = $req->fetch()){ $description = $donnees['description']; if(strlen($description) >= 50){ $description = substr($description, 0, 100).'...'; } $req2 = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ?'); $req2->execute(array($donnees['pseudo'])); while ($info = $req2->fetch()){ echo' <div id="annonce"> <div id="imageannonce"> <p><img src="'.$donnees['urlpictmini'].'" alt="Photo objet" /></p> </div> <p> <span class="titreannonce">'.$donnees['titre'].'</span><br \> <span class="descriptionannonce"><a href="viewobj.php?id='.$donnees['id'].'&p='.$donnees['pseudo'].' ">'.$description.'</a></span><br \> Prix: '.$donnees['valeur'].' </p> </div> <div id="infomembre"> Emis par: '.$info['pseudo'].'('.$info['echanges'].') <br \> L\'objet se trouve à: '.$info['commune'].'<br \> </div> '; ; } } $req->closeCursor(); $req2->closeCursor(); }
Oula..
bon .. je ne vais pas tout reprendre ...
mais je pense que ça :
ça ne marche pas !
Essayes ça
et pour voir si c'est ok, le temps des tests ...
Cordialement,
Jordane
bon .. je ne vais pas tout reprendre ...
mais je pense que ça :
echo 'array('.$exe.')';
ça ne marche pas !
Essayes ça
$reqa = "SELECT * FROM objet WHERE onoff = 'no' "; $reqb = " ORDER BY date DESC"; $search = false; $exe = array(); //récupération des variables : $titre = isset($_GET['titre']) && !empty($_GET['titre']) ? htmlspecialchars($_GET['titre']) : NULL; $categorie = isset($_GET['categorie']) && !empty($_GET['categorie']) ?htmlspecialchars($_GET['categorie']) : NULL; //création de la requête et des paramètres if($titre) { $reqa .= ' AND titre = ? '; $exe[] = $titre; $search = true; } if($categorie) { $reqa .=' AND categorie = ? '; $search = true; $exe[] = $categorie; } //etc...
et pour voir si c'est ok, le temps des tests ...
//le temps des tests echo "<br> La requête est :<br>".$reqa.$reqb; echo "<br> Les variables :<br>"; print_r($exe); //------------------------ $req = $bdd->prepare($reqa.$reqb); $req->execute($exe);
Cordialement,
Jordane
Le but était aussi de faire en sorte que même si les champs titre, catégorie et valeur ne sont pas complétés, le $req -> execute($exe) s'exécute également même si la variable $exe n'existe pas. Je ne comprends pas ton code, est-ce que tu as pris en compte la possibilité que l'un des champ ne soit pas complété et que $exe se modifie par la même occasion ?
Le code que j'ai écris ne me donne aucun message d'erreur et si titre=test catégorie=toto et prix=123
il va mettre dans l'execute: $req->execute(array(test, toto, 123)) c'est correcte d'écrire ca ?
Le code que j'ai écris ne me donne aucun message d'erreur et si titre=test catégorie=toto et prix=123
il va mettre dans l'execute: $req->execute(array(test, toto, 123)) c'est correcte d'écrire ca ?
Je ne comprends pas ton code, est-ce que tu as pris en compte la possibilité que l'un des champ ne soit pas complété et que $exe se modifie par la même occasion ?
Oui
Vu que tu ne comprends pas mon code... tu ne seras pas en mesure de le compléter par toi même donc.. voici :
Testes ça :
//récupération des variables : $titre = isset($_GET['titre']) && !empty($_GET['titre']) ? htmlspecialchars($_GET['titre']) : NULL; $categorie = isset($_GET['categorie']) && !empty($_GET['categorie']) ?htmlspecialchars($_GET['categorie']) : NULL; $prix = isset($_GET['prix']) && !empty($_GET['prix']) ? htmlspecialchars($_GET['prix']) : NULL;* $reqa = "SELECT * FROM objet WHERE onoff = 'no' "; $reqb = " ORDER BY date DESC"; $exe = array(); //création de la requête et des paramètres if($titre) { $reqa .= ' AND titre = ? '; $exe[] = $titre; } if($categorie) { $reqa .=' AND categorie = ? '; $exe[] = $categorie; } if($prix) { $reqa .= ' AND valeur = ? '; $exe[] = $categorie; } //-----------------------------------------// // le temps des tests //-----------------------------------------// echo "<pre>"; echo "<br>La requête est : <br>".$reqa.$reqb; echo "<br>exe = : <br>"; print_r($exe); echo "</pre>"; //-----------------------------------------// //execution de la requête try{ $req = $bdd->prepare($reqa.$reqb); $req->execute($exe); }catch (Exception $e) { echo '<br> Erreur : ', $e->getMessage(), "<br>"; } while ($donnees = $req->fetch()){ $description = $donnees['description']; if(strlen($description) >= 50){ $description = substr($description, 0, 100).'...'; } try{ $req2 = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ?'); $req2->execute(array($donnees['pseudo'])); }catch (Exception $e) { echo '<br> Erreur : ', $e->getMessage(), "<br>"; } while ($info = $req2->fetch()){ echo' <div id="annonce"> <div id="imageannonce"> <p><img src="'.$donnees['urlpictmini'].'" alt="Photo objet" /></p> </div> <p> <span class="titreannonce">'.$donnees['titre'].'</span><br \> <span class="descriptionannonce"><a href="viewobj.php?id='.$donnees['id'].'&p='.$donnees['pseudo'].' ">'.$description.'</a></span><br \> Prix: '.$donnees['valeur'].' </p> </div> <div id="infomembre"> Emis par: '.$info['pseudo'].'('.$info['echanges'].') <br \> L\'objet se trouve à: '.$info['commune'].'<br \> </div> '; ; } } $req->closeCursor(); $req2->closeCursor(); }
Bon après... je pense que l'on pourrait encore améliorer la chose en ne faisant qu'une Seule requête (plutôt que de refaire une requête dans ta boucle....)
Pour cela.. il faudrait utiliser une Jointure
par contre... sans connaitre la structure de tes tables (et leur contenu) difficile de t'en dire plus...
(l'idéal serait que tu nous fournisses un DUMP de tes tables).
Mais ça devrait ressembler à un truc du genre :
Je t'invite à tester cette requête en Direct dans ta BDD .. et de regarder ce qu'elle te retourne.
Au cas où : https://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql
Pour cela.. il faudrait utiliser une Jointure
par contre... sans connaitre la structure de tes tables (et leur contenu) difficile de t'en dire plus...
(l'idéal serait que tu nous fournisses un DUMP de tes tables).
Mais ça devrait ressembler à un truc du genre :
$reqa = "SELECT * FROM objet O LEFT JOIN membres M ON O.pseudo = M.pseudo WHERE onoff = 'no' "; $reqb = " ORDER BY date DESC";
Je t'invite à tester cette requête en Direct dans ta BDD .. et de regarder ce qu'elle te retourne.
Au cas où : https://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql