Affichage aleatoire mais SANS doublon

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Affichage aleatoire mais SANS doublon

par Stegue » 06 déc. 2006, 21:33

Merci, j'm'y colle.

par Truc » 06 déc. 2006, 21:31

je l'savais que ça allait se compliquer :wink:
j'ai éditer mon 1er message pour y ajouter plus de commentaires :wink:

Re: Affichage aleatoire mais SANS doublon

par Truc » 06 déc. 2006, 21:27

C'est la St Nicolas et comme tu as été gentil il va te faire un cadeau !
4.8
Merci, merci :fete:

par Stegue » 06 déc. 2006, 21:26

je l'savais que ça allait se compliquer :wink:

par Ajoloca » 06 déc. 2006, 21:21

Re,

Cette requête, tu la fait plusieurs fois comme le dit Truc?

Si c'est le cas tu devras utiliser la méthode qu'il t'a donné ou bien
l'executer une fois et conserver les résultats dans une variable (tableau) session et supprimer à chaque fois le poste utilisé.

par Stegue » 06 déc. 2006, 21:20

4.8

Re: Affichage aleatoire mais SANS doublon

par Ajoloca » 06 déc. 2006, 21:20

Ceci est valable si la version de MySQL est => 4.1
Toutàfé :)

J'ai quand même 8 chances sur 10 qu'il se trouve dans ce cas 8-|

De quelle version disposes tu ?
C'est la St Nicolas et comme tu as été gentil il va te faire un cadeau !

Re: Affichage aleatoire mais SANS doublon

par Truc » 06 déc. 2006, 21:17

Ceci est valable si la version de MySQL est => 4.1
Toutàfé :)

J'ai quand même 8 chances sur 10 qu'il se trouve dans ce cas 8-|

De quelle version disposes tu ?

par Stegue » 06 déc. 2006, 21:12

La voici:
$result = mysql_query("
                      SELECT DISTINCT citateurs_perso.nom, citateurs_perso.prenom, citations_perso.id, citations_perso.citation
                      FROM citateurs_perso LEFT JOIN citations_perso ON citateurs_perso.id = citations_perso.numcitateur 
                      WHERE score < 45 ORDER BY rand()
                      ASC $limit_str");

Re: Affichage aleatoire mais SANS doublon

par Ajoloca » 06 déc. 2006, 21:06

sur la page suivante
"L'astuce" du DISTINCT ne fonctionera donc pas puisque tu refait une requete par page.

Le distinct sert dans le cas où tu as plusieurs fois la même valeur pour un champ pour n'en récupérer qu'un exemplaire.

Il te faudrais récupérer les "id" des citations déjà affichées et effectuer une requête avec NOT IN par exemple.
Supposons que tu enregistre les "id" en session" tu as donc:
$query_plus = "";
if(isset($_SESSION['les_id']))
     $query_plus = " AND id NOT IN (".implode(",",$_SESSION['les_id']).")";
else 
     $_SESSION['les_id'] = array();

$query = "SELECT DISTINCT mon_champ FROM ma_table ".$query_plus." ORDER BY RAND()";
$tab_id = array();
//exécution requete et boucle
{     
     $tab_id[] = $id; //id de la requete, citation affichée
}
// récupération des id en sesion en "concaténant" les tableaux de session et des "id" actuellement affichés pour les exclure de la requete suivante
$_SESSION['les_id']=array_merge($_SESSION['les_id'],$tab_id);
Ceci est valable si la version de MySQL est => 4.1

par Ajoloca » 06 déc. 2006, 20:59

Re,

Montre ta requête, que l'on puisse voir plus clair.

Re: Affichage aleatoire mais SANS doublon

par Truc » 06 déc. 2006, 20:59

sur la page suivante
"L'astuce" du DISTINCT ne fonctionera donc pas puisque tu refait une requete par page.

Le distinct sert dans le cas où tu as plusieurs fois la même valeur pour un champ pour n'en récupérer qu'un exemplaire.

Il te faudrais récupérer les "id" des citations déjà affichées et effectuer une requête avec NOT IN par exemple.
Supposons que tu enregistre les "id" en session" tu as donc:
// variable qui va servir pour construire une requete dynamique en fonction des id déjà affichés une fois
$query_plus = "";

// si la variable de session existe alors on construit la requete avec un implode() sur les id déja affichés.... résultat => AND id NOT IN (1,5,12) .... par exemple
if(isset($_SESSION['les_id']))
     $query_plus = " AND id NOT IN (".implode(",",$_SESSION['les_id']).")";
else 
     $_SESSION['les_id'] = array(); // sinon on initialise la variable de session à vide.

//requete dynamique avec le bout de requete à ajouter le cas échéant
$query = "SELECT DISTINCT mon_champ FROM ma_table ".$query_plus." ORDER BY RAND()";
$tab_id = array();
//exécution requete et boucle
{     
     $tab_id[] = $id; //id de la requete, citation affichée
}
// récupération des id en sesion en "concaténant" les tableaux de session et des "id" actuellement affichés pour les exclure de la requete suivante
$_SESSION['les_id']=array_merge($_SESSION['les_id'],$tab_id);

par Stegue » 06 déc. 2006, 20:49

Apparemment, ça marche pas. Ca se répète encore. :?

par Ajoloca » 06 déc. 2006, 20:20

Bonjour,

Tu ajoutes la clause "DISTINCT"
SELECT DISTINCT mon_champ FROM ma_table ORDER BY RAND();

Affichage aleatoire mais SANS doublon

par Stegue » 06 déc. 2006, 19:58

Bonjour,
J'utilise un affichage des mes citations au hasard
ORDER BY rand()

Mais le hasard est forcément hasardeux et certaines citations se répètent parfois sur la page suivante. Enervant quoi !

Connaissez-vous une astuce, sans trop rentrer dans une usine à gaz, pour éviter ça ?

Merci.