Encore un problème de tri alphabétique

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 : Encore un problème de tri alphabétique

par Ryle » 25 oct. 2006, 08:10

Pour changer l'ordre de tri il te suffit simplement de jouer sur le sens ASC ou DESC de ta clause ORDER BY :)

Tu peux par exemple utiliser la valeur passé dans ton paramètre (là tu testes seulement si le paramètre est passé pour ordonné ta liste) et l'inverser à chaque fois. En supposant que $_GET['pseudos'] contienne ASC ou DESC :
<?php
if($_GET['pseudos']=="ASC") // inverse le sens proposé par le lien
  $sens="DESC"; 
else
  $sens="ASC";
?>
<a href="createtable.php?pseudos=<?php echo $sens;?>"> Joueurs</a>
...
<?php
...
if(isSet($_GET['pseudos'])) // effectu le order by selon le sens spécifié par $_GET['pseudos']
  $sql.="ORDER BY pseudos " . $_GET['pseudos']; 
...
?>

par Kaoteknik » 24 oct. 2006, 13:00

Enfin, j'ai trouvé la solution !

Voici le code correctement agencé :
<table border='1' cellspacing='1' cellpadding='1' style='text-align:center; font-size:11px; font-weight:bold; font-family:Geneva, Arial, Helvetica, sans-serif'>
				<tr bgcolor="#999999">
				<td width="20%">
				
				<a href="createtable.php?pseudos=resultat">
				Joueurs</a></td>
				<td width="10%">Lanciers</td>
				<td width="10%">Porteurs d'&eacute;p&eacute;e</td>
				<td width="10%">B&ucirc;cherons</td>
				<td width="10%">Scouts</td>
				<td width="10%">Cavalerie l&eacute;g&egrave;re</td>
				<td width="10%">Cavalerie lourde</td>
				<td width="10%">B&eacute;liers</td>
				<td width="10%">Catapultes</td>
				<td></td>
				</tr>

<?php

$sql= "SELECT * FROM troupes ";
if(isSet($_GET['pseudos']))
$sql.="ORDER BY pseudos ASC";


$ma_requete=mysql_query($sql) or die (mysql_error());
$resultat=mysql_fetch_array($ma_requete);

do 
{
echo '	<tr>
		<td>'.$resultat['pseudos'].'</td>
		<td>'.$resultat['lanciers'].'</td>
		<td>'.$resultat['epeistes'].'</td>
		<td>'.$resultat['bucherons'].'</td>
		<td>'.$resultat['scouts'].'</td>
		<td>'.$resultat['cavalerie_legere'].'</td>
		<td>'.$resultat['cavalerie_lourde'].'</td>
		<td>'.$resultat['beliers'].'</td>
		<td>'.$resultat['catapultes'].'</td>
		<td><a href="formedituser.php?id='.$resultat['id'].'">modifier</a></td>
		<td><a href="suppruser.php?id='.$resultat['id'].'">supprimer</a></td>
		</tr>';
}
while ($resultat=mysql_fetch_array($ma_requete));

?>
Merci à vous pour votre disponibilité et vos précieux conseils. :)

Bien, à présent, et parce que j'aime me compliquer la vie, comment pourrai-je faire pour inverser l'ordre de tri lorsque l'on clique une seconde fois sur le lien "joueurs" ?

par Ryle » 24 oct. 2006, 11:56

Pourquoi exécuter deux fois la requête ?

Moi je le ferais plutôt dans cet ordre :

1. Préparer la requête (avec une condition pour savoir s'il y a un tri ou non)
2. Exécuter la requête pour récupérer la liste
3. Afficher le résultat

L'ordre se gère ainsi directement au niveau de la requête. Si aucun paramètre n'est spécifié (quand on arrive sur la page pour la première fois) le tri par défaut est appliqué.
Si l'utilisateur clique sur le lien, ca va passer le paramtètre supplémentaire et donc changer le tri directement dans la requête :)

par Kaoteknik » 24 oct. 2006, 11:48

Dites moi si je me trompe, est-ce bien ainsi que les choses doivent s'organiser :

1. effectuer une requête pour obtenir la liste des pseudos ;
2. effectuer une seconde requête pour trier cette liste ;
3. recharger la page en faisant passer dans l'URL la liste triée ?

par Kaoteknik » 24 oct. 2006, 11:22

Bon, ça me désole d'être aussi nul...

J'ai testé ce code, mais toujours pas le résultat escompté :

<?php
$sql = "SELECT * FROM troupes ";

if(isSet($_GET['ordre'])) 
$sql.= " ORDER BY pseudos ASC";

$tri=mysql_query($sql) or die (mysql_error()); 

?>

<table border='1' cellspacing='1' cellpadding='1' style='text-align:center; font-size:11px; font-weight:bold; font-family:Geneva, Arial, Helvetica, sans-serif'>
				<tr bgcolor="#999999">
				<td width="20%">
				
				<a href="createtable.php?ordre=tri">
				Joueurs</a></td>

par Ryle » 24 oct. 2006, 11:08

Ainsi, ton lien devrait rappeller la page en lui passant un paramètre de type "?ordre=pseudos" (par exemple). Tu peux dès lors virer tout le code php du lien
Ce qui doit changer c'est ta requête $ma_requete=mysql_query("SELECT * FROM troupes")

Si jamais tu récupères le paramètre $_GET['ordre'] (ou $_GET['tri'] si tu utilise celui de Zeus), tu vas ajouter une condition et compléter ta requête sql de base en lui ajoutant la clause ORDRE BY avant de l'exécuter :
$sql = "SELECT ... "; // requête de base

if(isSet($_GET[...])) // si le paramètre est passé
  $sql.= " ORDER BY ... "; // ajout de la condition de tri

$ma_requete=mysql_query($sql) or die (mysql_error()); // exécution de la requête

par Kaoteknik » 24 oct. 2006, 11:03

Je viens d'essayer autre chose, toujours sans succès :
<?php
$tri=mysql_query("SELECT * FROM troupes ORDER BY pseudos ASC", $connexion);
?>

<table border='1' cellspacing='1' cellpadding='1' style='text-align:center; font-size:11px; font-weight:bold; font-family:Geneva, Arial, Helvetica, sans-serif'>
				<tr bgcolor="#999999">
				<td width="20%">
				
				<a href="createtable.php?tri=pseudos">
				Joueurs</a></td>

par Kaoteknik » 24 oct. 2006, 10:46

Bon, j'ai essayé de changer le lien comme ceci :
<a href="createtable.php?<?php 
				mysql_query("SELECT * FROM troupes ORDER BY pseudos ASC", $connexion);
				?>">
				Joueurs</a>
Ca ne fonctionne toujours pas. Il y a des notions qui m'échappent en effet ! :(

par Ryle » 24 oct. 2006, 10:34

Petit rappel, le php s'exécute sur le serveur... tu ne peux pas lancer des instructions php depuis un lien, il faut appeller le serveur et recharger la page avec de nouveaux paramètres pour faire ce que tu veux (ça peut aussi se faire en ajax sans rechargement, mais on va commencer simplement ;))

Ainsi, ton lien devrait rappeller la page en lui passant un paramètre de type "?ordre=pseudos" (par exemple). Tu peux dès lors virer tout le code php du lien

Ce qui va changer, c'est ton autre requête :
$ma_requete=mysql_query("SELECT * FROM troupes");
En effet, par défaut elle ne bouge pas, mais si jamais tu récupères le paramètre $_GET['ordre'], tu vas ajouter le critère de tri à la suite :)

