Problème pagination

omlaly - 8 mars 2013 à 10:28
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 - 8 mars 2013 à 17:47
Bonjour,

J'ai développé un système de pagination mais il ne marche pas En effet, il affiche 5 articles par pages (ça c'est bon) sauf que quand il y a plus de 5 articles je voudrais que ça mette vers
adresse.com?page=  2
comma ça
Page : 1 2 3 ...
. Actuellement, ça affiche :
Page :
(c'est tout).
Quand je mets à la main l'adresse
adresse.com?page=2
, une erreur apparait :
Erreur sur la requête SQL concernant le nombre d'articlesYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-5, 5' at line 1


Voici le code PHP :
$messagesParPage=5; // Nombre de messages affichés par pages

$retour_total=mysql_query('SELECT COUNT(*) AS id_article FROM articles WHERE nom_categorie = "categorie" AND nom_village	= "nomduvillage"')  or die ('Erreur sur la requête SQL concernant le calcul du nombre d\'articles '.mysql_error()); // Envoie une requête à un serveur MySQL -  Récupération du contenu de la requête dans $retour_total
$donnees_total=mysql_fetch_assoc($retour_total); // Rangement de $retour_total sous la forme d'un tableau

$total=$donnees_total['total']; // Récupération du total pour le placer dans la variable $total

// Comptage du nombre de pages
$nombreDePages=ceil($total/$messagesParPage);

if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
     
     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else
{
     $pageActuelle=1; // La page actuelle est la n°1    
}

$premiereEntree=($pageActuelle-1)*$messagesParPage; // Calculer la première entrée à lire

// La requête SQL pour récupérer les messages de la page actuelle - C'est sur cette requête SQL que ça bug...
$retour_messages=mysql_query('SELECT * FROM articles WHERE nom_categorie = "categorie" AND nom_village = "nomvillage" ORDER BY id_article DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'') or die ('Erreur sur la requête SQL concernant le nombre d\'articles'.mysql_error()); // Envoie une requête à un serveur MySQL

while($donnees_messages=mysql_fetch_assoc($retour_messages)) { // Lecture des entrées une à une grâce à une boucle

     echo ''.nl2br($donnees_messages['titre_article']).',

----

'.nl2br($donnees_messages['texte_article']).',

----

<td id=\"auteur_article_date_depot_numero_article\" align=\"right\" >
<small> Posté par :  '.(stripslashes($donnees_messages['auteur_article']).' -  '.dateLongue($donnees_messages['date_depot'])).'   -  Article N°'.nl2br($donnees_messages['id_article']).' </small>

';
echo '
Commentaires.

<form method  ="POST" action="../../commentaire_post.php"><textarea name="texte_commentaire_article"></textarea>
</form>

';
$id_article=$donnees_messages['id_article'];
    // Ajout des sauts de ligne pour espacer les messages (
)		
// Requête SQL pour déterminer l'identifiant de l'article correspondant
$query_selection_article_correspondant = mysql_query('SELECT articles.id_article, commentaires.date_depot, commentaires.texte_commentaire,commentaires.user_pseudo FROM articles, commentaires WHERE articles.id_article=commentaires.id_article AND commentaires.id_article ='.$id_article.'') or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL

while ($row = mysql_fetch_assoc($query_selection_article_correspondant)) {
   echo '';
echo '----
'.$row["user_pseudo"].', ';
echo ''.dateLongue($row["date_depot"]).', ';
   echo ''.$row["texte_commentaire"].'
';
}
}

echo 'Page : '; // Centrer la liste des pages pour l'affichage
for($i=1; $i<=$nombreDePages; $i++) // Boucle
{
     // Condition
     if($i==$pageActuelle) // S'il s'agit de la page actuelle
     {
         echo ' [ '.$i.' ] '; 
     }	
     else
     {
          echo ' [adresse.php?page='.$i.' '.$i.'] ';
     }
}
echo '

';
}
else // Aucun résultat
{
echo "

Aucun article à l'heure actuelle...
";
}
?>


Si vous voyez quelque chose, n'hésitez-pas...

Cordialement

3 réponses

cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
8 mars 2013 à 12:27
L'erreur est évidente.
$nombreDePages=ceil($total/$messagesParPage);

Si tu as 2 enregistrements dans la db et que la quantité d’enregistrement que tu veux afficher est de 5.
Il est normal que l’expression qui suis sera égal à true, car précédemment tu as $nombreDePages qui est négatif.
if($pageActuelle>$nombreDePages) {
    $pageActuelle=$nombreDePages;
}

Donc, $pageActuelle est négatif et dans le LIMIT, la première valeur ne peux être négatif.

Donc, la solution c'est que pour la valeur de la variable $premiereEntree qui sera utilisé dans le LIMIT.
Tu remplace ceci :
$premiereEntree=($pageActuelle-1)*$messagesParPage; // Calculer la première entrée à lire

par ceci :
$premiereEntree=(intval($_GET['page'])-1)*$messagesParPage; // Calculer la première entrée à lire


stéph
0
Quand je mets ce code PHP :
<?php
$query_categorie mysql_query("SELECT titre_article, texte_article, date_depot, auteur_article FROM articles WHERE nom_categorie 'nomcategorie' AND nom_village = 'nomvillage'") or die('Erreur lors de la requête SQL'.mysql_error()); // Envoie une requête à un serveur MySQL
if(mysql_num_rows($query_categorie) > 0){ // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL

$messagesParPage=5; // Nombre de messages affichés par pages

$retour_total=mysql_query('SELECT COUNT(*) AS id_article FROM articles WHERE nom_categorie = "nomcategorie" AND nom_village	= "nomvillage"')  or die ('Erreur sur la requête SQL concernant le calcul du nombre d\'articles '.mysql_error()); // Envoie une requête à un serveur MySQL -  Récupération du contenu de la requête dans $retour_total
$donnees_total=mysql_fetch_assoc($retour_total); // Rangement de $retour_total sous la forme d'un tableau

$total=$donnees_total['total']; // Récupération du total pour le placer dans la variable $total

// Comptage du nombre de pages
$nombreDePages=ceil($total/$messagesParPage);

if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
     
     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else
{
     $pageActuelle=1; // La page actuelle est la n°1    
}

$premiereEntree=(intval($_GET['page'])-1)*$messagesParPage; // Calculer la première entrée à lire

// La requête SQL pour récupérer les messages de la page actuelle
$retour_messages=mysql_query('SELECT * FROM articles WHERE nom_categorie = "nomcategorie" AND nom_village = "nomvillage" ORDER BY id_article DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'') or die ('Erreur sur la requête SQL concernant le nombre d\'articles'.mysql_error()); // Envoie une requête à un serveur MySQL

while($donnees_messages=mysql_fetch_assoc($retour_messages)) { // Lecture des entrées une à une grâce à une boucle

     // Affichage des messages avec le design
     // nl2br : Insère un retour à la ligne HTML à chaque nouvelle ligne - pour prendre en compte les sauts de ligne dans le message.
     echo ''.nl2br($donnees_messages['titre_article']).',

----

'.nl2br($donnees_messages['texte_article']).',

----

<td id=\"auteur_article_date_depot_numero_article\" align=\"right\" >
<small> Posté par :  '.(stripslashes($donnees_messages['auteur_article']).' -  '.dateLongue($donnees_messages['date_depot'])).'   -  Article N°'.nl2br($donnees_messages['id_article']).' </small>

';
echo '
Commentaires.

<form method  ="POST" action="../../commentaire_post.php"><textarea name="texte_commentaire_article"></textarea>
</form>

';
$id_article=$donnees_messages['id_article'];
    // Ajout des sauts de ligne pour espacer les messages (
)		
// Requête SQL pour déterminer l'identifiant de l'article correspondant

$query_selection_article_correspondant = mysql_query('SELECT articles.id_article, commentaires.date_depot, commentaires.texte_commentaire,commentaires.user_pseudo FROM articles, commentaires WHERE articles.id_article=commentaires.id_article AND commentaires.id_article ='.$id_article.'') or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant)'.mysql_error()); // Envoie une requête à un serveur MySQL

while ($row = mysql_fetch_assoc($query_selection_article_correspondant)) {
   echo '';
echo '----
'.$row["user_pseudo"].', ';
echo ''.dateLongue($row["date_depot"]).', ';
   echo ''.$row["texte_commentaire"].'
';
}
}

echo 'Page : '; // Centrer la liste des pages pour l'affichage

for($i=1; $i>=$nombreDePages; $i++) // Boucle
{
     // Condition
     if($i==$pageActuelle) // S'il s'agit de la page actuelle
     {
         echo ' [ '.$i.' ] '; 
     }	
     else
     {
          echo ' [adresse.php?page='.$i.' '.$i.'] ';
     }
}
echo '

';
}
else // Aucun résultat
{
echo "

Aucun article à l'heure actuelle...
";
}
?>


Quand j'essaie, voici l'erreur qui apparait, il n'y a plus d'article qui apparait :
Erreur sur la requête SQL concernant le nombre d'articles concernant le village d'Aramon et la catégorie "Monument(s) à visiter"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 '-5, 5' at line 1

Si vous voyez quelque chose, n'hésitez pas...

Quand j'accède à : http://www.adresse.com/page.php?page=2 à la main, je vois qu'il y a des articles qui apparaissent mais le problème, c'est que ça fait une liste de pages (ça va jusqu'à 240473 pages !!!)

Cordialement
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
8 mars 2013 à 17:47
Tu dois commenter une grosse partie de ton code et aller au cas par cas.
Regarde si l'affichage des 5 éléments sont retournés correctement.
Par la suite, du dé-commente le script pour la pagination et jusqu'au résultat final, car même si j'ai vu une erreur, je ne trouverais peut-être pas les autres.
Il est toujours plus simple de regarder concrètement au cas par cas avec le résultat.

stéph
0
Rejoignez-nous