Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/07/2011, 09h44   #1
Invité de passage
 
Inscription : avril 2008
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 26
Points : 3
Points : 3
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 :
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
Type de fichier : png p1.png (5,0 Ko, 4 affichages)
Type de fichier : png p2.png (6,3 Ko, 3 affichages)
Fichiers attachés
Type de fichier : php pagination .php (2,8 Ko, 4 affichages)
eltyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 11h12   #2
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
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...
__________________
Ce n'est pas ce que nous voulons faire qui est impossible mais ce sont les moyens à sa mise en oeuvre qui peuvent le paraître

Ps: N'oubliez pas SVP
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 11h19   #3
Invité de passage
 
Inscription : avril 2008
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 26
Points : 3
Points : 3
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.
eltyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 11h41   #4
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
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 :
		$show = 3; // how many boxes
Mets autre chose que 3 et tu verras le résultat
__________________
Ce n'est pas ce que nous voulons faire qui est impossible mais ce sont les moyens à sa mise en oeuvre qui peuvent le paraître

Ps: N'oubliez pas SVP
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 12h07   #5
Invité de passage
 
Inscription : avril 2008
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 26
Points : 3
Points : 3
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 :
		$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 ?
eltyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 12h13   #6
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
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?
__________________
Ce n'est pas ce que nous voulons faire qui est impossible mais ce sont les moyens à sa mise en oeuvre qui peuvent le paraître

Ps: N'oubliez pas SVP
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 13h54   #7
Invité de passage
 
Inscription : avril 2008
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 26
Points : 3
Points : 3
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
Type de fichier : png p1com.png (14,7 Ko, 3 affichages)
Type de fichier : png p2comm.png (18,8 Ko, 5 affichages)
eltyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 14h13   #8
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
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 :
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 :
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 :
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
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 18h05   #9
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
Voila je pense que je suis arrivé à faire ce que tu voulais je te laisse test a+

Ps: ligne 66 pour comprendre
__________________
Ce n'est pas ce que nous voulons faire qui est impossible mais ce sont les moyens à sa mise en oeuvre qui peuvent le paraître

Ps: N'oubliez pas SVP
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 19h11   #10
Invité de passage
 
Inscription : avril 2008
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 26
Points : 3
Points : 3
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
eltyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 21h09   #11
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
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 :
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 )
__________________
Ce n'est pas ce que nous voulons faire qui est impossible mais ce sont les moyens à sa mise en oeuvre qui peuvent le paraître

Ps: N'oubliez pas SVP
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 11h48   #12
Invité de passage
 
Inscription : avril 2008
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 26
Points : 3
Points : 3
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 :
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.
eltyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h04.


 
 
 
 
Partenaires

Hébergement Web