order by rand... et plusieurs pages

chabrun.myriam
Invité n'ayant pas de compte PHPfrance

12 sept. 2006, 15:08

bonjour
je recupere des donnees par morceaux dans une base et je les affiche dans un tableau html par l'intermediaire du php. J'ai plusieurs pages si le nombre de donnees correspondant aux criteres est plus grand que le nombre affiche. Tout se passe bien. Le probleme commence quand je veux recuperer ces donnees dans un ordre aleatoire.
si je les recupere en morceaux, je retombe souvent sur ceux qui ont deja ete presentes.
si je les recupere tous ensemble, que je les mets dans un tableau et que je fais :
srand(time());
shuffle($tablo);

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 sept. 2006, 15:11

Je ne voudrais pas être désagréable mais ... j'ai rien compris :oops:

Quel est ton soucis exactement ?
Si tu cherches à afficher des éléments via une pagination, tu ne peut faire un tri aléatoire car il te faudrait conserver le 1er tri aléatoire pour ne pas afficher plusieurs fois les meme infos dans différentes pages :-k
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 65 Messages

12 sept. 2006, 15:23

tu as compris ce que je voulais et que je n'ai pas explicitement explique. Y a-t-il un moyen de memoriser ce qui a ete rechercher pour ne pas le reprendre au deuxieme passage ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 sept. 2006, 15:44

Oui, c'est possible en mettant ton tableau trié en session et en le récupérant lorsque tu changes de page.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 332 Messages

12 sept. 2006, 15:51

Au lieu de faire un order by rand qui sera forcément recalculé à chacune des pages, il faut tout déterminer sur la page 0 :

- tu sélectionnes tous tes ID de toutes les pages dans un tableau
- tu te débrouilles pour les mélanger
- tu stockes ce tableau mélangé dans une variable de session ou un cookie ou un fichier texte ou dans une base de données
- tu extrais les X premiers pour ta première page avec

Code : Tout sélectionner

SELECT ... FROM ... WHERE ID IN (id1, id2, id3, ...)
- et pour les pages suivantes, tu extrais les X caractères à partir du premier de la page dans la variable que tu as stockée.

Eléphant du PHP | 65 Messages

12 sept. 2006, 16:35

pour ce qui est de la recuperation des donnees, pas de probleme. Pas de probleme non plus pour les mettre dans un tableau, ni pour melanger ce tableau. Mais comment les mettre dans une variable de session ?
$req_collection = mysql_query("SELECT * FROM article");
// mise de ces enregistrements dans un tableau
while ($res_collection = mysql_fetch_array($req_collection)) {
	$tablo[] = $res_collection;
}
// creation d un chiffrage aleatoire pour affichage aleatoire
srand(time());
// melange du tableau
shuffle($tablo);

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 sept. 2006, 16:43

Tiens, voilà un petit tutorial qui devrait te permettre de comprendre le principe des sessions et de te familiariser avec la syntaxe ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 65 Messages

12 sept. 2006, 16:51

pour les variables de session simples, pas de problemen. Mais là, il faut que je crée une variable de session qui soit un tableau.
$deja_vu = $_SESSION[$tablo]; (est-ce que c'est possible ?)
et que je compare à l'intérieur de ce tableau :
WHERE id_article NOT IN $deja_vu
A l'écrire, ça me paraît bizarre...

Eléphant du PHP | 65 Messages

12 sept. 2006, 16:54

erreur de saisie en allant trop vite, je voulais écrire
$deja_vu = $_SESSION[$tablo['id_article']]

Eléphant du PHP | 332 Messages

14 sept. 2006, 13:30

A priori, rien ne t'empêche de stocker un tableau dans une variable de session
$liste = ... // un array
$_SESSION["liste_des_items"] = $liste;

$tableaudejavu = $_SESSION["liste_des_items"];
$valeurdejavu = $_SESSION["liste_des_items"][0];

Au passage, éviter d'appeler des tableaux "tablo" : ce qui est important c'est ce qu'il contient, pas comment il stocke l'information.

Deuxièmement, la syntaxe pour faire le select est

Code : Tout sélectionner

WHERE id in (12, 56, 84, 53, 96);
Regarde du côté de la fonction implode pour créer une telle chaîne de caractères à partir du tableau (ou plutôt de l'extrait des x lignes à afficher du tableau).