[PhP]Choisir au hasard

Statut
N'est pas ouverte pour d'autres réponses.

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 :)
 

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.
 
1er
OP
MbK_

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
 

zoheir

cvm.mangaleet()
alors tu stockes les id dans un tableau, et tu appelles la fonction rand avec comme parametre la taille du tableau.
 

oNi-

:baille: Lecteur
[ cvm a dit:
]alors tu stockes les id dans un tableau, et tu appelles la fonction rand avec comme parametre la taille du tableau.
ouep et donc tu joues sur l'indice du tableau et non sur l'ID.
 
1er
OP
MbK_

MbK_

Etudjant
oNi- a dit:
[ cvm a dit:
]alors tu stockes les id dans un tableau, et tu appelles la fonction rand avec comme parametre la taille du tableau.
ouep et donc tu joues sur l'indice du tableau et non sur l'ID.
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 :)
 

null

ose();
ICI et ICI (pas de pages pour les exemples)
 
1er
OP
MbK_

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 :)
 

beankiller

Riz Jaune
Code:
SELECT * FROM `sondage` WHERE ISNULL(date_ferme) ORDER BY rand() LIMIT 0,1
Un pote me dit ça :eek:
 
1er
OP
MbK_

MbK_

Etudjant
beankiller a dit:
Code:
SELECT * FROM `sondage` WHERE ISNULL(date_ferme) ORDER BY rand() LIMIT 0,1
Un pote me dit ça :eek:
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?
 

Jereck

Α & Ω
Staff
null a dit:
Code:
$sql = mysql_query("SELECT id FROM sondage WHERE id = '".$idRand."'");

if(mysql_num_rows($sql) == 1)
	   return $idRand;
else 
	   randSurvey();
C'est pas plutot : else { return randSurvey(); } ?
 

zoheir

cvm.mangaleet()
MbK_ a dit:
beankiller a dit:
Code:
SELECT * FROM `sondage` WHERE ISNULL(date_ferme) ORDER BY rand() LIMIT 0,1
Un pote me dit ça :eek:
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?
nan le rand dans ce cas-ci est une fonction math. de mysql
 

null

ose();
Jereck a dit:
null a dit:
Code:
$sql = mysql_query("SELECT id FROM sondage WHERE id = '".$idRand."'");

if(mysql_num_rows($sql) == 1)
	   return $idRand;
else 
	   randSurvey();
C'est pas plutot : else { return randSurvey(); } ?
Je ne pense pas, faudrait tester
 

Jereck

Α & Ω
Staff
null a dit:
Je ne pense pas, faudrait tester
Ben, avec ton code, la fonction peut arriver à la fin, sans n'avoir rien renvoyé ...
 

null

ose();
Jereck a dit:
null a dit:
Je ne pense pas, faudrait tester
Ben, avec ton code, la fonction peut arriver à la fin, sans n'avoir rien renvoyé ...
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é
 

Jereck

Α & Ω
Staff
Ha ben ma remarque a bien servit alors :p
 

sebge2

Elite
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;

}
 
D

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.
 

Bingo

Beer Addict
beankiller a dit:
Code:
SELECT * FROM `sondage` WHERE ISNULL(date_ferme) ORDER BY rand() LIMIT 0,1
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.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut