Page 1 sur 2

Ordre croissant ou decroissant

Posté : 23 oct. 2007, 18:12
par kweb
Slt tous le monde,

J'ai créer un tableau html dans lequel je fais remonté des infos de la BD
<table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
          	
            <td colspan="2" width="170" id="PrixCel1"><strong>Support</strong></td>
            <td width="80" id="PrixCel2"><strong>Format</strong></td>
            <td width="100" id="PrixCel2"><strong>Couleurs</strong></td>
            <td width="120" id="PrixCel2"><strong>Dossier</strong></td>
            <td width="60" id="PrixCel2"><strong>Date</strong></td>
            <td width="100" id="PrixCel2"><strong>Imprimeur</strong></td>
            <td width="50" id="PrixCel2"><strong>Prix HT</strong></td>
            <td width="60" id="PrixCel2"><strong>Quantit&eacute;</strong></td>
            <td id="PrixCel2"><strong>Graphiste</strong></td>
          </tr>          
          <!-- DEBUT AFFICHAGE DYNAMIQUE DES INFOS -->
          <?php 
			// SELECTIONNER tous les champs de la table prix_pao 
				$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix";
				$sql_retour =  mysql_query($sql);
		  
		  	// BOUCLE 
				while ($ligne = mysql_fetch_array ($sql_retour) )
				{
					// CREATION d'une Ligne 2
					echo "<tr bgcolor=\""; echo switchcolor(); echo "\">";
	
					//Cellule Suppression
					echo '<td id="PrixCelWhile" width="14">';
					echo '<a href="index.php?supprimer='.$ligne['id_prix'].'"><img src="images/corbeille.gif" alt="Supprimer" width="14" height="16" border="0"></a>';
					echo '</td>';
					
					.........JE RACOURCI LE CODE..........

					//FIN de la ligne 2
					echo '</tr>';
				}?>
          <!-- FINAFFICHAGE DYNAMIQUE DES INFOS -->
        </table>
Je voudrais mettre un lien sur les en-têtes de chaque colonne, qui permettrais lors d'un "clic dessus" de classer par ordre croisant ou décroisant.
un peu comme sur excel, de déplacer les lignes par ordre croissant ou décroissant en fonction du mot de la colonne selectionner :roll:

Cela est il possible ? et comment ?

merci de votre aide

Posté : 23 oct. 2007, 18:21
par lux
Hello. C'est certainement possible. Au niveau de la requète ajoute : ORDER BY ... ASC ou DESC
$sql = "SELECT * FROM prix_pao ORDER BY dossier_prix ASC"; 
Maintenant pour faire varier comme ça, dans la page, faudrait voir avec de l'Ajax, la je laisse la parole aux spécialistes :wink:

Posté : 23 oct. 2007, 18:25
par Victor BRITO
Pour chaque lien, tu fais en sorte que tu envoies un paramètre d'URL, que tu récupères avec un $_GET.

Pour un lien en ordre décroissant.

Code : Tout sélectionner

<a href="?ordre=desc">Ordre décroissant</a>
<?php
// 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';

// La requête (à optimiser si tu n'as pas besoin de toutes les colonnes de la table :wink: )
$sql = "SELECT * FROM prix_pao";

// On la complète en fonction de l'ordre souhaité
switch ($ordre)
{
  case 'asc':
    $sql .= " ORDER BY dossier_prix";
    break;
  case 'desc':
    $sql .= " ORDER BY dossier_prix DESC";
    break;
  default:
    $sql .= " ORDER BY dossier_prix";
    break;
}
?>
Est-ce clair ? :wink:

Posté : 23 oct. 2007, 18:26
par Truc
Tout est possible ... même le faite de pouvoir faire une recherche :-k

Posté : 23 oct. 2007, 18:28
par lux
Tout est possible ... même le faite de pouvoir faire une recherche :-k
Non, trop facile :P

Posté : 23 oct. 2007, 18:34
par kweb
merci pour les réponses...
pourtant j'ai fais quelques recherche avant. (:oops:).

Posté : 23 oct. 2007, 18:45
par zeus
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 ;)

Posté : 23 oct. 2007, 19:22
par Tracker
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.

Posté : 23 oct. 2007, 20:55
par Victor BRITO
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:

Posté : 23 oct. 2007, 21:11
par Tracker
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.

Posté : 24 oct. 2007, 14:13
par kweb
:-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 ?

Posté : 24 oct. 2007, 14:20
par Ryle
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';

Posté : 24 oct. 2007, 18:24
par kweb
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

Posté : 24 oct. 2007, 18:55
par Victor BRITO
Supprime l'un des deux default dans ton switch.

Posté : 25 oct. 2007, 09:38
par kweb
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: