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

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


0
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
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();
				}
0
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
Oula..
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
0
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
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 ?
0
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

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();
}
 
0
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
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 ! :)
0
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
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 :
$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
0
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
J'ai supprimé l'accolade après les closeCursor() et tout fonctionne parfaitement. tu es un PRO ! Un tout tout tout grand merci !
0
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
;-)

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
0