Ordre croissant ou decroissant

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Ordre croissant ou decroissant

par Ryle » 25 oct. 2007, 14:14

flute.. j'étais pas remonté aussi loin dans les précédents posts :?

par Truc » 25 oct. 2007, 12:37

à la base ça avait été expliqué dans le sujet que j'ai proposé tout au début :roll:

par Ryle » 25 oct. 2007, 11:13

Bah c'est un peu logique que le sens soit toujours le même :
si $_GET['ordre']=='support', alors $ordre sera toujours égal à 'support' et donc toujours un tri desc.

Déjà tu peux grandement simplifier l'écriture en utilisant la valeur passée en paramètre :
$ordre = (isset ($_GET['ordre']))? $_GET['ordre'] : 'id';  

$sql = "SELECT ... 
  FROM prix_pao 
  ORDER BY ".mysql_real_escape_string($ordre)."_prix"; 
Une seule requête et un paramètre qui détermine l'ordre de tri, c'est quand même plus lisible.

Quant au sens de tri, bah le plus simple c'est un second paramètre qui viendra compléter la requête, par exemple :
<?php 
  if (isSet($_GET['sens']) && $_GET['sens'] == 'asc') // si un sens est spécifié on inverse pour le lien
    $sens = 'desc';
  else // sinon 
    $sens = 'asc';
?>
<a href="xxxx.php?ordre=support&sens=<?php echo $sens; ?>" > ... </a>
Et du côté de ta requête suffit de l'inclure (avec les tests qui vont bien au préalable) :
" ORDER BY ".mysql_real_escape_string($ordre)."_prix ".$_GET['sens']; 

par kweb » 25 oct. 2007, 10:44

Je viens d'écrire différemment la syntaxe (en étudiant ce que vous avez mis précédemment)
// On récupère le paramètre de l'URL : s'il n'y en a pas, valeur 'ordre croissant' par défaut 
$ordre = (isset ($_GET['ordre']))? $_GET['ordre']: 'asc'; 
//$sql = "SELECT * FROM prix_pao";

if ($_GET['ordre']=='support')
{$sql = "SELECT * FROM prix_pao ORDER BY support_prix ".(($ordre=='support')? 'desc':'asc');}

elseif ($_GET['ordre']=='format')
{$sql = "SELECT * FROM prix_pao ORDER BY format_prix ".(($ordre=='format')? 'desc':'asc');}

elseif ($_GET['ordre']=='couleur')
{$sql = "SELECT * FROM prix_pao ORDER BY couleur_prix ".(($ordre=='couleur')? 'desc':'asc');}

