Pagination sur news

sebjan
Invité n'ayant pas de compte PHPfrance

02 juin 2010, 16:21

Bonjour,

Suite à un requêtage dans une base, voici le code utilisé pour afficher le résultat (5 news par page)

La 1ère page est OK, les suivantes me proposent le même résultat que la 1ère page. merci de votre aide

Code : Tout sélectionner

$query="SELECT * FROM news ORDER BY date_ins='".$_GET['date_ins']."' DESC , heure_ins='".$_GET['heure_ins']."' DESC"; $res_news = @mysql_query($query,$db); if (@mysql_num_rows($res_news)!=0) { $nb=mysql_num_rows($res_news); $nbpage=ceil($nb/5); if (($_GET['page']=="")) {$page=1;} for ($i=0; $i<$nb; $i=$i+1) { $list_news=@mysql_fetch_row($res_news); if ( ($i>=$list_ordre_news[1]*$page-$list_ordre_news[1]) and ($i<$list_ordre_news[1]*$page) ) { echo "<table align='center' width='80%' border='0' cellspacing='2' cellpadding='0' bgcolor='#F7F7F7' class='cadrenews'>"; echo "<tr>"; echo "<td>"; echo "<table width='100%' border='0' cellspacing='0' cellpadding='3'>"; echo "<tr>"; echo "<td width='60%' valign='top' class='textebig'>$list_news[0]</td>"; echo "<td width='40%' align='right' valign='top' class='textedate'>Posté le $list_news[4]<br>à $list_news[5]</td>"; echo "</tr>"; echo "</table>"; echo "<table width='100%'>"; echo "<tr>"; echo "<td width='100%' valign='top' class='textebig' >Url du message : <a href='$list_news[1]' target='_blank'>$list_news[1]</a></td>"; echo "</tr>"; echo "</table><br>"; echo "<table width='100%'>"; echo "<tr>"; echo "<td width='100%' valign='top' class='texte'>"; if ($list_news[3]!="") {echo "<img src='$list_news[3]' width='150' align='left'>";} echo $list_news[2] . "</td>"; echo "</tr>"; echo "</table><br>"; echo "</td></tr>"; echo "</table><br>"; } else {} } } echo "<div align='center' class='texte'>Page "; for ($j=1; $j<=$nbpage; $j++) { echo "<a href='?page$j=liste' class='lien1'>$j</a> "; } echo "</div>";

Mammouth du PHP | 672 Messages

03 juin 2010, 08:52

Bonjour.

- $list_ordre_news n'est pas défini (en tout cas pas dans la partie de code que tu donnes)
- $page n'est pas défini (sauf si $_GET['page'] == "")
Du coup, avec un $page non défini ça ne peut pas fonctionner...

Accessoirement, la requête peut être améliorée :
- Je ne connaissais pas le ORDER BY date_ins='<toto>', ça demande de trier sur la date_ins pour les enregistrements où date_ins est fixée ? :shock:

- Il y a une option sympa : LIMIT a,b : ça limite les résultats en prenant b éléments à partir de a.
=> En choisissant bien tes paramètres pour le LIMIT, tu peux récupérer juste ce qu'il te faut pour afficher la page demandée. Parce que là, si tu as 1000 nouvelles, à chaque fois tu les récupères toutes. Pas très optimisé, ça...

Et évite le @ avant tes fonctions.
Il permet de continuer le script même en cas d'erreur dans la fonction, et si une des fonctions mysql plante il n'y a pas de raison de continuer (et tu souhaites, au moins le temps de déboguer, récupérer les messages d'erreur).
Profite-en pour rajouter des or die( "Ici un message pour dire où on est ".mysql_error()) après tes fonction mysql (le temps de déboguer) : ça te donnera les informations en cas de plantage sur une de ces fonctions.

sebjan
Invité n'ayant pas de compte PHPfrance

06 juin 2010, 09:22

Merci pour cette 1ère réponse et ses infos. Mais après qq modifs, cela ne change rien

j'ai retiré les "@" mais pas d'erreur sur requête sql

Voilà le début du code SQL

Code : Tout sélectionner

$query="SELECT * FROM preferences"; $res_ordre_news = mysql_query($query,$db) or die(mysql_error()); $list_ordre_news = mysql_fetch_row($res_ordre_news) or die(mysql_error()); $list_ordre_news[0]=="du plus récent au plus ancien";
la table "preferences" contient le nbre de news à afficher / page (5 pour le moment, valeur récupérer avec $list_ordre_news[1])

$page n'est pas défini mais j'utilise

Code : Tout sélectionner

if (($_GET['page']=="")) {$page=1;}"
cela ne suffit pas ? si non un

Code : Tout sélectionner

$page=="";
suffirait ?

j'ai mis

Code : Tout sélectionner

$query="SELECT * FROM canalisations_news ORDER BY date_ins DESC , heure_ins DESC";

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 juin 2010, 13:08

Il te faut surtout récupérer la valeur de la page demandée :
$page = $_GET['page']; 
ou plus proprement :
if (empty($_GET['page'])) // si aucune valeur
   $page = 1; // valeur par défaut
else // sinon
   $page = $_GET['page']; // valeur de l'utilisateur
Ce que tu peux également écrire sous cette forme (plus légère, mais peut être moins lisible si tu n'en as pas l'habitude) :
$page = (empty($_GET['page'])) ? 1 : $_GET['page']; 
Cependant, comme le suggère macgawel, je te recommande également d'utiliser la commande LIMIT de MySQL pour limiter directement dans la requête le nombre d'enregistrement à retourner. Tes scripts seront ainsi plus performant si tu ne ramènes et ne traite que 5 enregistrements à la fois au lieu de ramener toute la table à chaque page :)

Attention également, si le nombre de page est paramétrable et provient de $list_ordre_news[1], ton calcul de $nbpage ne sera pas cohérent ( $nbpage=ceil($nb/5) )
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

sebjan
Invité n'ayant pas de compte PHPfrance

07 juin 2010, 06:54

Bonjour,

j'ai appliqué ton code ainsi que l'utilisation des LIMIT dans la syntaxe SQL mais cela ne fonctionne toujours pas.

seuls les 5 premières news s'affichent et ceci en page 1,2 ....

D'autres idées ?

Merci

Mammouth du PHP | 672 Messages

07 juin 2010, 09:13

Bonjour,

j'ai appliqué ton code ainsi que l'utilisation des LIMIT dans la syntaxe SQL mais cela ne fonctionne toujours pas.

seuls les 5 premières news s'affichent et ceci en page 1,2 ....

D'autres idées ?

Merci
- Afficher le contenu de tes variables, particulièrement $page, histoire de "tracer" les résultats.
- Afficher la requête avec echo $query, et la passer sous phpMyAdmin (ou autre) pour voir le résultat.

sinon, le principe logique que j'utilise, sur un système de pagination :
1. Regarder le nombre de pages.
- SELECT count(id) FROM matable WHERE (condition); renvoie le nombre d'enregistrements $nb_enregistrements
- ceil ($nb_enregistrements / $nb_enr_par_page) retourne le nombre de pages.
2. Déterminer la page demandée.
- Par défaut, $page_demandée = 1
- Si un paramètre est fourni, vérifier qu'il est entre 1 et $nombre_de_pages.
3. Préparer et passer la requête en fonction de la page, en utilisant LIMIT

Attention, LIMIT n'est pas standard, son utilisation dépend du Système de Gestion de Base de Données utilisé - a priori mySQL...

sebjan
Invité n'ayant pas de compte PHPfrance

07 juin 2010, 13:11

J'ai fait des

echo $page;
echo $nbpage;
echo $nb;
echo $i;

et les valeurs indiquées sont bonnes

lorsque je lance la requêtes echo $query; , sous phpMyAdmin, il m'indique une erreur de requête !?

où places-tu le "echo $query, et la passer sous phpMyAdmin" en regardant le code indiqué sur mon 1er msg ?

Bref, je suis un peu dans le noir là !

sebjan
Invité n'ayant pas de compte PHPfrance

07 juin 2010, 13:13


où places-tu le "echo $query, et la passer sous phpMyAdmin" en regardant le code indiqué sur mon 1er msg ?
je voulais demander où places-tu le "SELECT count(id) FROM matable WHERE (condition);" en regardant le code indiqué sur mon 1er msg ?

Mammouth du PHP | 672 Messages

07 juin 2010, 13:22

J'ai fait des

echo $page;
echo $nbpage;
echo $nb;
echo $i;

et les valeurs indiquées sont bonnes

lorsque je lance la requêtes echo $query; , sous phpMyAdmin, il m'indique une erreur de requête !?
Ben le problème vient de la requête, alors :mrgreen:
Tu peux la coller ici ? Et préciser le message d'erreur de phpMyAdmin ?
où places-tu le "SELECT count(id) FROM matable WHERE (condition);" en regardant le code indiqué sur mon 1er msg ?
C'est le premier truc que je ferais, donc au début du script...

Bref, je suis un peu dans le noir là ![/quote]

sebjan
Invité n'ayant pas de compte PHPfrance

07 juin 2010, 13:49

Chez FREE , onglet requete

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'echo $query' at line 1

Mammouth du PHP | 672 Messages

07 juin 2010, 14:19

Chez FREE , onglet requete

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'echo $query' at line 1
#-o
Le echo $query;, c'est dans le script PHP qu'il faut le mettre...
$query="SELECT * FROM news ORDER BY date_ins='".$_GET['date_ins']."' DESC , heure_ins='".$_GET['heure_ins']."' DESC";
echo $query;
La page va afficher - entre autres - la requête. Tu la copies/colles dans phpMyAdmin et vois le résultat.

sebjan
Invité n'ayant pas de compte PHPfrance

08 juin 2010, 06:35

OK ! c'est ce que j'avais fait au début mais je ne voyais pas le sens d'afficher la requête sql sur la page !

Bref, j'ai modifié ma requête sql

Code : Tout sélectionner

$query="SELECT * FROM news ORDER BY date_ins='".$_GET['date_ins']."' DESC , heure_ins='".$_GET['heure_ins']."' DESC";
ne fonctionne pas !
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'date_ins']."' DESC , heure_ins='".$_GET['heure_ins']."' DESC LIMIT 0, 30' at line 1

en

Code : Tout sélectionner

$query="SELECT * FROM news ORDER BY date_ins ASC, heure_ins ASC LIMIT 0,5";
[/b]

celle-ci m'affiche les 5 premières entrées sous forme de tableau ... les autres entrées ne s'affichent pas

Sinon concernant le code affichant indexation des pages ne vous choque pas ?

Code : Tout sélectionner

for ($j=1; $j<=$nbpage; $j++) { echo "<a href='?page$j=liste' class='lien1'>$j</a> "; }

Mammouth du PHP | 672 Messages

08 juin 2010, 08:47

$query="SELECT * FROM news ORDER BY date_ins ASC, heure_ins ASC LIMIT 0,5";
[/b]

celle-ci m'affiche les 5 premières entrées sous forme de tableau ... les autres entrées ne s'affichent pas
Normal, vu que tu limites aux 5 premiers résultats :mrgreen:
Il "suffit" de donnar au LIMIT les paramètres qui vont bien en fonction de la page demandée.
Sinon concernant le code affichant indexation des pages ne vous choque pas ?

Code : Tout sélectionner

for ($j=1; $j<=$nbpage; $j++) { echo "<a href='?page$j=liste' class='lien1'>$j</a> "; }
Pas plus que ça, non.
Par contre, le lien est de la forme ?page3=liste Du coup si tu récupères la page avec un $_GET['page'] ça ne fonctionne pas :?
il faudrait que le lien soit de la forme ?page=3

sebjan
Invité n'ayant pas de compte PHPfrance

08 juin 2010, 09:22

Eh ben voilà c'était bien le code de l'indexation qui posait souci ! ça marche nickel ! :D

?page=3

+

le code du $query
$query="SELECT * FROM news ORDER BY date_ins ASC, heure_ins ASC LIMIT 0,5";
Merci à tous et surtout macgawel !

A+