Forum-webmaster
Technique - programmation => PHP / MySQL => Message commencé par: tom.dev le le 26-11-2013 a 08:43:52

Titre: pagination d'une requète sql aléatoir
Posté par: tom.dev le le 26-11-2013 a 08:43:52

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:

<?php
try
         {
         $bdd = new PDO('mysql:host=localhost;dbname=dechetterie_npdc' , 'root' , '' ) ;
         }
         catch (Exception $e)
         {
         die('Erreur :' .$e->getMessage());
         }


// --------------- Étape 1 -----------------
// Si un message est envoyé, on l'enregistre
// -----------------------------------------

if (isset($_POST['pseudo']) AND isset($_POST['message']))
{
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo'])); // On utilise mysql_real_escape_string et htmlspecialchars par mesure de sécurité
$message = mysql_real_escape_string(htmlspecialchars($_POST['message'])); // De même pour le message
$message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br />

// On peut enfin enregistrer :o)
mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')");
}

// --------------- É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:
$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.

Titre: Re:pagination d'une requète sql aléatoir
Posté par: pppplus le le 26-11-2013 a 11:17:34

Afficher de multiples pages d'après un ordre aléatoire... c'est pas top !

Ca voudrait dire qu'il faut stocker toutes les entrées de la table, les garder en mémoire pour le visiteur et ensuite gérer l'affichage des pages.

Imagine 150 pages ....
Et l'aléatoire doit-il être rechargé à chaque nouveau visiteur, à chaque nouvelle visite ?

Pourquoi te faut-il de l'aléatoire ? Car c'est lourd, très très lourd !

Titre: Re:pagination d'une requète sql aléatoir
Posté par: tom.dev le le 26-11-2013 a 14:34:05

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

Je remet le code avec les modifications en couleur violet:
[CODE]
<?php
session_start();

if (!isset($_SESSION['key'])) {
$_SESSION['key'] = rand(1, 1000);
}
?>

<!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[COLOR="Purple"] BY 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>
[/CODE]

Voila ca fonctionne comme je veus , maintenant si vous voyer des erreurs ou d'autres facon de faire n'hésiter pas .
Merci


Forum-webmaster | Actionné par YaBB SE
© 2001-2003, YaBB SE Dev Team. Tous droits réservés.