Page 1 sur 1

"Classer par" apres un SELECT

Posté : 16 févr. 2006, 11:48
par newbee
Bonjour à tous
Voila, encore un probleme!
J'ai fait une page de stats pour savoir qui s'est connecté et quand (accès au site apres une authentification).
Ma page marche (affiche le pseudo, le nom, le prenom, etc.) mais je voudrais que quand on clic sur les titres des colonnes, cela tri mon tableau par le titre correspondant (ex: tri par pseudo, tri par date, etc.)
<?php
session_start();
$host="localhost";
$login="root";
$pass="";
$base="ma_base";
$connect= mysql_connect($host,$login,$pass);
mysql_select_db($base, $connect);

// requête SQL 
//$sql = 'SELECT * FROM pmsi_freq ORDER BY id DESC'; 
// envoie de la requête 
//$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
?>
<html>
<head>
</head>
<body>
<table width="800">
<tr>
  <td colspan="3" align="center">
  <font face="Verdana" size="2"><b>Statistiques du nombre de connectés</b></font></tr>
<tr><td colspan="3">
		<table align="center" width="700" bgcolor="#DDE3F4" border="1" bordercolordark="#234A94" bordercolorlight="#FFFFFF">
		<tr><td align="center">
<!-- C'est ici que je veux inserer les liens -->
		<font face="Verdana" size="2"><b>Identifiant</b></font>
		</td><td align="center">
		<font face="Verdana" size="2"><b>Prénom</b></font>
		</td><td align="center">
		<font face="Verdana" size="2"><b>Nom</b></font>
		</td><td align="center">
		<font face="Verdana" size="2"><b>Clinique</b></font>
		</td><td align="center">
		<font face="Verdana" size="2"><b>Date</b></font>
		</td>
</tr>
		<?
		$sql = 'SELECT * FROM pmsi_freq ORDER BY date DESC';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$data = mysql_fetch_array($req);
		while($data = mysql_fetch_assoc($req)) 
			{ 		
				$date = $data["date"];
				/* Traitement pour l'affichage de la date en francais ********************************************************* */
				// formatage
				list($annee, $mois1, $jour) = explode("-", $date);
				// Traitement du formatage de la date
				$mois = $mois1;
				$annees = $annee;
				// Traduction des mois dans la langue francaise
				$ms = "";
				switch($mois)
				{
				case "01" : $ms = "Janvier"; break;
				case "02" : $ms = "Février"; break;
				case "03" : $ms = "Mars"; break;
				case "04" : $ms = "Avril"; break;
				case "05" : $ms = "Mai"; break;
				case "06" : $ms = "Juin"; break;
				case "07" : $ms = "Juillet"; break;
				case "08" : $ms = "Août"; break;
				case "09" : $ms = "Septembre"; break;
				case "10" : $ms = "Octobre"; break;
				case "11" : $ms = "Novembre"; break;
				case "12" : $ms = "Décembre"; break;
				}
				$mois = $ms;
				// Regroupement de l'ensemble des variables pour former la date
				$date = $jour." ".$mois." ".$annees;
				/* Fin affichage de la date en francais *********************************************************************** */
				// on affiche les informations de l'enregistrement en cours 
				echo "<tr>";
				echo "<td width='20%'><font face='Verdana' size='2' color='#234A94'>";
				echo '<b>'.$data['utilisateur'] ;
				echo "</font></td>";
				echo "<td width='20%'><font face='Verdana' size='2' color='#234A94'>";
				echo $data['prenom'] ;
				echo "</font></td>";
				echo "<td width='20%'><font face='Verdana' size='2' color='#234A94'>";
				echo '<b>'.$data['nom'] ;
				echo "</font></td>";
				echo "<td width='20%'><font face='Verdana' size='2' color='#234A94'>";
				echo '<b>'.$data['clinique'] ;
				echo "</font></td>";
				echo "<td align='right'><font face='Verdana' size='2' color='#234A94'>";
				echo $date ;
				echo "</font></td></tr>";
			}
		?> 
		</table>
</tr><tr><td colspan="3"></td>
</table>
</body>
</html>
Si quelqu'un a une soluce...

Merci d'avance

Posté : 16 févr. 2006, 11:54
par Invité
tu fais un teste voir ou il a clique, et quand tu vois ou il clique, tu fais une condition
if($clique==$nom)
{$req="Select nom,prenom, ... from Matable ORDER BY NOM";
$sql=mysql_querry($req) or die('Erreur SQL'); 
}

if($clique==$prenom)
{$req="Select nom,prenom, ... from Matable ORDER BY prenom";
$sql=mysql_querry($req) or die('Erreur SQL'); 
}
quelque chose comme ca ;)

Posté : 16 févr. 2006, 11:54
par Cyrano
Principe de fonctionnement: Il faut que les titre en tête de tes colonnes soient des liens vers la page elle-même assortie d'un paramètre correspondant à la colonne: au rechargement de la page, tu récupères ce paramètre via la super_globale $_GET et tu fais ta requête SQL en ajoutant une clause ORDER BY sur le champ correspondant en ASC ou en DESC selon le cas.

Posté : 16 févr. 2006, 12:01
par newbee
Merci les gars (nanas?) de votre rapidité.
- Cyrano : je comprends le fonctionnement mais ne sais pas faire la syntaxe :(.
tu peux me tenir plus la main?

- Invité : Je mets quoi comme lien sur mes en-têtes? <a href="???"...>

Posté : 16 févr. 2006, 12:15
par Cyrano
Ok, alors le titre de ta colonne par exemple est actuellement :
<td align="center"><font face="Verdana" size="2"><b>Nom</b></font></td>
TU vas le transformer comme ceci:
<td align="center"><a href="<?php echo($_SERVER['PHP_SELF'] ."?tri=nom"); ?>"><font face="Verdana" size="2"><b>Nom</b></font></a></td>
Ensuite, tu vas modifier un tout petit peu ta requête comme ceci:
$tri = isset($_GET['tri']) ? $_GET['tri'] : "";
switch($tri)
{
    case "ident" :  $champ = "identifiant"; break;
    case "nom" :    $champ = "nom"; break;
    case "prenom" : $champ = "prenom"; break;
    case "clin" :   $champ = "clinique"; break;
    default:        $champ = "date";
}

$sql = "SELECT * FROM pmsi_freq "."ORDER BY ". $champ ." DESC";
Remplace par les vrais noms des champs de ta table dans le switch et ça devrait fonctionner très bien.

Posté : 16 févr. 2006, 12:20
par Ryle
Le plus simple est d'utiliser les liens effectivement (après tu peux aussi coller ça dans un onClick sur le td :))

Code : Tout sélectionner

<table> <tr> <td><a href="maPage.php?trier=col1">Col1</a></td> <td><a href="maPage.php?trier=col2">Col2</a></td> <td><a href="maPage.php?trier=col3">Col3</a></td> </tr> </table>
Il ne te reste plus ensuite qu'à récupérer la valeur de $trier et à la glisser dans ton select ORDER BY $trier (en supposant que col1, col2, etc. soient les noms de tes colonnes en bases, si ce n'est pas le cas, suffit de faire la correspondance)

Tu peux ensuite agrémenter d'un deuxième paramètre pour avoir le sens de tri ASC ou DESC :)

Posté : 16 févr. 2006, 12:49
par newbee
Oki merci Cyrano, sympa d'avoir pris le temps :).
Merci aussi Ryle, pas testé ta méthode car celle de Cyrano marche tip-top et m'aide à comprendre de nouvelles choses ;).

@ (très) bientot.