Comment trier un requete pdo en fonction des champs remplis
Résolu/Fermé
Aaymeric
Messages postés
78
Date d'inscription
jeudi 29 septembre 2011
Statut
Membre
Dernière intervention
7 octobre 2018
-
23 mars 2015 à 16:45
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 25 mars 2015 à 17:50
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 25 mars 2015 à 17:50
A voir également:
- Comment trier un requete pdo en fonction des champs remplis
- Fonction si et - Guide
- Fonction trier excel - Guide
- Fonction somme excel - Guide
- Fonction moyenne excel - Guide
- Virginie organise un rallye avec 30 équipes. elle veut créer un code pour désigner chaque équipe. elle a commencé à la main, mais elle voudrait le faire calculer à l'aide d'une formule. proposez une formule comportant une seule fonction et à recopier vers le bas dans la colonne a du fichier à télécharger. quelle formule sera en a9 ? ✓ - Forum Programmation
4 réponses
jordane45
Messages postés
38145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 avril 2024
4 650
23 mars 2015 à 17:57
23 mars 2015 à 17:57
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.......)
Aaymeric
Messages postés
78
Date d'inscription
jeudi 29 septembre 2011
Statut
Membre
Dernière intervention
7 octobre 2018
23 mars 2015 à 21:51
23 mars 2015 à 21:51
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(); }
jordane45
Messages postés
38145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 avril 2024
4 650
Modifié par jordane45 le 23/03/2015 à 22:21
Modifié par jordane45 le 23/03/2015 à 22:21
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
Aaymeric
Messages postés
78
Date d'inscription
jeudi 29 septembre 2011
Statut
Membre
Dernière intervention
7 octobre 2018
24 mars 2015 à 19:59
24 mars 2015 à 19:59
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 ?
jordane45
Messages postés
38145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 avril 2024
4 650
Modifié par jordane45 le 24/03/2015 à 20:27
Modifié par jordane45 le 24/03/2015 à 20:27
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(); }
Aaymeric
Messages postés
78
Date d'inscription
jeudi 29 septembre 2011
Statut
Membre
Dernière intervention
7 octobre 2018
25 mars 2015 à 16:08
25 mars 2015 à 16:08
Je vais un peu méditer dessus car il ne reprend pas toutes les annonces de ma bdd lorsqu'il n'y pas de recherche précise mais je te remercie déjà fort pour ce beau bout de code ! :)
jordane45
Messages postés
38145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 avril 2024
4 650
>
Aaymeric
Messages postés
78
Date d'inscription
jeudi 29 septembre 2011
Statut
Membre
Dernière intervention
7 octobre 2018
25 mars 2015 à 16:23
25 mars 2015 à 16:23
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
Aaymeric
Messages postés
78
Date d'inscription
jeudi 29 septembre 2011
Statut
Membre
Dernière intervention
7 octobre 2018
25 mars 2015 à 16:23
25 mars 2015 à 16:23
J'ai supprimé l'accolade après les closeCursor() et tout fonctionne parfaitement. tu es un PRO ! Un tout tout tout grand merci !
jordane45
Messages postés
38145
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 avril 2024
4 650
25 mars 2015 à 17:50
25 mars 2015 à 17:50
;-)
PS:
Si la question est résolue..
Merci de ne pas oublier de clôturer le sujet
(en cliquant sur le lien "Marquer comme résolu" qui se trouve sous le titre de la question)
Cordialement,
Jordane
PS:
Si la question est résolue..
Merci de ne pas oublier de clôturer le sujet
(en cliquant sur le lien "Marquer comme résolu" qui se trouve sous le titre de la question)
Cordialement,
Jordane