web 2.0

Seebz.net

Trier les colonnes d'un tableau en PHP

Cet article va vous présenter une technique afin de pouvoir trier les élément d'un tableau de données à la manière de phpMyAdmin.
Un clic sur le nom de la colonne nous retournera les données triées sur le champ adéquat.
Bien entendu, les données doivent provenir d'une base de données.

Démo

Le Code

<?php


// Connexion à la base de donnée
mysql_connect('serveur','user','password');
mysql_select_db('dbname');


// Le nom de notre table
$tablename = 'test';


// Tri sur colonne
$tri_autorises = array('id','firstname','lastname','email','last_connection');
$order_by = in_array($_GET['order'],$tri_autorises) ? $_GET['order'] : 'id';


// Sens du tri
$order_dir = isset($_GET['inverse']) ? 'DESC' : 'ASC';


// Préparation de la requête
$sql = "
	SELECT *
	FROM {$tablename}
	ORDER BY {$order_by} {$order_dir}
";
$result = mysql_query($sql);


// Notre fonction qui affiche les liens
function sort_link($text, $order=false)
{
	global $order_by, $order_dir;

	if(!$order)
		$order = $text;

	$link = '<a href="?order=' . $order;
	if($order_by==$order && $order_dir=='ASC')
		$link .= '&inverse=true';
	$link .= '"';
	if($order_by==$order && $order_dir=='ASC')
		$link .= ' class="order_asc"';
	elseif($order_by==$order && $order_dir=='DESC')
		$link .= ' class="order_desc"';
	$link .= '>' . $text . '</a>';

	return $link;
}


// Affichage
?>
<style type="text/css">
a.order_asc,
a.order_desc:hover { 
	padding-right:15px;
	background:transparent url(s_asc.png) right no-repeat;
}
a.order_desc,
a.order_asc:hover {
	padding-right:15px;
	background:transparent url(s_desc.png) right no-repeat;
}
</style>

<table>
	<tr>
		<th><?php echo sort_link('Id', 'id') ?></th>
		<th><?php echo sort_link('Firstname', 'firstname') ?></th>
		<th><?php echo sort_link('Lastname', 'lastname') ?></th>
		<th><?php echo sort_link('Email', 'email') ?></th>
		<th><?php echo sort_link('Last Connection', 'last_connection') ?></th>
	</tr>
<?php while( $row=mysql_fetch_assoc($result) ) : ?>
	<tr>
		<td><?php echo $row['id'] ?></td>
		<td><?php echo $row['firstname'] ?></td>
		<td><?php echo $row['lastname'] ?></td>
		<td><?php echo $row['email'] ?></td>
		<td><?php echo $row['last_connection'] ?></td>
	</tr>
<?php endwhile ?>
</table>

Explication

Bien que le code ne soit pas très compliqué, un petite explication ne fera pas de mal :

  • Le tableau PHP $tri_autorises doit contenir les noms des colonnes sur lesquels on veut effectuer les tris, cela permet d'éviter des injections SQL ou autres erreurs de syntaxe.
    Si aucun paramètre n'est fourni, on utilisera la collone id par défaut (à vous de spécifier celle que vous voulez par défaut).
  • Si le paramètre inverse existe, le tri se fera dans l'ordre inverse.
  • La fonction sort_link() retourne le lien qui permet de faire le tri sur une colonne.
    Le premier paramètre $text est le texte à afficher, l'ancre du lien.
    Le seconde paramètre $order est le nom de la colonne concernée par ce lien.

J'ai ajouté un peu de CSS afin d'afficher les images, ces images proviennent de phpMyAdmin

Have Fun !

Partager : Share
 

18 Réponses à “Trier les colonnes d'un tableau en PHP”

  1. Coool

    ça c'est super pratique !!!

    Merci bien

  2. Merci, Tu n'aurais pas un tuto pour intégrer ça avec de l'ajax?

  3. if(!$order)
    $order = $test


    Il sort d'où la variable? $test dans la fonction sort_link() ? oO

  4. Oups, bien vu Kiruban...

    C'est bien $text et pas $test qu'il faut utiliser, c'est corrigé maintenant ;)

    Pour l'ajax, ça pourrait peut-être faire l'objet d'un article futur, j'y réfléchirait en temps voulu ;)

  5. Super code et bien utile, félicitations.

  6. Juste pour te dire bravo pour ton code, il m'a été bien utile.

  7. pratique pour un bakOff

  8. Très utile ! Je suis aussi intéressé par un tel code avec l'intégration Ajax... :)

  9. Super très utile.
    Bravo et merci pour ton code, il m'a été bien utile.

  10. bonjour, j'ai testé ce petit bout de script, par contre je rencontre un délai dans l'affichage.

    pour environ 130 information il met énormément de temps entre chaque action.

  11. @pat : ta requête ne doit pas être optimisé.
    Essayes en mettant des index sur les champs concernés par "WHERE" et "ORDER BY"

  12. Petite correction pour ne pas avoir de message d'erreur a la première ouverture de la page qui nous marque :
    "Notice: Undefined index: order in C:[...]tri.php on line ..."
    mettez un isset dans la ligne commencant par $order_by :
    "$order_by = in_array(isset($_GET['order']),$tri_autorises) ? $_GET['order'] : 'id';"

    Voila. bon code bien fait :) merci a toi pour le partage.

  13. Salut Tutotei, merci pour ta contribution mais je pense que ca devrait plutot être :

    $order_by = (isset($_GET['order']) && in_array($_GET['order'],$tri_autorises)) ? $_GET['order'] : 'id';
    

  14. Bonjour,
    Merci pour ce code très simple et très pratique que j'utilise déjà sur un tableau.
    Pour un autre, j'aimerais savoir s'il est possible d'associer une autre colonne lors du tri.
    Exemple simple. 2 colonnes, nom et prénom. J'aimerais quand je clique sur nom, qu'en second ce soit trié sur le prénom?
    Également dans mon tableau j'ai des champs venant de 2 tables différentes. Les champs de cette deuxieme table sont inconnus.
    Merci

  15. D'abord merci beaucoup pour ces scripts qui m'ont rendu bien service.
    Grâce à eux j'ai réalisé un tableau avec la pagination qui fonctionne bien.
    Par contre, voulant ajouté le tri de ce script j'arrive à faire fonctionner le tri mais la pagination ne fonctionne plus. Le nombre de pages est bon mais tout s'affiche sur une seule page.
    Quelle est l'erreur que je commet sachant que je suis débutant en php.
    Merci d'avance pour l'aide

  16. Finalement en cherchant bien , j'ai trouvé mon erreur.

    Dans la requête sql du tri j'avais oublié de mettre LIMIT $limit_start, $pagination.

    Merci encore pour ces scripts.

  17. Bonjour,

    C'est à nouveau moi. Finalement j'ai encore un problème avec le tri de mon tableau qui est paginé.
    Le tri par défaut fonctionne bien sur toutes les pages (6) mais quand on demande le tri sur une autre colonne la 1ère page est bien triée mais pas les autres pages.
    Est-ce que le code de tri ne fonctionne pas sur un tableau paginé ou est-ce une erreur de ma part.

    Merci d'avance

  18. "Si le paramètre inverse existe, le tri se fera dans l'ordre inverse. "

    Pouvez vous m'expliquer comment réaliser le tri dans l'ordre inverse? Je suis débutante et ne comprend pas bien

    Merci

Poster un commentaire

Remonter