Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 27/01/2010, 14h32   #1 (permalink)
Invité de passage
 
Date d'inscription: janvier 2010
Messages: 2
Par défaut tirage au sort particulier

salut,

je suis en train de développer un script PHP où je tire au sort les entrées d'une table grâce à une requête "ORDER BY RAND()".

la particularité que j'aimerais ajouter serait d'empêcher la même IP de voir deux fois la même entrée. j'ai donc créé une table log dans laquelle je rentre les IPs et les ids des éléments vus. et à chaque fois qu'un élément est tiré au sort, je scanne la table log, et si l'ip du visiteur a déjà vu cet élément dans la table log, je relance un tirage.

mon problème c'est que lorsque l'IP a vu tous les éléments, mon script part dans une boucle infinie et tire au sort des éléments en espérant en trouver un qui n'a pas été vu.

j'avais pensé à mettre une variable $limite, qui bloquerait la recherche après 10 tours par exemple, et qui dirait "il n'existe plus aucun élément non-vu". le problème c'est que mathématiquement la fonction aléatoire peut très bien tirer au sort 10 éléments déjà vus alors qu'il reste des éléments non-vus à voir...

Code :
 
<?php
$found = 0;
while($found != 1)
{
$found = 1;
		
// requête qui tire au sort un élément
(...)
				
// l'élément aléatoire est choisi, peut-on l'utiliser ?
while($data_random = mysql_fetch_assoc($req_random))
{
	// est-ce que l'élément tiré a déjà été vu par l'ip du visiteur ?
	(...) SELECT * FROM log WHERE ip='$_SERVER[REMOTE_ADDR]'"; (...)
 
			
	while($data_log = mysql_fetch_assoc($req_log))
	{
	if($data_random['id'] == $data_log['element_id']) { $found = 0; }
	// si l'élément choisi aléatoirement correspond à une entrée du log pour l'ip du visiteur
	// alors on ne peut pas l'afficher
	}
 
	if($found == 1)
	{
	// si on arrive là c'est que l'élément peut être affiché. on sauvegarde les données de la requête dans des variables pour les utiliser plus loin dans la page
	}
}
}
?>
quelqu'un aurait une idée de réécriture ? merci d'avance !
mm2703 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/01/2010, 14h43   #2 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 9 968
Par défaut

Fait ton rand() uniquement sur les élements que tu veux
Code sql :
SELECT id FROM table_entrees
WHERE id NOT IN (SELECT id FROM log WHERE ip='12.192.10.8')
ORDER BY RAND()
LIMIT 1;
sabotage est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/01/2010, 14h51   #3 (permalink)
Invité de passage
 
Date d'inscription: janvier 2010
Messages: 2
Par défaut

solution très élégante que je ne connaissais pas !

merci beaucoup
mm2703 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS PHPFAQ PHPCours PHPSources PHPLivres PHPScripts PHPOutils PHPComparatifsZend Framework

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 18h17.


Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.