IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Affichage aléatoire avec pagination [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Affichage aléatoire avec pagination
    Bonjour

    Je suis en train de développer un affichage avec pagination. Imaginons que j'ai par exemple 3 pages. En bas de chaque page il y a des liens pour passer d'une page à l'autre (1,2,3).
    Actuellement quand j'arrive sur la page 1, pas de souci mes enregistrements sont bien afficher aléatoirement. Mais quand je vais sur la page 2, je retrouve des enregistrements que j'avais en page 1. Et si je réaffiche la page 1, elle est différente du premier affichage de la page 1 que j'avais effectué précédemment.

    Je souhaiterais obtenir un affichage aléatoire des 3 pages sans doublon, et en quelque sorte "mémoriser" les pages de façon à ce que si je vais de page en page je me retrouve toujours avec la même page 1, la même page 2, etc...

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    // Numéro de la page à afficher
    //on verifie si la variable $pg est definie, sinon on l'initialise a 1
    if(!isset($_GET['page'])){$page = 0;}
    else{$page = $_GET['page'];}
     
    //on verifie si la variable qui est censée être un numero de page
    // est bien un chiffre pour éviter une injection mysql
    if(!is_numeric($page)){$page = 0;} 
     
    // Nombre de résultats par page
    $nb = 12;
    // Assure au moins $nb résultats par page
    if(isset($_GET['nb'])) {
    $nb = max(intval($_GET['nb']), $nb); 
    }
     
    // Nombre total d'enregistrements
    $sql = 'SELECT COUNT(*) FROM identification WHERE actif = 1;';
    $query = mysql_query($sql, $connexion)
    or die('Erreur MySQL : '.mysql_error());
     
    $row = mysql_fetch_row($query);
     
    $total = $row[0];
     
    // Nombre maximum de pages (ceil arrondit au nombre supérieur)
    $max_pg = ceil($total / $nb);
     
    // Selection des enregistrements pour la page considérée
    $sql = 'SELECT id_membre, date_naissance, pseudo, id_pays, id_ville,
    actif FROM identification 
    WHERE actif = 1 ORDER BY RAND() LIMIT '.($page * $nb).','.$nb.''
    or die('Erreur MySQL : '.mysql_error());
     
    $query = mysql_query($sql, $connexion)
    or die('Erreur MySQL : '.mysql_error());
     
    while($list = mysql_fetch_assoc($query)) {
     
    // affichage des enregistrements
     
    } // Fin du while
     
    mysql_close();
     
    // Les liens de pagination (1,2,3, etc)
    for($i = 0 ; $i < $max_pg ; $i++) {echo ' <a href="?page='.$i.'&nb='.$nb.'">'.($i+1).'</a>';}
    ?>
    Le problème vient du fait que je fais l'ORDER BY RAND() à chaque fois,
    mais je suis débutant je ne sais pas comment faire...

    Merci pour votre aide

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il faudrait initialiser le générateur et conserver ce nombre (par session) pour que les résultats ne diffèrent pas :
    RAND(), RAND(N)

    Retourne un nombre aléatoire à virgule flottante compris dans l'intervalle 0 - 1.0. Si l'argument entier N est spécifié, il est utilisé comme initialisation du générateur de nombres aléatoires.
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> SELECT RAND();
            -> 0.9233482386203
    mysql> SELECT RAND(20);
            -> 0.15888261251047
    mysql> SELECT RAND(20);
            -> 0.15888261251047
    mysql> SELECT RAND();
            -> 0.63553050033332
    mysql> SELECT RAND();
            -> 0.70100469486881
    http://dev.mysql.com/doc/refman/5.0/...functions.html

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Oula...
    Comprends rien...

    Je suis débutant je crois qu'il n'est pas inutile de la rappeler...!

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    La fonction MySQL RAND a un paramètre optionnel, qui vous permettrait de retrouver toujours les mêmes valeurs (cf l'exemple mis en gras). Il vous suffit donc d'en trouver/générer un pour chaque visiteur ou recherche, de le mémoriser (session dans l'idéal) et enfin de l'injecter dans vos requêtes, pour que vos résultats, d'une page à l'autre, gardent leur cohérence.

    En gros, il suffirait d'ajouter ces quelques lignes en tout début de script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    session_start();
     
    if (!isset($_SESSION['key'])) {
        $_SESSION['key'] = rand(1, 1000);
    }
    Puis de modifier votre requête telle que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = 'SELECT id_membre, date_naissance, pseudo, id_pays, id_ville,
    actif FROM identification 
    WHERE actif = 1 ORDER BY RAND(' . $_SESSION['key'] . ') LIMIT '.($page * $nb).','.$nb.'';
    (le or die ne servant à rien à cette ligne, j'en ai profité pour le supprimer)

    (non testé)

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 329
    Points : 97
    Points
    97
    Par défaut Waouh...!
    C'est chaud bouillant... Mais ça fonctionne parfaitement !

    Merci pour votre aide rapide

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Affichage aléatoire avec pagination
    Bonjour julp,

    Je le même probleme que Pasc06, Je souhaiterais obtenir un affichage aléatoire des 3 pages sans doublon, et en quelque sorte "mémoriser" les pages de façon à ce que si je vais de page en page je me retrouve toujours avec la même page 1, la même page 2, etc...

    Voici le script pour faire la pagination :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    function buildNavigation($pageNum_Recordset1,$totalPages_Recordset1,$prev_Recordset1,$next_Recordset1,$separator=" | ",$max_links=10, $show_page=true)
    {
                    GLOBAL $maxRows_rsSiteMarchand,$totalRows_rsSiteMarchand;
    	$pagesArray = ""; $firstArray = ""; $lastArray = "";
    	if($max_links<2)$max_links=2;
    	if($pageNum_Recordset1<=$totalPages_Recordset1 && $pageNum_Recordset1>=0)
    	{
    		if ($pageNum_Recordset1 > ceil($max_links/2))
    		{
    			$fgp = $pageNum_Recordset1 - ceil($max_links/2) > 0 ? $pageNum_Recordset1 - ceil($max_links/2) : 1;
    			$egp = $pageNum_Recordset1 + ceil($max_links/2);
    			if ($egp >= $totalPages_Recordset1)
    			{
    				$egp = $totalPages_Recordset1+1;
    				$fgp = $totalPages_Recordset1 - ($max_links-1) > 0 ? $totalPages_Recordset1  - ($max_links-1) : 1;
    			}
    		}
    		else {
    			$fgp = 0;
    			$egp = $totalPages_Recordset1 >= $max_links ? $max_links : $totalPages_Recordset1+1;
    		}
    		if($totalPages_Recordset1 >= 1) {
    			#	------------------------
    			#	Searching for $_GET vars
    			#	------------------------
    			$_get_vars = '';			
    			if(!empty($_GET) || !empty($HTTP_GET_VARS)){
    				$_GET = empty($_GET) ? $HTTP_GET_VARS : $_GET;
    				foreach ($_GET as $_get_name => $_get_value) {
    					if ($_get_name != "pageNum_rsSiteMarchand") {
    						$_get_vars .= "&$_get_name=$_get_value";
    					}
    				}
    			}
    			$successivo = $pageNum_Recordset1+1;
    			$precedente = $pageNum_Recordset1-1;
    			$firstArray = ($pageNum_Recordset1 > 0) ? "<a href=\"$_SERVER[PHP_SELF]?pageNum_rsSiteMarchand=$precedente$_get_vars\">$prev_Recordset1</a>" :  "$prev_Recordset1";
    			# ----------------------
    			# page numbers
    			# ----------------------
    			for($a = $fgp+1; $a <= $egp; $a++){
    				$theNext = $a-1;
    				if($show_page)
    				{
    					$textLink = $a;
    				} else {
    					$min_l = (($a-1)*$maxRows_rsSiteMarchand) + 1;
    					$max_l = ($a*$maxRows_rsSiteMarchand >= $totalRows_rsSiteMarchand) ? $totalRows_rsSiteMarchand : ($a*$maxRows_rsSiteMarchand);
    					$textLink = "$min_l - $max_l";
    				}
    				$_ss_k = floor($theNext/26);
    				if ($theNext != $pageNum_Recordset1)
    				{
    					$pagesArray .= "<a href=\"$_SERVER[PHP_SELF]?pageNum_rsSiteMarchand=$theNext$_get_vars\">";
    					$pagesArray .= "$textLink</a>" . ($theNext < $egp-1 ? $separator : "");
    				} else {
    					$pagesArray .= "$textLink"  . ($theNext < $egp-1 ? $separator : "");
    				}
    			}
    			$theNext = $pageNum_Recordset1+1;
    			$offset_end = $totalPages_Recordset1;
    			$lastArray = ($pageNum_Recordset1 < $totalPages_Recordset1) ? "<a href=\"$_SERVER[PHP_SELF]?pageNum_rsSiteMarchand=$successivo$_get_vars\">$next_Recordset1</a>" : "$next_Recordset1";
    		}
    	}
    	return array($firstArray,$pagesArray,$lastArray);
    }
    _____________________________________________________

    Ma requette SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $maxRows_rsSiteMarchand = 3;
    $pageNum_rsSiteMarchand = 0;
    if (isset($_GET['pageNum_rsSiteMarchand'])) {
      $pageNum_rsSiteMarchand = $_GET['pageNum_rsSiteMarchand'];
    }
    $startRow_rsSiteMarchand = $pageNum_rsSiteMarchand * $maxRows_rsSiteMarchand;
     
    $colname_rsSiteMarchand = "-1";
    if (isset($_GET['cid'])) {
      $colname_rsSiteMarchand = (get_magic_quotes_gpc()) ? $_GET['cid'] : addslashes($_GET['cid']);
    }
    mysql_select_db($database_ohconnexion, $ohconnexion);
    $query_rsSiteMarchand = sprintf("SELECT * FROM ohmarchant WHERE MarchantCategorieID = %s ORDER BY RAND ()", GetSQLValueString($colname_rsSiteMarchand, "int"));
    $query_limit_rsSiteMarchand = sprintf("%s LIMIT %d, %d", $query_rsSiteMarchand, $startRow_rsSiteMarchand, $maxRows_rsSiteMarchand);
    $rsSiteMarchand = mysql_query($query_limit_rsSiteMarchand, $ohconnexion) or die(mysql_error());
    $row_rsSiteMarchand = mysql_fetch_assoc($rsSiteMarchand);
    _______________________________________

    Merci de m'aider a appliquer votre méthode deja cité, merci bcp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] sélection des dernières lignes avec affichage aléatoire
    Par nabmoah dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/08/2008, 23h57
  2. Réponses: 1
    Dernier message: 18/10/2007, 00h18
  3. [DisplayTag] Problème d'affichage avec pagination externe
    Par martopioche dans le forum Taglibs
    Réponses: 3
    Dernier message: 03/10/2007, 11h56
  4. [CSV] Affichage d'un fichier csv avec pagination
    Par arnoweb dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2006, 15h13
  5. Affichage aléatoire avec coéfficients
    Par groupejtt dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 08/11/2005, 22h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo