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 :

Class pagination avec problème d'affichage [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Par défaut Class pagination avec problème d'affichage
    Bonjour,
    j'ai récupéré une class de pagination, mais elle a un comportement bizzare que je n'arrive pas à rectifier.
    J'indique bien qu'il doit m'en afficher que 3, ce qui marche pour les premières pages, mais après il augmente le nombre. Je pense que cela vient du limit mais pourquoi ...?
    Je joint le script, le résultat en images.
    Voici le script :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    <?php
    class pagination{
    	public function __construct()	{
    	}
    	public function calculate_pages($total_rows, $rows_per_page, $page_num)	{
    		$arr = array();
    		// calculate last page
    		$last_page =ceil($total_rows / $rows_per_page);
    		// make sure we are within limits
    		$page_num = (int) $page_num;
    		if ($page_num < 1)		{
    		   $page_num = 1;
    		} 
    		elseif ($page_num > $last_page)		{
    		   $page_num = $last_page;
    		}
    		$upto =($page_num - 1)*$rows_per_page;
    		$arr['limit'] ='LIMIT '.$upto.',' .$rows_per_page;
    		$arr['current'] =$page_num;
    		if ($page_num === 1){
    			$arr['previous'] = $page_num;
    		}
    		else{
    			$arr['previous'] = $page_num - 1;
    		}
    		if ($page_num === $last_page){
    			$arr['next'] = $last_page;
    		}
    		else{
    			$arr['next'] = $page_num + 1;
    		}
    		$arr['last'] = $last_page;
    		$arr['info'] ='Page ('.$page_num.' of '.$last_page.')';
    		$arr['pages'] =$this->get_surrounding_pages($page_num, $last_page, $arr['next']);
    		return $arr;
    	}
    	function get_surrounding_pages($page_num, $last_page, $next){
    		$arr = array();
    		$show = 3; // how many boxes
    		// at first
    		if ($page_num === 1)	{
    			// case of 1 page only
    			if ($next === $page_num){
    				return array(1);
    			}
    			for ($i = 0; $i < $show; $i++)	{
    				if ($i === $last_page){
    					break;
    				}
    				array_push($arr, $i + 1);
    			}
    			return $arr;
    		}
    		// at last
    		if ($page_num === $last_page)	{
    			$start = $last_page - $show;
    			if ($start < 1){
    				$start = 0;
    			}
    			for ($i = $start; $i < $last_page; $i++){
    				array_push($arr, $i + 1);
    			}
    			return $arr;
    		}
    		// at middle
    		$start = $page_num - $show;
    		if ($start < 1){
    			$start = 0;
    		}
    		for ($i = $start; $i < $page_num; $i++)	{
    			array_push($arr, $i + 1);
    		}
    		for ($i = ($page_num + 1); $i < ($page_num + $show); $i++)	{
    			if ($i === ($last_page + 1)){
    				break;
    			}
    			array_push($arr, $i);
    		}
    		return $arr;
    	}
    }
    $g_page=(isset($_GET['p']))? $_GET['p'] : 1;
    $inst=new pagination();
    $arr = $inst->calculate_pages(170, 5, $g_page);
     
    echo '<a href="pagination.php?p=1"><< First</a> ';
    foreach ($arr['pages'] as $k=>$v){
    	IF ((int)$arr['current']=== $v){
    		echo '<b>'.$v.'</b> |';
     
    	}
    	else{
    		//echo 'non';
    		echo '<a href="pagination.php?p='.$v.'">'.$v.'</a> |';
    	}
    }
    echo '<a href="pagination.php?p='.$arr['last'].'">Last >></a>';
    ?>
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    Bonjour,

    on dirait qu'il y a un problème à la ligne 27 (pour ta deuxième image). On constate qu'il arrive à faire une page suivante alors qu'il se place sur le dernier élément.

    Pourrais tu regarder sur ce problème d'égalité? Test peut être "==" au lieu de "===", je sais que "==" est plus tolérant que l'autre et c'est peut être pour ca que ton affiche se plante...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Par défaut
    Citation Envoyé par Retrokiller069 Voir le message
    Bonjour,

    on dirait qu'il y a un problème à la ligne 27 (pour ta deuxième image). On constate qu'il arrive à faire une page suivante alors qu'il se place sur le dernier élément.

    Pourrais tu regarder sur ce problème d'égalité? Test peut être "==" au lieu de "===", je sais que "==" est plus tolérant que l'autre et c'est peut être pour ca que ton affiche se plante...
    Malheureusement j'ai toujours le problème. Non seulement il affiche des pages qu'il ne devrait pas et en plus il affiche plus de lien qu'il ne devrait car j'ai indiqué qu'il devrait en afficher 3.

  4. #4
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    Bon ben j'ai test et c'est bon. En fait c'est bien les "===" qui posaient problèmes. Si tu les remplaces tous tu verras que ca marche.

    Par contre fait attention, n'utilises pas "<?" mais plutôt "<?php". Je sais que ca peut poser des problèmes parfois.

    Je suis en train de regarder pourquoi il en affiche toujours 5... Pour modifier l'affichage, il faut que tu modifies la ligne 41

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		$show = 3; // how many boxes
    Mets autre chose que 3 et tu verras le résultat

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Par défaut
    Citation Envoyé par Retrokiller069 Voir le message
    Bon ben j'ai test et c'est bon. En fait c'est bien les "===" qui posaient problèmes. Si tu les remplaces tous tu verras que ca marche.

    Par contre fait attention, n'utilises pas "<?" mais plutôt "<?php". Je sais que ca peut poser des problèmes parfois.

    Je suis en train de regarder pourquoi il en affiche toujours 5... Pour modifier l'affichage, il faut que tu modifies la ligne 41

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		$show = 3; // how many boxes
    Mets autre chose que 3 et tu verras le résultat
    En effet cela marche pour le fait de ne pas afficher des pages n'existant pas par contre, il me met bien au début par exemple 6 page (que j'ai défini dans le code) puis après 7,8,9, etc.

    Tu n'as pas le pb ?

  6. #6
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    Citation Envoyé par eltyty Voir le message
    En effet cela marche pour le fait de ne pas afficher des pages n'existant pas par contre, il me met bien au début par exemple 6 page (que j'ai défini dans le code) puis après 7,8,9, etc.
    Désolé je ne comprends pas? Pourrais tu envoyer une image stp?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Par défaut
    Citation Envoyé par Retrokiller069 Voir le message
    Désolé je ne comprends pas? Pourrais tu envoyer une image stp?
    Je te mets les images sachant que dans le param j'ai mis 6.

    Merci pour tes efforts
    Images attachées Images attachées   

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Par défaut
    Personnellement, j'ai fait un petit code qui me convient, voilà comment je l'utilise :

    Page où il y a besoin de numérotation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $num_page = intval($_GET['num_page']);
    	$nombreDeContenuParPage = 3;
    	// On calcule le nombre de pages à créer
    	$nombreDePages  = ceil($totalDesContenu / $nombreDeContenuParPage);
    	// On calcule le numéro du premier contenu qu'on prend pour le LIMIT de MySQL
    	$premiercontenuAafficher = ($num_page - 1) * $nombreDeContenuParPage;
     
    $sql_data = $bdd->prepare('SELECT id,titre,contenu,pseudo,timestamp FROM news ORDER BY id DESC LIMIT :premiercontenu,:nombredecontenuparpage');
    		$sql_data->bindValue(':premiercontenu', $premiercontenuAafficher, PDO::PARAM_INT);
    		$sql_data->bindValue(':nombredecontenuparpage', $nombreDeContenuParPage, PDO::PARAM_INT);
    		$sql_data->execute();
    Besoin de pagination ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	//besoin de la pagination ?
    	if ($totalDesContenu > $nombreDeContenuParPage)
    	{
    		//variables pagination (necessite : $nombreDeContenuParPage,$url_destination, $totalDesContenu, $num_page, $nombreDePages)
    		$url_destination = '/periples_vtt/voir_periples.php?voir_periples='.$id_periple.'';
    		include($racine . '/inclusion/pagination.php');
    	}
    Si oui, j'insère ça :

    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
    //test s'il y à deja un autre parametre GET dans l'url
    	if(strpos($url_destination,'?'))
    	{
    		$contient_param_get = '&amp;';
    	}
    	else
    	{
    		$contient_param_get = '?';
    	}
     
    	echo'<span class="article_seperator"></span>';
     
    	echo '<center>';
    	if($num_page == 1 AND $nombreDeContenuParPage >= $totalDesContenu )
    	{
    		echo '< &lt; &lt; <b><font color="red">['.$num_page.']</font></a></b> > >>';
    	} 
    	elseif($num_page == 1 AND $nombreDeContenuParPage < $totalDesContenu )
    	{
    		echo 	'&lt;&lt; <b><a href="'.$url_destination.$contient_param_get.'page='.intval($num_page).'"><font color="red">['.$num_page.']</font></a></b> 
    				<a href="'.$url_destination.$contient_param_get.'page='.intval($num_page+1).'" title="Page suivante ('.intval($num_page+1).')" >> </a> 
    				<a href="'.$url_destination.$contient_param_get.'page='.intval($nombreDePages).'" title="Dernière page ('.$nombreDePages.')"> >> </a>';
    	} 
    	// derniere page
    	elseif( $num_page == $nombreDePages )
    	{
    		echo 	'<a href="'.$url_destination.$contient_param_get.'page=1" title="Retour à la première page"> &lt;&lt; </a> 
    				<a href="'.$url_destination.$contient_param_get.'page='.intval($num_page-1).'" title="Page précedente ('.intval($num_page-1).')"> &lt; </a> 
    				<b><a href="'.$url_destination.$contient_param_get.'page='.intval($num_page).'"><font color="red">['.$num_page.']</font></a></b> > >>';
    	}
    	else
    	{
    		echo 	'<a href="'.$url_destination.$contient_param_get.'page=1" title="Retour à la première page "> &lt;&lt; </a> 
    				<a href="'.$url_destination.$contient_param_get.'page='.intval($num_page -1).'" title="Page précedente ('.intval($num_page-1).')"> &lt; </a> 
     
    				<b><a href="'.$url_destination.$contient_param_get.'page=' . intval($num_page) . '"><font color="red">[' . $num_page . ']</font></a></b> 
    				<a href="'.$url_destination.$contient_param_get.'page='.intval($num_page+1).'" title="Page suivante ('.intval($num_page+1).')"> > </a> 
     
    				<a href="'.$url_destination.$contient_param_get.'page='.intval($nombreDePages).'" title="Dernière page ('.$nombreDePages.')"> >> </a>';
    	}
    	echo '</center>';
    ?>
    En espérant que cela puisse t'aider

  9. #9
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    Voila je pense que je suis arrivé à faire ce que tu voulais je te laisse test a+

    Ps: ligne 66 pour comprendre

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Par défaut
    Citation Envoyé par Retrokiller069 Voir le message
    Voila je pense que je suis arrivé à faire ce que tu voulais je te laisse test a+

    Ps: ligne 66 pour comprendre
    Oui en effet, aurais tu un peu d'explication sur l'erreur que je faisais ?

    En tout cas merci beaucoup

  11. #11
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    En fait ce que tu voulais ce qu'il ait que n pages qui s'affiche. La variable $show en affichait en fait n avant et n après, lorsque tu es sur le premier élément il pouvait en afficher avant (puisqu'il y en a pas) de même pour le dernier. lorsque tu arrives au second élément il affiché le premier (pour la partie avant) et n élément pour la partie après.

    voici la partie qui posait problème:

    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
    // at middle
    		$show=ceil($show/2);
    		$start = $page_num - $show;
    		if ($start < 1){
    			$start = 0;
    		}
    		$aff=0;
    		for ($i = $start; $i < $page_num; $i++)	{
    			$aff=$aff+1;
    			array_push($arr, $i + 1);
    		}
    		
    		for ($i = ($page_num + 1); $i < ($page_num + $show); $i++)	{
    			if ($i == ($last_page + 1)){
    				break;
    			}
    			array_push($arr, $i);
    		}
    		return $arr;
    la partie en rouge prends en fait la moitié de n, ce qui du coup en affiche n/2 avant et n/2 après = n au total.

    En espérant que mon explication est claire (en générale je suis pas très bon pour ca )

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Par défaut
    Citation Envoyé par Retrokiller069 Voir le message
    En fait ce que tu voulais ce qu'il ait que n pages qui s'affiche. La variable $show en affichait en fait n avant et n après, lorsque tu es sur le premier élément il pouvait en afficher avant (puisqu'il y en a pas) de même pour le dernier. lorsque tu arrives au second élément il affiché le premier (pour la partie avant) et n élément pour la partie après.

    voici la partie qui posait problème:

    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
    // at middle
    		$show=ceil($show/2);
    		$start = $page_num - $show;
    		if ($start < 1){
    			$start = 0;
    		}
    		$aff=0;
    		for ($i = $start; $i < $page_num; $i++)	{
    			$aff=$aff+1;
    			array_push($arr, $i + 1);
    		}
    		
    		for ($i = ($page_num + 1); $i < ($page_num + $show); $i++)	{
    			if ($i == ($last_page + 1)){
    				break;
    			}
    			array_push($arr, $i);
    		}
    		return $arr;
    la partie en rouge prends en fait la moitié de n, ce qui du coup en affiche n/2 avant et n/2 après = n au total.

    En espérant que mon explication est claire (en générale je suis pas très bon pour ca )
    Merci pour ces explications.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/01/2012, 18h09
  2. Réponses: 3
    Dernier message: 08/07/2008, 00h03
  3. [DisplayTag] Problème d'affichage avec pagination externe
    Par martopioche dans le forum Taglibs
    Réponses: 3
    Dernier message: 03/10/2007, 12h56
  4. Réponses: 6
    Dernier message: 19/10/2004, 14h46
  5. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 17h59

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