par zeus » 24 oct. 2006, 10:30

Tu as un soucis de comprehension de l'architecture client/serveur.

Cette architecture se décompose de la manière suivante :
le PHP s'execute sur le serveur
le HTML est interpreté sur le client

Le php génére du code HTML qui est envoyé sur le client. Lors de l'affichage d'une page, le code PHP est déjà exécuté.

Donc, ton lien est faux puisque la requete a été exécuté avant l'affichage et que ton href est vide une fois qu'il est affiché.


Pour arriver à faire ce que tu désires, il faudrait que tu rappelles la même page php dans ton href en lui passant un parametre en GET, de cette manière :

Code : Tout sélectionner

<a href="page.php?tri=joueur">...
Et, dans ta page PHP, si tu as ce parametre en GET, tu modifies la requete pour trier selon les joueurs

Encore un problème de tri alphabétique

par Kaoteknik » 24 oct. 2006, 10:23

Bonjour,

j'ai créé une table dans ma base de données qui contient plusieurs champs. J'aimerai pouvoir classer le champ "joueurs" par ordre alphabétique. En fait, plus précisément, il faudrait que les personnes consultant le tableau mis en ligne puissent effectuer elles-même le tri en cliquant sur le lien "joueurs".

j'ai bien effectué une recherche sur le forum et trouvé des tas de réponses concernant ce sujet, mais je ne suis pas parvenu à les appliquer, aussi je m'excuse de soulever ce problème une fois de plus. Je ne suis pas doué, que voulez-vous ! :(

Bon, assez tergiversé, voici mon code actuel, lequel ne fonctionne évidemment pas :
<table border='1' cellspacing='1' cellpadding='1' style='text-align:center; font-size:11px; font-weight:bold; font-family:Geneva, Arial, Helvetica, sans-serif'>
				<tr bgcolor="#999999">
				<td width="20%">
				
				<a href="<?php 
				mysql_query("SELECT * FROM troupes ORDER BY pseudos ASC", $connexion);
				?>">
				Joueurs</a></td>
				<td width="10%">Lanciers</td>
				<td width="10%">Porteurs d'&eacute;p&eacute;e</td>
				<td width="10%">B&ucirc;cherons</td>
				<td width="10%">Scouts</td>
				<td width="10%">Cavalerie l&eacute;g&egrave;re</td>
				<td width="10%">Cavalerie lourde</td>
				<td width="10%">B&eacute;liers</td>
				<td width="10%">Catapultes</td>
				<td></td>
				</tr>

<?php

$ma_requete=mysql_query("SELECT * FROM troupes");
$resultat=mysql_fetch_array($ma_requete);

do 
{
echo '	<tr>
		<td>'.$resultat['pseudos'].'</td>
		<td>'.$resultat['lanciers'].'</td>
		<td>'.$resultat['epeistes'].'</td>
		<td>'.$resultat['bucherons'].'</td>
		<td>'.$resultat['scouts'].'</td>
		<td>'.$resultat['cavalerie_legere'].'</td>
		<td>'.$resultat['cavalerie_lourde'].'</td>
		<td>'.$resultat['beliers'].'</td>
		<td>'.$resultat['catapultes'].'</td>
		<td><a href="formedituser.php?id='.$resultat['id'].'">modifier</a></td>
		<td><a href="suppruser.php?id='.$resultat['id'].'">supprimer</a></td>
		</tr>';
}
while ($resultat=mysql_fetch_array($ma_requete));

?>
Le tableau s'affiche bien, avec toutes les infos contenues dans la base de données, mais le tri ne se fait pas lorsque je clique sur "joueurs"... Je lance donc un gros "HELP" ! Merci à vous. :)