[RESOLU] pagination d'une requète sql aléatoir

Petit nouveau ! | 7 Messages

26 nov. 2013, 10:09

Bonjour a tous ,
Je travail sur un projet en ce moment (pour m'entrainer , je débute).

J'ai donc réussi a créer une pagination automatique du résultat d'une requète sql en suivant un tuto sur internet dont voici mon code :

Code : Tout sélectionner

<?php try { $bdd = new PDO('mysql:host=localhost;dbname=dechetterie_npdc' , 'root' , '' ) ; } catch (Exception $e) { die('Erreur :' .$e->getMessage()); } // --------------- Étape 2 ----------------- // On écrit les liens vers chacune des pages // ----------------------------------------- // On met dans une variable le nombre de messages qu'on veut par page $nombreDeMessagesParPage = 4; // Essayez de changer ce nombre pour voir :o) // On récupère le nombre total de messages $retour = $bdd->query('SELECT COUNT(*) AS nb_messages FROM npdc'); $donnees = $retour->fetch(); $totalDesMessages = $donnees['nb_messages']; // On calcule le nombre de pages à créer $nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage); // Puis on fait une boucle pour écrire les liens vers chacune des pages echo 'Page : '; for ($i = 1 ; $i <= $nombreDePages ; $i++) { echo '<a href="test3.php?page=' . $i . '">' . $i . '</a> '; } ?> </p> <?php // --------------- Étape 3 --------------- // Maintenant, on va afficher les messages // --------------------------------------- if (isset($_GET['page'])) { $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4) } else // La variable n'existe pas, c'est la première fois qu'on charge la page { $page = 1; // On se met sur la page 1 (par défaut) } // On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL $premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage; $reponse = $bdd->query('SELECT * FROM npdc ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage); while ($donnees = $reponse->fetch()) { echo '<p><strong>' . $donnees['adresse'] . '</strong> a écrit :<br />' . $donnees['ville'] . '</p>'; } ?>
Je voudrais maintenant obtenir la meme chose mais avec une requete à tri aléatoir du type :

Code : Tout sélectionner

$reponse = $bdd->query('select * from (select * from npdc ) s order by rand()');
Je ne sais pas trop comment mis prendre , sur le code actuel , on fait une boucle et a chaque changement de page , on relance la requete en changeant les LIMIT ( enfin si j'ai bien compris);

Si vous avez une solution( un tuto , une idée de départ??) , j'ai pas mal chercher sur le web mais j'ai pas trouvé se que je voulais.

En vous remerciant.

ViPHP
xTG
ViPHP | 7331 Messages

26 nov. 2013, 14:34

Dans ton cas il faut faire une requête qui retourne toute la table et la stocker si tu veux arriver à une pagination de ce système.

Soit avec un échange client/serveur en stockant le résultat de la requête dans une variable de session et en opérant la pagination sur la variable de session.
Soit en envoyant tout au client mais en utilisant une pagination en javascript.

Dans tous les cas si ta table (ou regroupement de table) peut renvoyer des mio de données... C'est pas vraiment une solution viable si tu ne veux pas mettre ton serveur à genoux...

Petit nouveau ! | 7 Messages

26 nov. 2013, 15:32

OK ca fonctionne , j'ai donc utilisé " session_start() "

Je remet le code avec les modifications en couleur violet:

Code : Tout sélectionner

[color=#BF00BF]<?php session_start(); if (!isset($_SESSION['key'])) { $_SESSION['key'] = rand(1, 1000); } ?>[/color] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <?php try { $bdd = new PDO('mysql:host=localhost;dbname=dechetterie_npdc' , 'root' , '' ) ; } catch (Exception $e) { die('Erreur :' .$e->getMessage()); } // --------------- Étape 2 ----------------- // On écrit les liens vers chacune des pages // ----------------------------------------- // On met dans une variable le nombre de messages qu'on veut par page $nombreDeMessagesParPage = 4; // Essayez de changer ce nombre pour voir :o) // On récupère le nombre total de messages $retour = $bdd->query('SELECT COUNT(*) AS nb_messages FROM npdc'); $donnees = $retour->fetch(); $totalDesMessages = $donnees['nb_messages']; // On calcule le nombre de pages à créer $nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage); // Puis on fait une boucle pour écrire les liens vers chacune des pages echo 'Page : '; for ($i = 1 ; $i <= $nombreDePages ; $i++) { echo '<a href="test4.php?page=' . $i . '">' . $i . '</a> '; } ?> </p> <?php // --------------- Étape 3 --------------- // Maintenant, on va afficher les messages // --------------------------------------- if (isset($_GET['page'])) { $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4) } else // La variable n'existe pas, c'est la première fois qu'on charge la page { $page = 1; // On se met sur la page 1 (par défaut) } // On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL $premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage; $reponse = $bdd->query('SELECT * FROM npdc ORDER BY[color=#BF00BF] RAND(' . $_SESSION['key'] . ')[/color] LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage); while ($donnees = $reponse->fetch()) { echo '<p><strong>' . $donnees['adresse'] . '</strong> a écrit :<br />' . $donnees['ville'] . '</p>'; } ?> </body> </html>
Voila ca fonctionne comme je veus , maintenant si vous voyer des erreurs ou d'autres facon de faire n'hésiter pas .
Merci

ViPHP
xTG
ViPHP | 7331 Messages

26 nov. 2013, 19:22

Moi j'ai à y redire. :)
A lire la documentation cela initialise la séquence du rand.
Mais là du coup tu la réinitialises à chaque fois et donc repars à chaque fois du début de la séquence.
Je peux me tromper mais c'est l'interprétation que j'en ai de la documentation.
Mais si tu n'as pas aperçu de souci (toujours les mêmes enregistrements) c'est que je me trompe. :mrgreen:

Petit nouveau ! | 7 Messages

26 nov. 2013, 21:20

Oui j'ai bien vérifié aucun doublon , mème quand je me balade entre les pages donc c'est parfait .