[Résolu] Petit problème avec "rand"

Petit problème avec "rand" [Résolu] - PHP - Programmation

Marsh Posté le 18-02-2009 à 14:39:10    

Salut à tous,
 
J'affiche sur mon site une photo aléatoire sur la page d'accueil grâce à la fonction "rand" de php.
Ça fonctionne très bien, sauf que parfois, aucune photo ne s'affiche.
De quoi cela peut-il provenir ?
 
Voici mon code :
 

Code :
  1. <?php
  2. $nb_photos = mysql_num_rows(mysql_query("SELECT..." )); // on récupère le nombre de photos
  3. $aleatoire = rand(0,$nb_photos);
  4. $requete = mysql_query("SELECT... LIMIT $aleatoire,1" );
  5. while ($resultats = mysql_fetch_array($requete)) {
  6. // affichage de la photo
  7. }
  8. ?>


 
Merci par avance !


Message édité par Ben-o le 18-02-2009 à 15:57:49
Reply

Marsh Posté le 18-02-2009 à 14:39:10   

Reply

Marsh Posté le 18-02-2009 à 15:00:37    

:heink:  
 
Tu as lu ça ?

Reply

Marsh Posté le 18-02-2009 à 15:12:02    

tu as un problème de limite...  
 
essaie rand(1,$nb_photos);  
 
Sinon, mets uniquement une photo, puis deux pour vérifier le bon fonctionnement


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 18-02-2009 à 15:25:28    

Salut jagstang, j'ai essayé avec rand(1,$nb_photos); mais j'ai le même soucis...
 
Et j'ai également essayé avec une seule photo, puis deux, mais ça me fait la même chose.
 
Peut-être que ça vient du temps d'exécution du script ? La photo n'est peut être pas sélectionnée avant l'affichage de la page ?
J'ai ajouté ce script à ma page faisant un include.

Reply

Marsh Posté le 18-02-2009 à 15:29:25    

J'ai testé en mettant directement le script dans la page (sans passer par un include), mais le problème est toujours là... ;-(

Reply

Marsh Posté le 18-02-2009 à 15:30:32    

macgawel a écrit :

:heink:  
 
Tu as lu ==>ça<== ?


Sinon, pour rester sur ton code :

Code :
  1. <?php
  2. $nb_photos = mysql_num_rows(mysql_query("SELECT..." )); // on récupère le nombre de photos
  3. $aleatoire = rand(0,$nb_photos);
  4. $requete = mysql_query("SELECT... LIMIT $aleatoire,1" );
  5. //Affichage de $aleatoire pour débuggage
  6. echo $aleatoire.'<br />';
  7. while ($resultats = mysql_fetch_array($requete)) {
  8. // affichage de la photo
  9. }
  10. ?>

Reply

Marsh Posté le 18-02-2009 à 15:34:31    

Pardon macgawel, je n'avais pas vu le lien... désolé !

Reply

Marsh Posté le 18-02-2009 à 15:49:16    

Quelques remarques :
1)

Code :
  1. $nb_photos = mysql_num_rows(mysql_query("SELECT..." )); // on récupère le nombre de photos

Tu demande à mysql de tout t'envoyer juste pour compter le nombre de photos? :o Avec ce genre de solution, il ne faut pas t'étonner si ton serveur devient lent. A la place, fais simplement un "select count(*)" et regardes la valeur retourné par mysql. Ca sera beaucoup plus rapide.
 
2) limit 0,1 => on saute zéro ligne et on en retourne une (on retourne la première)
limit 5,1 => on saute cinq lignes et on en retourne une (on retourne la sixième)
limite 5,2 => on saute cinq lignes et on en retourne deux (on retourne les sixième et septième lignes)
 
Par conséquent, il faut faire un rand(0,$nb_photos-1); si on veut utiliser le résultat du rand dans la requête.
 
 
 
3)

Code :
  1. <?php
  2. $nb_photos = mysql_num_rows(mysql_query("SELECT..." )); // on récupère le nombre de photos
  3. $aleatoire = rand(0,$nb_photos);
  4. $requete = mysql_query("SELECT... LIMIT $aleatoire,1" );
  5. while ($resultats = mysql_fetch_array($requete)) {
  6. // affichage de la photo
  7. }
  8. ?>


Avec MYSQL, tu peux résumer tout cet enchainement en un :

Code :
  1. <?php
  2. $requete = mysql_query("SELECT... ORDER BY RAND() LIMIT 1" );
  3. if ($resultats = mysql_fetch_array($requete)) {
  4. // j'affiche
  5. }
  6. ?>

Attention, solution à n'utiliser que sur des tables de taille moyennes à petite (devient lent quand on a un grand nombre de lignes).
 
4) Le coup du array_rand proposé par macgawel est valable quand on a déjà les données dans un tableau, mais dans le cas présent, ça nécessite de récupérer toutes les données de la table (ce que tu fais déjà pour ton décompte) et de tout copier dans un tableau. Tout ça prend du temps et consomme de la mémoire.

Reply

Marsh Posté le 18-02-2009 à 15:56:17    

omega2 a écrit :

4) Le coup du array_rand proposé par macgawel est valable quand on a déjà les données dans un tableau, mais dans le cas présent, ça nécessite de récupérer toutes les données de la table (ce que tu fais déjà pour ton décompte) et de tout copier dans un tableau. Tout ça prend du temps et consomme de la mémoire.


 :o  
Je suis parti de l'existant, et quitte à passer un mysql_query("SELECT..." ), et sachant qu'on aura besoin de récupérer l'image (ou son adresse), je me suis dit que tant qu'à faire...
Et au moins c'est standard, pas comme le SELECT... ORDER BY RAND() LIMIT 1  :kaola:

Reply

Marsh Posté le 18-02-2009 à 15:57:30    

Merci omega pour toutes ces précisions, le problème semble résolu !

Reply

Marsh Posté le 18-02-2009 à 15:57:30   

Reply

Marsh Posté le 01-03-2009 à 22:26:57    

$aleatoire = rand(0,$nb_photos-1);
 
Devrais marcher ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed