NyroBlog
Banniere NyroBlog
Image de Nyro - ?
« avril 2007 »
lunmarmerjeuvensamdim
1
2345678
9101112131415
16171819202122
23242526272829
30

Votre candidat idéal ?

Votez PlusA 10 jours des éléctions présidentielles, on voit fleurir depuis quelques temps déjà des questionnaires qui permettent de savoir lequel nous ressemble tous.

Parmi ceux que j'avais vu, tous étaient des formulaires tristes, sans recherche particulière. Bref, le genre de truc fait par des geek pour s'amuser, en prenant en compte des éléments plus ou moins intéressant et plus ou moins juste.

Heureusement, Canal+ et ses guignols arrivent et nous livre un joli questionnaire de 10 questions, avec PPDA qui lit les questions, grande classe !

A la fin, vous avez droit à un joli mélange entre plusieurs candidats, comme Ségolène Bovencenot, Dominique Broiyal, Jean-Marie Baryal, etc...

Amusant tout ça, mais garder à l'esprit que votre est un droit (et aussi un devoir) civique, et qu'il ne faut pas le prendre à la légère !

PHP/MySQL : Faire une pagination sur un tri aléatoire

J'ai été confronté tout à l'heure à un problème simple, mais qui peut poser problème : On vous demande de lister les éléments d'une table MySQL sur une page, et d'en faire une pagination. Tout ce qu'il y a de plus normal. Pour faire ça, vous allez jouer sur les LIMIT de votre requète.

Exemple :

SELECT * FROM utilisateur LIMIT 20,10

Où on afficherai la seconde page des utilisateurs, avec 10 affichages.

Maintenant, imagninez qu'on veuille trier cette requête selon les nom des utilisateurs. Il suffirait de faire :

SELECT * FROM utilisateur LIMIT 20,10 ORDER BY nom ASC

Bon, jusque là, pas de problème particulier.

Maintenant vous ne voulez pas un affichage trié par nom, mais aléatoire. Intuitivement, on ferait simplement :

SELECT * FROM utilisateur LIMIT 20,10 ORDER BY RAND()

Ce qui n'est pas totalement faux. Le problème avec cette solution, c'est que lorsque vous allez changer de page, le tri va changer, et il sera donc impossible aux visiteurs d'afficher tous les noms, ce sera complètement cahotique.

La solution consiste à générer un nombre aléatoire en PHP, à l'enregistrer en session, et à le passer à la requête MySQL, dans les parenthèses du RAND, et le tour est joué. Ainsi le nombre alétoire généré sera toujours le même pour la session en cours, et on se retrouver avec le même tri sur toutes les pages.

Le code pour générer et enregistrer le nombre aléatoire en PHP :

$rand = $_SESSION['rand'];
if (empty($rand)) {
srand((float)microtime()*1000000);
$rand = "0.".rand();
$_SESSION['rand'] = $rand;
}

Bien sûr, il faudra que la session soit démarrer avec session_start() plus haut et qu'aucun header n'ai déjà été envoyé (ou bien utiliser ob_start())

Enfin, la requête MySQL devient :

SELECT * FROM utilisateur LIMIT 20,10 ORDER BY RAND($rand)

Et voilà, vous avez une belle pagination avec un tri aléatoire.

English Version of this post