8795 sujets

Développement web côté serveur, CMS

Pages :
Bonjour Smiley biggrin ,

J'ai une requete sql qui tri les résultats par prix, j'aimerai proposer à l'utilisateur le choix du tri (par prix croissant, décroissant, par date...etc).
de quel façon peut on faire cela?

Voici ma requete:

$sel = "SELECT *, date_format(date_annonce, '%d/%m/%Y') as date_annonce FROM $tables WHERE $whereReq ORDER BY prix ASC LIMIT ".$start.",".$nb_results_p_page;


Merci de votre aide...
Hello Sclormu,

il faut alimenter une variable (par exemple $orderby) qui contiendra le champ et la "direction" :
<?php
$orderby = "prix ASC ";
//$orderby = "prix DESC ";
//$orderby = "date_annonce ASC ";
//$orderby = "date_annonce DESC ";
$sel = "SELECT *, date_format(date_annonce, '%d/%m/%Y') as date_annonce FROM $tables WHERE $whereReq ORDER BY $orderby LIMIT ".$start.",".$nb_results_p_page;
?>

A+ Smiley cligne
Bonjour,

Ben en faite je ne sais pas comment faire le lien qui permet d'appeler la variable... Smiley confused

je pensais qu'il suffisait de rajouter orderby=prix ASC dans le lien...
Sclormu a écrit :
Ben en faite je ne sais pas comment faire le lien qui permet d'appeler la variable... Smiley confused
Et bien il y a plusieurs manières de faire mais puisque tu parles de lien je suppose que tu as quelque chose qui ressemble à un tableau avec quelques colonnes (prix, date, etc...) auxquelles tu voudrais mettre par exemple une flèche vers le haut et une flèche vers le bas pour faire le tri DESCendant ou ASCendant ?

Si c'est bien ça, tu pourrais par exemple avoir comme liens :

* colonne : prix flèche haut (du plus grand au plus petit)
-> lien : href = "?tri=prix_desc"

* colonne : prix flèche bas (du plus petit au plus grand)
-> lien : href = "?tri=prix_asc"

* colonne : date flèche haut
-> lien : href = "?tri=date_desc"

* colonne : date flèche haut
-> lien : href = "?tri=date_desc"

remarque : le fait de ne rien mettre avant le ? rappelle automatiquement la page en cours Smiley cligne

Ensuite tu récupères la variable tri en method get et si elle est reconnue comme faisant partie des valeurs possibles tu alimentes ta variable en conséquence, et sinon par défaut. Ce qui donne quelque chose comme :
<?php
// Récupération de la variable tri si elle est dans l'URL
$tri = (!empty($_GET['tri'])) ? $_GET['tri'] : '';

// Liste des valeurs possibles de tri
$tris_possibles = array(
	'prix_asc'	=>	'prix ASC ',
	'prix_desc'	=>	'prix DESC ',
	'date_asc'	=>	'date_annonce ASC ',
	'date_desc'	=>	'date_annonce DESC ');
	
// Si la variable tri fait partie des valeurs possibles on alimente 
// $orderby avec la correspondance, sinon on met une valeur par défaut
if(array_key_exists($tri, $tris_possibles)) {
	$orderby = $tris_possibles[$tri];
} else {
	$orderby = 'nom_produit ASC '; // valeur par défaut
}

// du code

// plus loin la requête devient 
$sel = "SELECT *, date_format(date_annonce, '%d/%m/%Y') as date_annonce FROM $tables WHERE $whereReq ORDER BY $orderby LIMIT ".$start.",".$nb_results_p_page;

// la suite...
?>

A+
Modifié par Heyoan (12 Dec 2007 - 02:12)
Oui et surtout filtres bien ta variable GET comme te l'as suggéré Heyoan car mettre du SQL dans une variable GET ca revient à mettre une pancarte : "Allez y entrez dans ma base et faites y ce que vous voulez!!!". Un utilisateur mal intentionné pour rajouter à la main une requete SQL après ce code que tu récuperes en GET dans l'URL. Si tu ne le savais pas ca s'appelle de l'injection SQL. Il faut y etre sensibilisé pour éviter de transformer un site web en passoire...
Magnifique, exactement ce que je voulais, cela fonctionne parfaitement... Smiley biggrin

Merci Heyoan de ton aide et de ta précision...
Merci skywalk3r pour ton conseil...

Bonne journée a+
Modifié par Sclormu (13 Dec 2007 - 14:26)
bonjour,

j'ai remarquer que dans mes différents tri il y en a un qui ne fonctionne pas correctement, le tri de la date ne se fait pas dans le bon ordre... c'est curieux car dan phpmyadmin le tri est le bon. Est ce parce que j'ai mis la date au format français?
Sclormu a écrit :
Est ce parce que j'ai mis la date au format français?
Et bien oui Smiley cligne ! En mettant la date sous la forme AAAAMMJJ il n'y a plus de problème !
Bonjour Heyoan,

La date est dans le bon format dans la bdd, je la met au format français de cette façon:

$sel = "SELECT *, date_format(date_annonce, '%d/%m/%Y') as date_annonce


Sinon est qu'il a une autre methode pour l'afficher au format français?
Euh... je comprends pas : si tu vas dans phpmyadmin / SQL et que tu fais
SELECT * , date_format( date_annonce, '%d/%m/%Y' ) AS date_annonce FROM matable ORDER BY date_annonce DESC 
ça doit fonctionner si date_annonce est bien au format date (par défaut AAAA-MM-JJ), non ?

En passant, quand j'utilise le AS je renomme le champ pour que les choses soient plus claires. Par exemple : SELECT date_format( date_annonce, '%d/%m/%Y' ) AS date_fr
Modifié par Heyoan (13 Dec 2007 - 15:29)
a écrit :
Euh... je comprends pas : si tu vas dans phpmyadmin / SQL et que tu fais

SELECT * , date_format( date_annonce, '%d/%m/%Y' ) AS date_annonce FROM matable ORDER BY date_annonce DESC

ça doit fonctionner si date_annonce est bien au format date (par défaut AAAA-MM-JJ), non ?


mince, l'ordre d'affichage est dans le désordre... Smiley confus

Est ce que ma requete est mauvaise?
Et bien à priori tu ne formates pas le champ avant de faire ton INSERT. Par exemple :
$date_annonce = date('Y-m-d');


Si tu fais juste SELECT date_annonce FROM matable c'est formaté comment ?
Modifié par Heyoan (13 Dec 2007 - 16:54)
a écrit :
Si tu fais juste SELECT date_annonce FROM matable c'est formaté comment ?


comme ceci:

date_annonce
2007-04-17
2007-11-01
2007-07-08
2007-09-26
2007-10-24
2007-10-17
Ben... c'est bon Smiley rolleyes !

Si tu fais
SELECT date_format( date_annonce, '%d/%m/%Y' ) AS date_fr FROM matable ORDER BY date_annonce DESC 
ça ne met pas les dates de la plus haute à la plus basse ?
a écrit :
Si tu fais

SELECT date_format( date_annonce, '%d/%m/%Y' ) AS date_fr FROM matable ORDER BY date_annonce DESC

ça ne met pas les dates de la plus haute à la plus basse ?


Si cela fonctionne dans phpmyadmin mais pas sur ma page...

Où est le bug?

$sel = "SELECT *, date_format(date_annonce, '%d/%m/%Y') as date_annonce FROM $tables WHERE $whereReq ORDER BY $orderby LIMIT ".$start.",".$nb_results_p_page;
quand je remplace:

as date_annonce


par:

AS date_fr


l'ordre est le bon mais n'est plus au format français... Smiley confus
Sclormu a écrit :
Où est le bug?
Ça ressemble bien à un problème d'inattention Smiley langue : est-ce que par hasard tu ne continuerais pas d'afficher date_annonce au lieu de date_fr ?
Oui ça y ressemble bien... petite précision, MySQL, pour le order by prend en priorité les alias s'ils ont été définis dans le select, c'est pour ça qu'il faut éviter de donner un nom d'alias qui se trouve dans la liste des champs... un peu ambigü.

Ou alors il faut préciser sur quel champ de quel table on veut faire le order by. Mais dans ce cas il faut aliasser la table.
a écrit :
est-ce que par hasard tu ne continuerais pas d'afficher date_annonce au lieu de date_fr ?


J'ai bien mis as date_fr, ce qui tri correctement les dates (c'est ce que je souhaitai) mais le format n'est plus en français ... Smiley decu
Pages :