Ordre croissant ou decroissant

Eléphant du PHP | 169 Messages

23 oct. 2007, 18:12

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

lux
Eléphant du PHP | 372 Messages

23 oct. 2007, 18:21

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:

Mammouth du PHP | 2937 Messages

23 oct. 2007, 18:25

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:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 oct. 2007, 18:26

Tout est possible ... même le faite de pouvoir faire une recherche :-k

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

lux
Eléphant du PHP | 372 Messages

23 oct. 2007, 18:28

Tout est possible ... même le faite de pouvoir faire une recherche :-k
Non, trop facile :P

Eléphant du PHP | 169 Messages

23 oct. 2007, 18:34

merci pour les réponses...
pourtant j'ai fais quelques recherche avant. (:oops:).
--
Kweb

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 443 Messages

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.

Mammouth du PHP | 2937 Messages

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:

Eléphant du PHP | 443 Messages

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.

Eléphant du PHP | 169 Messages

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

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';
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 169 Messages

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

Mammouth du PHP | 2937 Messages

24 oct. 2007, 18:55

Supprime l'un des deux default dans ton switch.

Eléphant du PHP | 169 Messages

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