elseif ($_GET['ordre']=='dossier')
{$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix ".(($ordre=='dossier')? 'desc':'asc');}

elseif ($_GET['ordre']=='date')
{$sql = "SELECT * FROM prix_pao ORDER BY date_prix ".(($ordre=='date')? 'desc':'asc');}

elseif ($_GET['ordre']=='imprimeur') 
{$sql = "SELECT * FROM prix_pao ORDER BY imprimeur_prix ".(($ordre=='imprimeur')? 'desc':'asc');}

elseif ($_GET['ordre']=='prix')
{$sql = "SELECT * FROM prix_pao ORDER BY prix_prix ".(($ordre=='prix')? 'desc':'asc');}

elseif ($_GET['ordre']=='quantite')
{$sql = "SELECT * FROM prix_pao ORDER BY quantite_prix ".(($ordre=='quantite')? 'desc':'asc');}

elseif ($_GET['ordre']=='graphiste')
{$sql = "SELECT * FROM prix_pao ORDER BY graphiste_prix ".(($ordre=='graphiste')? 'desc':'asc');}

else {$sql = "SELECT * FROM prix_pao ORDER BY id_prix";}

$sql_retour =  mysql_query($sql);
et en mettant comme lien

Code : Tout sélectionner

<a href="xxxx.php?ordre=support">
Tous fonctionne correctement !!!!

Quelques questions :
- meme si cela fonctionne, cette syntaxe n'est elle pas trop lourde ? si oui, peut on l'optimisé ?
- Tout fonctionne bien, mais dans un seul sens. c'est a dire qu'une fois que l'on a cliqué sur le lien, si je re-clique dessus, je ne peux pas les remettre en ordre ASC.
Peut on le faire ?

Merci

par kweb » 25 oct. 2007, 10:12

il y a vraiment de quoi s'arraché les cheveux quand on débute :lol:
même en mettant "mysql_query" après mon "switch"... marche pas.

l'erreur ne viendrait il pas du lien "a href" ?
$ordre = (isset ($_GET['ordre']))? $_GET['ordre']: 'asc'; 
$sql = "SELECT * FROM prix_pao";

switch ($ordre)
{
case 'asc':
default:
$sql .= " ORDER BY id_prix";
break;
case 'support':
$sql .= " ORDER BY support_prix DESC";
break;
// etc......
}

$sql_retour =  mysql_query($sql);

//....tout le code du tableau....
<a href="xxxx.php?ordre=support">support</a> 

par Calimero » 25 oct. 2007, 10:00

Il faut déplacer la ligne mysql_query() après le bloc switch(){}. Car si ton code ressemble à celui que tu as posté plus haut, tout le travail du switch(){} ne sert à rien puisque quand on arrive au switch la requête a déjà été envoyée au serveur mysql.

par kweb » 25 oct. 2007, 09:38

Slt, j'ai bien supprimer un Default. Mais rien ne se passe lorsque je clique sur le lien ???
switch ($ordre)
					{
					  case 'asc':
					  default:
						$sql .= " ORDER BY id_prix";
						break;
					  case 'support':
						$sql .= " ORDER BY support_prix DESC";
						break;
					  case 'format':
						$sql .= " ORDER BY format_prix DESC";
						break;
					  case 'couleur':
						$sql .= " ORDER BY couleur_prix DESC";
						break;
					  case 'dossier':
						$sql .= " ORDER BY dossier_prix DESC";
						break;
					  case 'date':
						$sql .= " ORDER BY date_prix DESC";
						break;
					  case 'imprimeur':
						$sql .= " ORDER BY imprimeur_prix DESC";
						break;
					  case 'prix':
						$sql .= " ORDER BY prix_prix DESC";
						break;
					  case 'quantite':
						$sql .= " ORDER BY quantite_prix DESC";
						break;
					  case 'graphiste':
						$sql .= " ORDER BY graphiste_prix DESC";
						break;
					}
même en essayant cette syntaxe dans le lien, sa ne fonctionne pas

Code : Tout sélectionner

<a href="xxxx.php?support=<?= $ordre; ?>">support</a>

Code : Tout sélectionner

<a href="xxxx.php?ordre=support">support</a>

Code : Tout sélectionner

<a href="xxxx.php?ordre=support">support</a>
je comprend plus rien !!! :shock:

par Victor BRITO » 24 oct. 2007, 18:55

Supprime l'un des deux default dans ton switch.

par kweb » 24 oct. 2007, 18:24

Besoin de conseils
Je sais que le code ci-dessous est faux (sans même l'essayer). mais j'aurais besoin de vous pour me dire si je vais dans la bonne direction au niveau de la syntax

[1] j'ai donc mon tableau comme ceci
Je veux donc mettre un lien sur chaque intitulé de colonne, ce qui me permettrais de classer par ordre décroissant ou croissant le contenu de la colonne sélectionné, tout en gardant l'homogénéité de chaque ligne.
Image


[2] J'insère les liens suivant sur chaque intitulé (support, format, couleur etc....)

Code : Tout sélectionner

<a href="xxxx.php?ordre=support">support</a> <a href="xxxx.php?ordre=format">format</a> <a href="xxxx.php?ordre=couleur">couleur</a> etc...
[3] je créer le code qui vas me permettre de faire le trie selon le lien sélectionné
Dans mon cas, il me semble que je ne peux pas utiliser la syntaxe proposer
$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix ".($ordre==='desc'?'desc':'asc');
et qu'il est plus simple d'utiliser le "SWITCH"
$ordre = (isset ($_GET['ordre']))? $_GET['ordre']: 'asc'; 
$sql = "SELECT * FROM prix_pao";
$sql_retour =  mysql_query($sql);

switch ($ordre)
{
  case 'acs':
  default:
	$sql .= " ORDER BY id_prix";
	break;
  case 'support':
  default:
	$sql .= " ORDER BY support_prix DESC";
	break;
  case 'format':
	$sql .= " ORDER BY format_prix DESC";
	break;
  case 'couleur':
	$sql .= " ORDER BY couleur_prix DESC";
	break;
  //etc.......
} 
Quand pensez vous ? suis complètement hors sujet ?
merci

par Ryle » 24 oct. 2007, 14:20

Cette syntaxe se nomme opérateur ternaire, c'est en fait une écriture réduite pour un if/else (voir la FAQ : l'opérateur ternaire

Il n'y a pas d'accolades car il ne peut y avoir qu'une seule instruction (l'accolade n'étant nécessaire que lorsque la commande concerne un groupe d'instruction, afin de le délimiter)
$maVariable = isSet($_GET['support']) ? $_GET['support'] : 'asc';

//correspond donc à 

if (isSet($_GET['support']))
  $maVariable = $_GET['support'];
else
  $maVariable = 'asc';

par kweb » 24 oct. 2007, 14:13

:-k Ok ok, heeuuuu :-k

pourriez-vous m'expliquer ce que sinifie le "?" et le ":" dans cette syntax
(isset ($_GET['support']))? $_GET['support']: 'asc'; 
car ces la première fois que je vois une condition comme sa... les "{" ne sont pas obligatoire ?

par Tracker » 23 oct. 2007, 21:11

Il vaut mieux entourer la condition de parenthèses. :wink:
Salut,

Je suis d'accord si tu es victime de parenthésite c'est obligatoire, sinon c'est totalement inutile.
Ceci dit, il y a effectivement une erreur dans mon code mais sur l'opérateur de comparaison, il vaut mieux écrire:
$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix ".($ordre==='desc'?'desc':'asc');
En utilisant l'opérateur d'identité, sinon si { $ordre = true; } $ordre == 'desc' est vrai.


Tracker.

par Victor BRITO » 23 oct. 2007, 20:55

ou en une seule ligne (à moins que tu sois payé à la ligne):
$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix ".($ordre=='desc'?'desc':'asc');

Tracker.
Il y a une erreur dans ton code :
$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix ".(($ordre=='desc')? 'desc':'asc');
Il vaut mieux entourer la condition de parenthèses. :wink:

J'espère que kweb ne sera pas trop dérouté par toutes ces suggestions d'amélioration du code. :langue:

par Tracker » 23 oct. 2007, 19:22

ou en une seule ligne (à moins que tu sois payé à la ligne):
$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix ".($ordre=='desc'?'desc':'asc');

Tracker.

par zeus » 23 oct. 2007, 18:45

Si tu as compris le principe général, il est même possible d'améliorer le switch.
<?php
switch ($ordre)
{
  case 'asc':
  default:
    $sql .= " ORDER BY dossier_prix";
    break;
  case 'desc':
    $sql .= " ORDER BY dossier_prix DESC";
    break;
}
?>
Si tu as plusieurs branchement, tous feront la même action, jusqu'au prochain break ;)