[PhP]Choisir au hasard

Discussion dans 'Web, design' créé par MbK_, 29 Juin 2005.

Statut de la discussion:
Fermée.
  1. Offline
    MbK_ Etudjant
    salout à tous,

    J'ai un petit problème en PHP. :/

    Je dois afficher en première page d'un site, un sondage (ouvert et non fermé) au hasard.

    Pour cela, il faudrait que je récupère les ID des sondages qui m'interessent et que j'en puise un au hasard mais je ne sais pas comment procéder.
    Les ID ne se suivent pas forcément. alors je ne sais comment faire.

    Avez vous une idée?

    Merci :)
    MbK_, 29 Juin 2005
    #1
  2. Offline
    null ose();
    Je viens de vite le faire (je suis encore dans mon lit là :D)

    Code:
    function randSurvey()
    {
    	$maxSurvey = mysql_query("SELECT id FROM sondage");
    	$maxSurvey = mysql_num_rows($maxSurvey);
    	
    	$idRand = rand(1, $maxSurvey);
    	
    	$sql = mysql_query("SELECT id FROM sondage WHERE id = '".$idRand."'");
    
    	if(mysql_num_rows($sql) == 1)
    	   return $idRand;
    	else 
    	   randSurvey();
    }
    Donc j'explique le code, il faut choisir un ID aléatoire dans la base de données

    La fonction rand existe mais il lui faut un ID de départ et un ID de fin. L'ID de départ c'est 1 et l'idée de fin, c'est le nombre de sondage de la table (on va le prendre ainsi).

    Code:
    $maxSurvey = mysql_query("SELECT id FROM sondage");
    $maxSurvey = mysql_num_rows($maxSurvey);
    On récupère le nombre d'entrées dans la table.


    Code:
    $idRand = rand(1, $maxSurvey);
    On génere un ID aléatoire compris entre 1 et le nombre maximum de résultats.

    Code:
    $sql = mysql_query("SELECT id FROM sondage WHERE id = '".$idRand."'");
    
    if(mysql_num_rows($sql) == 1)
    	   return $idRand;
    else 
    	   randSurvey();
    
    On sélectionne l'ID (une information) de la base de données ave l'ID trouvé pour vérifier que l'ID existe (un sondage a peut-être été supprimé). On vérifie s'il existe, si c'est le cas, on renvoit l'ID, sinon on relance la fonction (fonction récurrente) jusq'au moment où il trouve un bon ID.
    null, 29 Juin 2005
    #2
  3. Offline
    MbK_ Etudjant
    oui en effet j'avais pensé à ca mais le probleme est que les sondages ne se suivent pas forcément.

    exemple :

    j'ai 7sondages dont les id sont les suivantes :

    1 2 4 5 6 8 9

    et les sondages encore "ouverts" sont les suivants :

    2 4 6 9

    Je dois donc choisir aléatoirement un de ces sondage la. Les Id ne se suivent donc pas :x

    C'est la que réside le problème
    MbK_, 29 Juin 2005
    #3
  4. Offline
    zoheir cvm.mangaleet()
    alors tu stockes les id dans un tableau, et tu appelles la fonction rand avec comme parametre la taille du tableau.
    zoheir, 29 Juin 2005
    #4
  5. Offline
    oNi- Elite
    ouep et donc tu joues sur l'indice du tableau et non sur l'ID.
    oNi-, 29 Juin 2005
    #5
  6. Offline
    MbK_ Etudjant
    ok mais le probleme reside dans le fait que je n'ai jamais vraiment compris comment les array s'utilisaient efficacement.

    vous pourriez pas en dire un peu plus sur votre facon de faire?

    merci :)
    MbK_, 29 Juin 2005
    #6
  7. Offline
    null ose();
    ICI et ICI (pas de pages pour les exemples)
    null, 29 Juin 2005
    #7
  8. Offline
    MbK_ Etudjant
    bon j'ai du un peu réflechir, et c'est assez simple pour finir :)

    je vous met la solution

    Code:
    	//Determiner aléatoirement l'id du sondage affiché.
    	bdd();
    	$id = array();
    	$i=0;
    	$query = mysql_query("SELECT * FROM sondage WHERE ISNULL(date_ferme)") or die(mysql_error());
    	$nombre = @mysql_num_rows($query);
    	while ($donnees = mysql_fetch_array($query)){
    		$id[$i] = $donnees['id'];
    		$i++;
    	}
    	$IdRand = rand(0, $nombre);
    	$id_finale = $id[$IdRand];
    	$requete = mysql_query("SELECT * FROM sondage WHERE id = ".$id_finale." AND ISNULL(date_ferme)") or die(mysql_error());
    
    
    ....
    
    
    le reste coule de source

    Merci null et les autres :)
    MbK_, 29 Juin 2005
    #8
  9. Offline
    beankiller Riz Jaune
    Code:
    SELECT * FROM `sondage` WHERE ISNULL(date_ferme) ORDER BY rand() LIMIT 0,1
    
    Un pote me dit ça :eek:
    beankiller, 1 Juillet 2005
    #9
  10. Offline
    MbK_ Etudjant
    j'ai pas essayé mais j'ai bien peur que ca ne fonctionne pas pck on ne peut pas mettre des fonctions PHP ds du MySQL à ce que je sache.

    faux?
    MbK_, 2 Juillet 2005
    #10
  11. Offline
    Jereck Procrastinateur
    Equipe GamerZ.be
    C'est pas plutot : else { return randSurvey(); } ?
    Jereck, 2 Juillet 2005
    #11
  12. Offline
    zoheir cvm.mangaleet()
    nan le rand dans ce cas-ci est une fonction math. de mysql
    zoheir, 2 Juillet 2005
    #12
  13. Offline
    null ose();
    Je ne pense pas, faudrait tester
    null, 2 Juillet 2005
    #13
  14. Offline
    Jereck Procrastinateur
    Equipe GamerZ.be
    Ben, avec ton code, la fonction peut arriver à la fin, sans n'avoir rien renvoyé ...
    Jereck, 2 Juillet 2005
    #14
  15. Offline
    null ose();
    Tu as raison, je viens de faire le test mais je viens surtout de remarquer que j'avais fais comme ça dans mon fichier qui gérait les random des tutos, et pas dans l'exemple :oops:

    C'est une deformation car d'habitude je stoque dans une variable buffer le résultat (avec les class). Désolé
    null, 2 Juillet 2005
    #15
  16. Offline
    Jereck Procrastinateur
    Equipe GamerZ.be
    Ha ben ma remarque a bien servit alors :p
    Jereck, 2 Juillet 2005
    #16
  17. Offline
    sebge2 Touriste
    Code:
    function randSurvey()
    {
    	$maxSurvey = mysql_query("SELECT id FROM sondage");
    	$maxSurvey = mysql_num_rows($maxSurvey);
    	
    	$idRand = rand(1, $maxSurvey);
    	
    	$sql = mysql_query("SELECT id FROM sondage WHERE id = '".$idRand."'");
    
    	if(mysql_num_rows($sql) == 1)
    	   return $idRand;
    	else 
    	   randSurvey();
    }
    je reprend ton idée ms le truc c qu'il faut voir si le numéro généré correspond a qqch ... il faut une boucle .. tant que le numéro généré n'existe pas alors tu génère un nouveau numéro
    Code:
    function randSurvey()
    {
    	$maxSurvey = mysql_query("SELECT id FROM sondage ORDER BY id DESC LIMIT 1");	
    	$idRand = rand(1, $maxSurvey);
    	while(@mysql_num_rows(@mysql_query("SELECT id FROM sondage WHERE id=".$idRand." LIMIT 1"))==0) $idRand = rand(1, $maxSurvey);
    	return $idRand;
    
    }
    
    ou alors si tu es radin sur les lignes :
    Code:
    function randSurvey()
    {
    	$maxSurvey = mysql_query("SELECT id FROM sondage ORDER BY id DESC LIMIT 1");	
    	do{$idRand = rand(1, $maxSurvey); while(@mysql_num_rows(@mysql_query("SELECT id FROM sondage WHERE id=".$idRand." LIMIT 1"))==0) }
    	return $idRand;
    
    }
    
    sebge2, 3 Juillet 2005
    #17
  18. Offline
    deleter_moi ex membre
    Laisser MySQL faire le boulot est probablement le plus efficace dans ce cas mais pour votre édification personnelle, voici un petit algo de sélection aléatoire d'un élément dans une liste quand on ne connaît a priori pas la longueur de la liste (j'ai plus fait de PHP depuis un moment mais ça devrait être bon).
    Code:
    for ($i = 1; $current = next(); $i++)
            if (rand(0, $i+1) < 2)
                    $result = $current;
    
    Avec next() qui retourne la valeur suivante dans la liste ou une valeur fausse quand on est au bout de la liste.

    Explication et démonstration ici.
    deleter_moi, 9 Juillet 2005
    #18
  19. Offline
    Bingo Beer Addict
    C'est la meilleure méthode effectivement.
    Ne sous-estimez pas SQL, il peut certainement faire beaucoup de choses que vous vous échinez à coder en PHP, et il le fait certainement mieux qu'un script.

    NB : quand on ne veut pas d'offset avec LIMIT, on peut ne pas le mettre, donc LIMIT 1 suffit.
    Bingo, 9 Juillet 2005
    #19
Statut de la discussion:
Fermée.