(ORDER BY) impossible de trier une liste avec un ORDER BY
Résolu
antho
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un code avec lequel je n'arrive pas à trier avec un ORDER BY. J'ai trois champs, le champ nom du produit, le champ mois et le champ année, par rapport aux recherches que je fais, tous mes ORDER BY fonctionnent sauf mon ORDER BY lié au nom de mon produit,
voici mon code :
J'ai un code avec lequel je n'arrive pas à trier avec un ORDER BY. J'ai trois champs, le champ nom du produit, le champ mois et le champ année, par rapport aux recherches que je fais, tous mes ORDER BY fonctionnent sauf mon ORDER BY lié au nom de mon produit,
voici mon code :
$requete = 'SELECT * from licenceseset WHERE 1=1'; if (isset($_GET['nomProduit']) AND $_GET['nomProduit']!="tous"){ $requete .= ' AND nomProduit LIKE"%'.$_GET['nomProduit'].'%"'; } /*if (isset($_GET['licence']) AND ($_GET['licence'] == "expiremois")){ $requete .= ' AND dateExpiration >= DATE(NOW() + INTERVAL 0 MONTH) AND dateExpiration <= DATE(NOW() + INTERVAL 1 MONTH)'; }*/ if ($_GET['moisSelec'] != "all" AND $_GET['annee'] == "ALL" ){ $requete .= ' AND MONTH(dateExpiration) = '.$_GET["moisSelec"].' ORDER BY dateExpiration ASC'; } if ($_GET['moisSelec'] != "all" AND $_GET['annee'] != "ALL" ){ $requete .= ' AND MONTH(dateExpiration) = '.$_GET["moisSelec"].' AND YEAR(dateExpiration) = '.$_GET["annee"].' ORDER BY dateExpiration ASC'; } if ($_GET['moisSelec'] == "all" AND $_GET['annee'] != "ALL" ){ $requete .= ' AND YEAR(dateExpiration) = '.$_GET["annee"].' ORDER BY dateExpiration ASC'; } $stmt = $pdo->prepare($requete); $stmt->execute(); $resu = $stmt->fetchALL();
A voir également:
- (ORDER BY) impossible de trier une liste avec un ORDER BY
- Liste déroulante excel - Guide
- Trier un tableau excel - Guide
- Order@live-helper.com - Forum Consommation & Internet
- Files by google - Accueil - Applications & Logiciels
- Cxl by christian lacroix canapé avis - Forum Vos droits sur internet
6 réponses
Bonjour,
Pour commencer.. fais donc un echo de ta variable $requete et regarde ce qu'elle contient.
Sert toi du résultat obtenu pour tester la requête DIRECTEMENT dans ta bdd ( via l'onglet requête de PHPMYADMIN ) et ainsi t'assurer que ta requête fonctionne...
Au passage, vu que tu utilises PDO, merci d'appliquer ceci :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
Ainsi que ça
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
Pour commencer.. fais donc un echo de ta variable $requete et regarde ce qu'elle contient.
Sert toi du résultat obtenu pour tester la requête DIRECTEMENT dans ta bdd ( via l'onglet requête de PHPMYADMIN ) et ainsi t'assurer que ta requête fonctionne...
Au passage, vu que tu utilises PDO, merci d'appliquer ceci :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
Ainsi que ça
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
antho
J'ai testé et ma requête fonctionne, le seul truc qui fais que mon ORDER BY ne fonctionne pas seulement pour le nom de produit c'est le
. Avec le LIKE je n'arrive pas à appliquer le ORDER BY alors que dans le reste du code ou le LIKE n'existe pas et est remplacé par un =, le ORDER BY fonctionne mais si je remplace le LIKE par un =, ma page ne s'affiche plus :/
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, quel résultat obtiens-tu quand "ORDER BY ne fonctionne pas"?
Si je met le ORDER BY juste après le LIKE, le ORDER BY fonctionne pour le nom de produit et la recherche fonctionne aussi si on met n'importe quel nom de produit mais dès que je rentre une année ou un mois dans la barre de recherche, plus rien ne s'affiche, ça me dit qu'aucune licence ne correspond à ce résultat pour toutes les années et tous les mois, en gros si je met le ORDER BY après le LIKE, ma recherche ne fonctionne seulement pour le nom de produit.
Voici ma requête :
Voici ce qui me permet de faire une recherche par nom de produit mais sans le tri avec le ORDER BY
Sans le ORDER BY, toutes mes recherches fonctionnent sauf que quand je fais une recherche par nom de produit, ce dernier ne se trie pas.
Voici ce qui me permet de faire ma recherche par mois et par année, trié par les ORDER BY
Quand je fais une recherche par mois ou année sans spécifié le nom de produit, toue ma recherche est bien trié grace aux ORDER BY.
Mais quand je rajoute le ORDER BY à la fin de ma requête pour le nom de produit, dès que je fais une recherche avec une année ou avec un mois spécifié j'ai un message avec écrit "aucune licence ne correspond à ce résultat" alors que si j'enlève ce ORDER BY problématique, mes recherches fonctionnent mais le trie ne se fait pas :/
$requete = 'SELECT * from licenceseset WHERE 1=1';
Voici ce qui me permet de faire une recherche par nom de produit mais sans le tri avec le ORDER BY
if (isset($_GET['nomProduit']) AND $_GET['nomProduit']!="tous"){ $requete .= ' AND nomProduit LIKE"%'.$_GET['nomProduit'].'%"'; }
Sans le ORDER BY, toutes mes recherches fonctionnent sauf que quand je fais une recherche par nom de produit, ce dernier ne se trie pas.
Voici ce qui me permet de faire ma recherche par mois et par année, trié par les ORDER BY
if ($_GET['moisSelec'] != "all" AND $_GET['annee'] == "ALL" ){ $requete .= ' AND MONTH(dateExpiration) = '.$_GET["moisSelec"].' ORDER BY dateExpiration ASC'; } if ($_GET['moisSelec'] != "all" AND $_GET['annee'] != "ALL" ){ $requete .= ' AND MONTH(dateExpiration) = '.$_GET["moisSelec"].' AND YEAR(dateExpiration) = '.$_GET["annee"].' ORDER BY dateExpiration ASC'; } if ($_GET['moisSelec'] == "all" AND $_GET['annee'] != "ALL" ){ $requete .= ' AND YEAR(dateExpiration) = '.$_GET["annee"].' ORDER BY dateExpiration ASC'; }
Quand je fais une recherche par mois ou année sans spécifié le nom de produit, toue ma recherche est bien trié grace aux ORDER BY.
Mais quand je rajoute le ORDER BY à la fin de ma requête pour le nom de produit, dès que je fais une recherche avec une année ou avec un mois spécifié j'ai un message avec écrit "aucune licence ne correspond à ce résultat" alors que si j'enlève ce ORDER BY problématique, mes recherches fonctionnent mais le trie ne se fait pas :/
Si je ne met pas le ORDER BY dans
Donc si je met le ORDER BY, la recherche ne fonctionne plus et si je ne le met pas, mes licences ne sont pas triées, c'est donc ça mon problème :/
$requete .= ' AND nomProduit LIKE"%'.$_GET['nomProduit'].'%"';, la recherche fonctionne parfaitement mais les licences ne sont pas triées :/
Donc si je met le ORDER BY, la recherche ne fonctionne plus et si je ne le met pas, mes licences ne sont pas triées, c'est donc ça mon problème :/
La clause ORDER BY doit se trouver A LA FIN de la requête
Après éventuellement toutes les conditions qui se situent dans le WHERE...
Pour voir ce qui ne fonctionne pas il serait bien :
1 - d'appliquer le contenu des liens que je t'ai donné
2 - Nous montrer le code corrigé ( en appliquant les liens que je t'ai donné )
3 - Que tu fasses un echo de ta variable $requete pour voir à quoi elle ressemble lorsque ça ne marche pas
3 bis - Que tu nous montres ce que te donne ton echo
3 ter - Que tu copies/colle cette requête ainsi récupérée directement dans ton phpmyadmin pour voir si elle fonctionne
Après éventuellement toutes les conditions qui se situent dans le WHERE...
Pour voir ce qui ne fonctionne pas il serait bien :
1 - d'appliquer le contenu des liens que je t'ai donné
2 - Nous montrer le code corrigé ( en appliquant les liens que je t'ai donné )
3 - Que tu fasses un echo de ta variable $requete pour voir à quoi elle ressemble lorsque ça ne marche pas
3 bis - Que tu nous montres ce que te donne ton echo
3 ter - Que tu copies/colle cette requête ainsi récupérée directement dans ton phpmyadmin pour voir si elle fonctionne
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question<?php // récupération PROPRE des variables AVANT de les utiliser! $nomProduit = !empty($_GET['nomProduit']) ? trim($_GET['nomProduit']) : NULL; $annee = !empty($_GET['annee']) ? trim($_GET['annee']) : NULL; $moisSelec = !empty($_GET['moisSelec']) ? trim($_GET['moisSelec']) : NULL; // Préparation de la requête $requete = 'SELECT * from licenceseset WHERE 1=1 '; $orderBy = ""; $datas = array(); if ($nomProduit && $nomProduit != 'tous') { $requete .= ' AND nomProduit LIKE "%' . $nomProduit . '%"'; $orderBy .= " nomProduit ASC "; } if ($moisSelec == 'all') { if ($annee != 'ALL') { $requete .= ' AND YEAR(dateExpiration) = :annee '; $datas[':annee'] = $annee; $orderBy .= " dateExpiration ASC "; } } else { if ($annee == 'ALL') { $requete .= ' AND MONTH(dateExpiration) = :moisSelec '; $datas[':moisSelect'] = $moisSelec; $orderBy .= " dateExpiration ASC "; } else { $requete .= ' AND MONTH(dateExpiration) = :moisSelec AND YEAR(dateExpiration) = :annee '; $datas[':moisSelect'] = $moisSelec; $datas[':annee'] = $annee; $orderBy .= " dateExpiration ASC "; } } if (!empty($orderBy)) { $requete .= ' ORDER BY ' . $orderBy; } //exécution PROPRE de la requête (dans un bloc TRY/CATCH ) try { $stmt = $pdo->prepare($requete); $stmt->execute($datas); $resu = $stmt->fetchAll(); } catch (Exception $e) { echo "Erreur dans la requete : " . $requete; echo "<br>" . $e->getMessage(); echo "<br> DATAS : " . print_r($datas, true); }
Il nous manque un certain nombre d'informations...
À commencer par le contenu des variable qui se trouve dans ton url...
Pourrais-tu faire un
Au début de ton script PHP et nous montrer ce que ça donne ?
vu ton message d'erreur, il serait bien également de nous montrer l'intégralité de ton code... Y compris ton formulaire de recherche...
À commencer par le contenu des variable qui se trouve dans ton url...
Pourrais-tu faire un
print_r($_GET);
Au début de ton script PHP et nous montrer ce que ça donne ?
vu ton message d'erreur, il serait bien également de nous montrer l'intégralité de ton code... Y compris ton formulaire de recherche...
J'en ai profité pour faire quelques corrections au code
<?php var_dump($_GET);//le temps des tests // récupération PROPRE des variables AVANT de les utiliser! $nomProduit = !empty($_GET['nomProduit']) ? trim($_GET['nomProduit']) : NULL; $annee = !empty($_GET['annee']) ? trim($_GET['annee']) : NULL; $moisSelec = !empty($_GET['moisSelec']) ? trim($_GET['moisSelec']) : NULL; // Préparation de la requête $requete = 'SELECT * from licenceseset WHERE 1=1 '; $orderBy = array(); $datas = array(); if ($nomProduit && $nomProduit != 'tous') { $requete .= ' AND nomProduit LIKE "%' . $nomProduit . '%"'; $orderBy[]= " nomProduit ASC "; } if ( $moisSelec == 'all') { if ($annee && $annee != 'ALL') { $requete .= ' AND YEAR(dateExpiration) = :annee '; $datas[':annee'] = $annee; $orderBy[]= " dateExpiration ASC "; } } elseif($moisSelec) { $requete .= ' AND MONTH(dateExpiration) = :moisSelec '; $datas[':moisSelect'] = $moisSelec; if($annee) { $requete .= ' AND YEAR(dateExpiration) = :annee '; $datas[':annee'] = $annee; } $orderBy[] = " dateExpiration ASC "; } if (!empty($orderBy)) { $requete .= ' ORDER BY ' . implode (",",$orderBy); } //exécution PROPRE de la requête (dans un bloc TRY/CATCH ) try { $stmt = $pdo->prepare($requete); $stmt->execute($datas); $resu = $stmt->fetchAll(); } catch (Exception $e) { echo "Erreur dans la requete : " . $requete; echo "<br>" . $e->getMessage(); echo "<br> DATAS : " . print_r($datas, true); } //le temps des tests : if(empty($resu)){ echo "<br> Requete :" . $requete ; echo "<br>Datas :<br>"; print_r($datas); }
Merci mais j'ai trouvé finalement,
j'avais
Mais du coup il me manquait juste :
j'avais
if ($_GET['moisSelec'] != "all" AND $_GET['annee'] == "ALL" ){ $requete .= ' AND MONTH(dateExpiration) = '.$_GET["moisSelec"].' ORDER BY dateExpiration ASC'; } if ($_GET['moisSelec'] != "all" AND $_GET['annee'] != "ALL" ){ $requete .= ' AND MONTH(dateExpiration) = '.$_GET["moisSelec"].' AND YEAR(dateExpiration) = '.$_GET["annee"].' ORDER BY dateExpiration ASC'; } if ($_GET['moisSelec'] == "all" AND $_GET['annee'] != "ALL" ){ $requete .= ' AND YEAR(dateExpiration) = '.$_GET["annee"].' ORDER BY dateExpiration ASC'; }
Mais du coup il me manquait juste :
if ($_GET['moisSelec'] == "all" AND $_GET['annee'] == "ALL" ){ $requete .= ' AND YEAR(dateExpiration) = '.$_GET["annee"].' ORDER BY dateExpiration ASC'; }