trier les données

Répondre
guns17
le 28/02/2005 à 13:59
guns17
Bonjour,
j'affiche dans un tableau le resultat d'une requete SQL et j'aimerai en cliquant sur le libellé de chaque colonne faire un tri ordonné sur chaque colonne.
Je ne sais pas du tout commment m'y prendre; je suppose qu'il ne faut pas créer une page par tri.
peut-etre faut-il indiquer la requete dans l'URL?
merci d'avance pour l'aide.
Rex
le 28/02/2005 à 14:20
Rex
entête de colonne :
<th><a href="script.php?tri=add">Date</a></th>
<th><a href="script.php?tri=dad">Nom</a></th>
<th><a href="script.php?tri=dda">Prénom</a></th>


Ensuite, dans ton script :

<?php
if( !isset( $_GET['tri'] ) ) $tri = 'ddd';
else $tri = $_GET['tri'];

$champs = array( 'date', 'nom', 'prenom' );
$order = array();
foreach( $champs as $i => $champ ) {
$sens = 'a' === $tri[$i] ? ' ASC' : ' DESC';
$order[] = $champ . $sens;
}
$order = implode(', ', $ordre );
$requete = 'SELECT date, nom, prenom FROM table ORDER BY ' . $order;
?>


Quand tu affiches tu dois faire :

<?php
foreach( $champs as $i => $champ ) {
$tmp = $tri;
if( 'a' === $tmp[$i] ) $tmp[$i] = 'b';
else $tmp[$i] = 'c';
echo '<th><a href="script.php?tri=', $tmp,'">',$champ,'</a></th>';
}
?>


Voilà le principe.
J'ai introduit des erreurs dans le code pour que tu ne fasses pas un bête copier/coller :-)
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
guns17
le 28/02/2005 à 14:58
guns17
merci pour le code
peux-tu m'expliquer 2-3 trucs dans le code proposé :
si la variable $GET['tri'] n'existe pas, quelle devrait être la valeur de $order?
car moi cela me sort ORDER BY date DESC, nom DESC, prenom DESC, alors qu'il ne faudrait q'une valeur pour le tri.
Rex
le 28/02/2005 à 15:05
Rex
il ne faudrait q'une valeur pour le tri.

Bien sûr que non !
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
guns17
le 28/02/2005 à 15:14
guns17
autant pour moi je suis allé un peu vite dans la comprehension. par contre j'ai un message d'erreur à la compilation 'Uninitialized string offset:' sur la ligne
$sens = 'a' === $tri[$i] ? ' ASC' : ' DESC';

dans mon code :
if( !isset( $_GET['tri'] ) ) $tri = 'ddd';
else $tri = $_GET['tri'];

$champs = array( 'd.ID', 'd.enseigne', 'd.nom', 'd.prenom', 'd.ville', 'd.codePostal', 'r.nom');
$order = array();
foreach( $champs as $i => $champ ) {
$sens = 'a' === $tri[$i] ? ' ASC' : ' DESC';
$order[] = $champ . $sens;
}
$order = implode(', ', $order );
//$requete = 'SELECT date, nom, prenom FROM table ORDER BY ' . $order;
$query_rs_listeDistrib = "SELECT d.ID, d.enseigne, d.nom, d.prenom, d.ville, d.codePostal, r.nom
FROM distributeur AS d, region AS r
WHERE d.region = r.ID
ORDER BY " . $order;

je ne vois pas d'où ça vient
Rex
le 28/02/2005 à 15:26
Rex
C'est normal, tri contient 3 lettres alors que tu as 7 champs.

Tu peux mettre ta déclaration avant l'initialisation de $tri et remplacer $tri = 'ddd' par $tri = str_repeat('d', count($champs));

J'espère que tu comprends ce que tu fais :-)
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
guns17
le 28/02/2005 à 15:37
guns17
est-ce que tu peux m'expliquer le deroulement de l'operateur ternaire stp, même carrément la boucle
foreach( $champs as $i => $champ ) {
$sens = 'a' === $tri[$i] ? ' ASC' : ' DESC';
$order[] = $champ . $sens;
}
keitarosan
le 28/02/2005 à 15:45
keitarosan
<?php
$sens = 'a' === $tri[$i] ? ' ASC' : ' DESC';
?>


est equivalent a:

<?php

if ('a' === $tri[$i])
{
$sens = ' ASC';
}
else
{
$sens = ' DESC';
}
?>


le '===' est pour une comparaison sur la valeur mais aussi le type.

exemple:

<?php

if (1 == '1')
{
echo ("1 == '1' -> TRUE");
}
else
{
echo ("1 == '1' -> FALSE");
}

if (1 === '1')
{
echo ("1 === '1' -> TRUE");
}
else
{
echo ("1 === '1' -> FALSE");
}
?>



cela va afficher:
1 == '1' -> TRUE
1 === '1' -> FALSE


Vala, je sais pas si j'ai été clair...
>> http://projectopensource.free.fr/index.php?m=2&m2=5&s=8 <<
guns17
le 28/02/2005 à 15:47
guns17
si si tu as été clair mais je voudrais en francais la traduction exacte de la boucle car je suis un peu paumé là
Rex
le 28/02/2005 à 15:52
Rex
Je parcours la liste des champs.
Comme il n'y a pas d'indexe, le premier à l'indexe "0", le deuxième "1" ... etc.

Maintenant, $tri[1] correspond au deuxième caractères de la chaîne. Donc si le deuxième caractère vaut "a" cela veut dire que l'on veut faire un tri par ordre ascendant sinon descendant.
En fait le deuxième caractère correspond au deuxième champ de la liste ça tombe bien :-)
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
Répondre
LoadingChargement en cours