Bug dans ma lecture au hasard !

Eléphant du PHP | 113 Messages

21 sept. 2006, 22:41

Bonjour,
Sur mon site de citations, le visiteur peut les lire, en vrac, au hasard dans la bdd.
Sauf que le hasard ne fait pas toujours bien les choses.

J'affiche les citations par 4 mais sur la page qui suit, je peux en retrouver une des 4 précédentes !

Je sais, c'est le hasard, mais si elle se répétait toutes les 8 ou 10 pages, ça irait, mais parfois c'est 3 fois en 7 ou 8 pages !
<?php
mysql_connect("xxxxxxxxxxxxxxxx"); //connexion &agrave; la base
mysql_select_db("citation"); // S&eacute;lection de la base citation
// On est connect&eacute;s, on peut travailler sur la BDD


$page = isset($_GET['page']) ? $_GET['page'] : ''; 

// Prepare le requete MySql
$requete = "SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation 
            FROM citateurs_celebres 
            LEFT JOIN citations_celebres 
            ON citateurs_celebres.id = citations_celebres.numcitateur";
$ret = mysql_query($requete);
// Variable nombre d'enreg par page
$limit=4;
if($debut==""){$debut=0;}
$debut=$page*$limit;
// Compte le nombre de champ
$nb_total=mysql_num_rows($ret);
// Requete
$limite=mysql_query("$requete limit $debut,$limit");


//Affichage le contenu de votre table
//avec une limite, dans l'exemple $limit est &agrave; 4

$limit_str = "LIMIT ". $page * $limit .",$limit";

$result = mysql_query("
                      SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation, citations_celebres.id
                      FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur 
                      ORDER BY rand() 
                      ASC $limit_str");
while ($row =mysql_fetch_array ($result) )
{
// affiche les different champs
echo"$row[citation]";
echo"<br />";
?>

Eléphant du PHP | 184 Messages

21 sept. 2006, 22:52

Pourquoi ne pas préférer une requete selon un ordre bien précis plutôt qu'une recherche aléatoire? je ne vois pas trop dans ce contexte mais tu as sans doute tes raisons. Comme tu l'as dit c'est du hasard et ca nul ne pourra le contrer à moins d'utiliser une seule requete sans limit et garder le résultat en arrière plan pour ensuite le traiter comme bon te semble, ceci t'évitera les doublons.
Image

Eléphant du PHP | 451 Messages

21 sept. 2006, 22:55

Bonsoir,

Je ne suis pas spécialiste en sql mais je ne comprends pas le :
ORDER BY rand()
C'est pour déterminer aléatoirement la colonne qui sera utilisée pour trier ?

na faudrait-il pas plutôt faire :
$result = mysql_query("
SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation, citations_celebres.id
FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur
LIMIT ".rand(0,$max)." , 4;");

avec $max = nombre d'enregistrements - 4 ?
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Eléphant du PHP | 113 Messages

22 sept. 2006, 07:32

En fait, j'utilise le hasard car lorsque j'ai enregistré mes citations, j'ai mis par ex les 10 citations d'Audiard à suivre. Je ne voulais pas integré non plus un autre champ dans ma bdd déjà assez lourde.
Mais en te lisant, il me vient une idée.
Je prends mon mal en patience et renomme aléatoirement le champ id correspondant au n° de la citation. C'est peut-être jouable.

Pour jpaul: Je m'y connais encore moins, j'éssaierai.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 sept. 2006, 10:41

Pour éviter cela, c'est un "tirage sans remise" qu'il te faut :)

En fait, au lieu d'aller intéroger ta base à chaque fois et risquer de ressortir les mêmes résultats, tu pourrais venir tout lire (ou seulement une 50aine d'enregistrements pris au hasard, surtout si ta table est volumineuse) que tu collerais dans un tableau, tableau que tu placerais en session.

En gros le visiteur va se ballader avec son tableau de citation aléatoire, et à chaque fois que tu veux en afficher une, tu la prend et tu la retires du tableau. Tu peux ainsi être sur qu'il ne verra pas deux fois la même à la suite :)

Et puis une fois le tableau vide, il te suffit de renouveler l'opération en retournant en chercher une 50aine au hasard. Tu retomberas probablement sur les mêmes, mais tu auras eu un peu plus de contrôle sur ce qui sort dans les 10 premières pages :)

Eléphant du PHP | 451 Messages

22 sept. 2006, 11:10

Bonjour,

En fait, j'ai toujours vu des noms de colonnes derrière une clause ORDER BY et je me demande ce que peut bien faire mysql avec ORDER BY rand() !!!

C'est pourquoi je te proposais d'essayer d'utiliser rand avec une clause LIMIT.
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 sept. 2006, 11:22

je me demande ce que peut bien faire mysql avec ORDER BY rand()
La fonction rand() retourne un nombre décimal aléatoire compris entre 0 et 1 et est évalué à chaque fois, du coup chaque ligne se trouve associée à un nombre différent assigné aléatoirement.
La syntaxe "ORDER BY rand()" permet de trier tes résultats sur une colonne de valeur aléatoire sans avoir à ajouter celle-ci dans les colonnes du SELECT :)

http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html

Invité
Invité n'ayant pas de compte PHPfrance

22 sept. 2006, 12:59

Pour éviter cela, c'est un "tirage sans remise" qu'il te faut :)
Merci, mais j'suis pas sûr d'en être capable !

Eléphant du PHP | 451 Messages

22 sept. 2006, 13:18

La fonction rand() retourne un nombre décimal aléatoire compris entre 0 et 1 et est évalué à chaque fois, du coup chaque ligne se trouve associée à un nombre différent assigné aléatoirement.
La syntaxe "ORDER BY rand()" permet de trier tes résultats sur une colonne de valeur aléatoire sans avoir à ajouter celle-ci dans les colonnes du SELECT :)

http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html

Foulaaaa ! C'est puissant ce truc !
Merci, j'ai appris quelque chose :)
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 sept. 2006, 13:23

Roooh l'aut hé !! :) Sortir des numéros au hazard ca n'a rien de sorcier, y a des p'tits vieux qui font ça tous les dimanches apres midi dans les clubs de bingo, et crois moi que peu d'entre eux savent allumer un ordi :)

Alors, pour un tirage de citation pour 12 personnes (ou plus), il te faut :
- démarrer une session (c'est pas ce qu'il y a de plus complique, faut juste écrire session_start() en haut de ta page ;))
- aller chercher dans ta table 50 citations prises au hasard (un Select, un ORDER BY rand() et un LIMIT devrait te permettre de le faire facilement :))

Préparation :
- une fois que ta session est démarrée (thermostat 7), tu vas chercher tes citations et tu place chacune d'entre elle dans les cellules d'un tableau (array_push()).
- Tu enfournes ce tableau ce tableau dans ta session ($_SESSION["citations"] = $monTableau)
- Tu laisse mijoter le temps que l'utilisateur commence à se plaindre qu'il en a assez de bouffer des cacahuettes, et qu'il aimerait bien qu'on lui serve ses premières citations
- Tu vas chercher dans ton tableau en session ($_SESSION["citations"]) tu en coupe quelques tranches pour récupérer tes premières citations (array_slice()) en faisant attention parce que des fois c'est chaud :)
- Tu les lui colle sous le nez et tu recommance jusqu'à ce qu'il n'ait plus faim... pis si môssieur veut un deuxième service, t'en remet une platrée au four en suivant à nouveau la préparation

Vous pouvez servir accompagné d'un peu de javascript ou de css selon l'humeur ;)

Bref, ca n'a rien de sorcier si tu as envie de te plonger dedans et t'es sans doute tout aussi capable qu'un autre.. Pis de toute façon s'il y a des chose que tu ne maîtrise pas, qui te bloquent, qui te causent du tracas et j'en passe... bah on est là pour t'aider :)

La semaine prochaine je expliquerait comment préparer une bonne blanquette de livre d'or ;)

Eléphant du PHP | 113 Messages

22 sept. 2006, 22:56

Désolé Ryle de t'avoir fait bossé pour rien.
En fait, j'ai modifié l'id.
Ca m'a pris du temps mais j'ai mon résultat. Et pour être honnète, je dois dire que depuis 6 mois ou j'ai fais mon site, le retour dans le PHP est un peu douloureux. J'étais déjà pas terrible mais maintenant ... :?

Merci quand-même ! :wink: