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 15/01/2012, 19h45   #1
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Par défaut pagination multiple même fichier

Bonjour les développeurs :-)

J'ai fais un code PHP pour associer les articles aux catégories et afficher les catégories qui n'ont rien. J'ai ajouter une limite page par page à chaque catégorie pour limiter le nombre d'article par affichage.

Le problème est que ma pagination est dépendante de toutes les catégories. Et que si j'ai un article dans une catégorie mais que dans un autre, j'en ai plusieurs. La catégorie qui en a moins, il n y aura plus d'affichage.

Mes deux TABLES:
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
CREATE TABLE IF NOT EXISTS `categorie` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `categorie` varchar(222) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
 
INSERT INTO `categorie` (`id`, `categorie`) VALUES
(1, 'VOITURES'),
(2, 'ORDINATEURS'),
(3, 'NOURRITURE'),
(4, 'JOUETS');
 
 
 
CREATE TABLE IF NOT EXISTS `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `categorie_id` int(11) NOT NULL,
  `article` varchar(222) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `categorie_id` (`categorie_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
 
INSERT INTO `article` (`id`, `categorie_id`, `article`) VALUES
(1, 2, 'dell'),
(2, 2, 'hp'),
(3, 1, 'Minoune'),
(4, 1, 'carcasse'),
(5, 3, 'pommes'),
(6, 2, 'clone');
Mon code PHP :
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
<?php
include 'config_open_db.php';
 
$sql="SELECT * FROM categorie";
 
$rs=mysqli_query($conn,$sql);
if(!$rs) die("Probleme : ". mysqli_error($conn));
 
echo '<table align="center">';
 
		while($row=mysqli_fetch_array($rs)){
      echo '<tr>';
        echo '<td bgcolor="#ddd">'.$row['categorie'].'</td>';
 
						if( isset($_GET['page']) && is_numeric($_GET['page']) )
								$page = $_GET['page'];
						else
								$page = 1;
						$pagination = 1;
						$limit_start = ($page - 1) * $pagination;
 
						$asql="
							SELECT article.id, article.article, article.categorie_id
							FROM article
							WHERE article.categorie_id = ".$row['id']."
							LIMIT $limit_start, $pagination
						";
						$ars=mysqli_query($conn,$asql);
						if(!$ars) die("Probleme : ". mysqli_error($conn));
 
						while($arow=mysqli_fetch_array($ars)){
								echo '</tr><td> - '.$arow['article'].'</td><tr>';
						}
 
          echo '</tr><tr><td>';
 
						$nb_total = mysqli_query($conn,'SELECT COUNT(*) AS nb_total FROM article WHERE article.categorie_id = '.$row['id']);
						$nb_total = mysqli_fetch_array($nb_total);
						$nb_total = $nb_total['nb_total'];
 
						$nb_pages = ceil($nb_total / $pagination);
						if ($page > 1)
										echo ' <a href="?page='.($page-1).'"><</a> ';
								else
										echo ' < ';
								echo '<strong>'.$page.'</strong> of '.$nb_pages;
								if ($page < $nb_pages)
										echo ' <a href="?page='.($page+1).'">></a> ';
								else
										echo ' > ';
 
					echo '<hr></td></tr>';
 
		}
 
echo '</table>';
 
mysqli_close($conn);
?>
Le code PHP fonctionne très bien, mes catégories ainsi que les articles s'affichent respectivement.

C'est le page par page qui est un problème. Si je n'avais qu'une seule catégorie a afficher, je n'aurais pas à poster mais je veux afficher toutes les catégories avec leur contenu.

Si je change de page dans une catégorie, ça change partout. Et si j'ai rien dans une catégorie, ça va incrémenté de 1 quand même.

Correct : 1 of 3
pas correct : 5 of 3

La pagination est au plus simple possible, juste avec un précédent et un suivant.

Si quelqu'un a une idée pour ne pas que mes articles que ça incrémente pas quand je clique sur les autres "suivant".

De l'aide serait apprécié.
Images attachées
Type de fichier : jpg SS.jpg (12,7 Ko, 11 affichages)
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 03h59   #2
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Bonjour.

Je veux préciser ici que j'affiche à partir d'un while une série de catégories
avec leurs articles respectifs.

Chaque catégorie a sa pagination. Le problème c'est que le pagination est
basée sur une seule requête celle qui affiche toutes les catégories.

Les paginations sont sur la même page comme illustrer dans l'image du
message précédent.

ça donne ces résultats inattendus :

4 de 10, si je clique sur suivant, ça va aller à 5 de 10.
Mais par le fait même ça va aussi changé celui qui a 1 de 1 à 5 de 1
et ça va faire disparaitre le contenu de celui-ci.

C'est un problème que je n'arrive pas à régler en cherchant sur le web.

Je cherche à résoudre le problème avec le moins de code possible et en me
basant sur ce que j'ai de fait jusqu'alors. Si quelqu'un connait le problème,
ça serait apprécié et ça peut en aider plus d'un.

Salutations,
Dan.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 06h05   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Lis ce topic : Probleme pagination sur script recherche
Il y a peu je donnais des explications sur le comment on crée une pagination.
J'évoquais entre autre 2 manières de faire.

Code :
$sql="SELECT * FROM categorie";
Tu ne peux pas prendre ceci comme base pour créer cette pagination.
Cette pagination ne concerne pas l'ensemble des catégories, mais d'1 catégorie, et uniquement une.

Mais pas seulement, cette pagination concerne des articles, plus exactement des articles d'une catégorie en particulier.
C'est le nombre total d'articles pour 1 catégorie qui fait que tu sauras le nombre de pages qu'il va avoir selon le nombre d'articles que tu souhaites afficher par page.

Ce qui veut dire que pour démarrer cette pagination (par défaut par exemple), il faudrait au préalable savoir la catégorie pour obtenir ce nombre total d'articles pour après proposer une navigation page par page dans cette même catégorie.

Donc soit le choix de la catégorie se fait lors d'une étape précédente, soit intégrer un menu déroulant pour choisir une catégorie.
Au final il faut avoir 2 choses :
- Une catégorie (la 1ère par défaut par exemple)
- Un N° de page (la 1ère normalement).


Tout ça si j'ai bien compris aussi.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 14h27   #4
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Bonjour. Merci pour votre réponse.

J'ai bien réussi à afficher toutes les catégories sur une même page avec leurs contenus.

J'ai passé en revu :
Citation:
Envoyé par RunCodePhp Voir le message
ainsi que le tutoriel indiqué dedans. J'ai rien vu sur l'affichage de plusieurs paginations sur les catégories affichées. C'est pour une pagination sur l'ensemble de la page comme les livres-d'or.

Mais lorsque je passe à la page suivante dans une catégorie, ça un effet sur toutes les catégories. Ça je le comprends puisque, j'utilise une requête pour les catégories et à l'intérieur de celles-ci, j'utilise une autre requête pour les articles.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while($row=mysqli_fetch_array($rs)){
 
	echo '<tr>';
		echo '<td>======================='.$row['categorie'].'</td>';
 
	 $asql="
		SELECT article.id, article.article,	article.categorie_id
		FROM article
		WHERE article.categorie_id = ".$row['id']." 
	 ";
	 $ars=mysqli_query($conn,$asql);
	 if(!$ars) die("Probleme : ". mysqli_error($conn));
 
	 while($arow=mysqli_fetch_array($ars)){
		echo '</tr><td> - '.$arow['article'].'</td><tr>';
	 } // deusieme while
 
} //premier while
C'est que le page par page passe par la requête des articles et sur tous les articles à la fois. Si je mets 10 articles par page. Je clique sur suivant sur la catégorie qui a 40 articles étant rendu à la page 3. La catégorie qui en a seulement 10 articles, ça va indiquer je suis à la page 3 de 1.

Si je clique sur suivant ou précédent, ça va changer toutes les pages de toutes les catégories.

J'ai essayé des versions en jquery. Pas de succès.

J'ai essayé une pagination simple PHP/Mysql, ça change les pages mais sur la requête des articles.

Faudrait que je puisse cliquer sur "suivant" d'une catégories et les pages changeraient que sur cette catégorie.

Si je décide d'utiliser un menu déroulant, ça marche à merveille. Le problème serait résolu à ce moment là.

Voila.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 08h30   #5
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Par défaut Ne peut être résolu juste avec PHP et MYSQL

Bonjour, voici ma révision:

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
<?php
include 'config_open_db.php';
 
$sqlc="
	SELECT c.id as id, c.categorie AS categorie
	FROM categorie AS c
";
$rsc=mysqli_query($conn,$sqlc);
while($rowc=mysqli_fetch_array($rsc)){
  echo $rowc['categorie'].'<br>';
 
		$sqla="
			SELECT a.id AS aid, a.article AS article, categorie.categorie AS categorie
			FROM article AS a
			INNER JOIN categorie ON a.categorie_id = categorie.id
			WHERE categorie.id = ".$rowc['id']."
		";
		$rsa=mysqli_query($conn,$sqla);
		while($rowa=mysqli_fetch_array($rsa)){
			echo $rowa['aid'].'<br>';
		}
 
}
 
mysqli_close($conn);
?>
Le résultat (les chiffres représentent le ID des articles) :

Code :
1
2
3
4
5
6
7
8
9
10
VOITURES
3
4
ORDINATEURS
1
2
6
NOURRITURE
5
JOUETS
Si je mets la clause LIMIT, ca change le résultat des articles pour toutes les catégories en même temps. Donc, Je ne vois pas comment on peut paginer dans la même fichier plusieurs catégories de manière indépendante.

En tout cas pas avec PHP et MYSQL seuls. Mon poste restera non résolu.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 09h49   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Si tu veux faire une pagination dans la même page pour chaque catégorie, il faut faire autant de paginations indépendantes qu'il y aura de catégories.

C'est à dire quelque chose comme ceci si j'ai bien compris :
Citation:
CATEGORIE 1
- article 1
- article 2
[page 1] [page 2] [page 3]

CATEGORIE 2
- article 1
- article 2
[page 1] [page 2]

CATEGORIE 3
- article 1
- article 2
[page 1] [page 2] [page 3] [page 4]

... etc ...
Pour cela, il faut que tous les liens contiennent en paramètre la catégorie et la page concernée (sous entendue de la catégorie en court), donc cela aussi bien dans les articles et au niveau des liens des différentes paginations.

Donc au tout début, il faudra des valeurs par défaut pour tout :
page 1 - catégorie 1
page 1 - catégorie 2
page 1 - catégorie 3
... etc ...

Après cela, au moment (du moins juste avant) de faire chaque pagination, il faudra vérifier si les paramètres existent (page et catégorie).
Admettons qu'on clic sur la page 2 de la catégorie 2, il y a aura alors une pagination différente uniquement sur celle-ci : On veut les articles de la page 2
Ce qui sous entend que pour les autres catégories ça sera une pagination par défaut (page 1 et les 1er articles).

Donc lors de la 1ère boucle on va détecter qu'on souhaite la page 2 pour la catégorie 2.
Il faudra alors faire une requête qui va rechercher les articles de la page 2 pour cette catégorie 2, puis un LIMIT tenant compte du nombre d'articles par page et du N° de page demandé.
Si c'est 5 articles par page, ça doit donner : LIMIT 10, 5
Le principe est là il me semble.

Le seul point commun qu'il y a pour toutes les catégories, c'est de faire une requête pour savoir le nombre total d'articles qu'il y a pour chaque catégorie (donc en boucle) pour créer la pagination.


Essai de faire un scénario comme ci-dessus, et essai de voir quelles sont les données que tu as besoin pour faire cette pagination.
Mais surtout, fait le pour 1 seule catégorie d'abord, et fonctionnel.
A partir du moment où tu aura 1 qui fonctionne, tu sauras sur quoi se base la pagination.


A coté de ça, pourquoi fait tu cela sur une même page ?
N'est-ce pas trop lourd ? (faut prendre conscience que cette page sera recharger à chaque fois, donc les mêmes traitement pour toutes les catégories)
Aussi, en faisant comme cela, la pagination ne concerne à chaque fois qu'une seule catégorie, et uniquement.


Si tu veux faire une pagination sur plusieurs (ou toutes) catégories, comme visualiser d'un coup la page 2 de la catégorie1 et la page 3 de la catégorie2, le faire totalement en Php ca va être rude, très rude à mon sens.
Ici, il vaut mieux opter pour de l'Ajax, pour 2 raisons :
- plus simple à la mise en oeuvre (à condition de savoir faire de l'Ajax)
- moins lourd car l'Ajax permet de faire cela en mode asynchrone, c'est à dire sans devoir recharger entièrement la page.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h45   #7
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Merci pour vous être donné la peine d'écrire ce texte.

Oui, vous avez tout à fait compris.

C'est lister un contenu d'environs 5 articles par catégorie.

Pour aller au 5 suivante d'une catégorie, je ferais suivant
et je vois les 5 autres tout en ne changeant pas les autres.

Actuellement, je suis capable de paginer un contenu d'une
seule catégorie avec un menu qui va appeler la catégorie
que je souhaite affiché (paginée)

Je suis capable d'afficher le contenu paginé de plusieurs
catégorie mais lorsque je change de page d'une catégorie,
ça change aussi pour les autres catégories. Et c'est là le
problème. Si la page suivante d'une des autres catégories
n'existe pas, ça va indiquer une page au dessus du nombre
total de cette catégorie ex 3 de 2 (page 3 du total de 2),
ça pas de sens.

Un autre hic, c'est que ça fait disparaitre le contenu quand
c'est supérieur au nombre de pages de la catégorie touchée.

J'avais essayé de mettre en paramètre le no de catégorie
index.php?page=1&categorie=3, ça changeait quand même
les autres pages.

Je vais retenter de le faire et exposer mon problème.

Pour l'ajax, je ne sais pas l'utiliser.

ajout info :
Je sais pas si ça ca me permettrait de faire ce que je veux.
afficher plusieurs catégories.
http://www.w3cgallery.com/w3c-blog/p...ith-pagination
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 13h56   #8
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Citation:
J'avais essayé de mettre en paramètre le no de catégorie
index.php?page=1&categorie=3, ça changeait quand même
les autres pages.
C'est au niveau des vérifications de chaque pagination qui ne va pas très certainement.

Lors de la 1ère boucle sur toutes les catégories, tu as l'ID de la catégorie à chaque tour de boucle.
Il faut faire les vérifications à ce moment là, pour chaque catégories.
- Si l'ID correspond à l'ID en paramètre GET, alors il faudra tenir compte du N° de la page qui lui aussi se trouve en paramètre GET
- Si l'ID ne correspond pas, alors le N° de page doit être 1 (page 1)

Ensuite, concernant la pagination (page1, page2, etc ...), là encore, tout ce passe dans la 1ère boucle.
- Faire une requête sur la catégorie en court pour récupérer ne nombre total d'articles (pour cette catégorie).
C'est cela qui va permettre de savoir le nombre de pages qu'il va avoir (donc de liens) pour la catégorie en court (toujours), cela indépendamment du N° de page.

Une fois le N° de page initialisé (selon les 2 conditions vu plus haut) :
- on lance la requête qui va récupérer les articles de la catégorie en court et en tenant compte du N° de page initialisé et du nombre d'articles par page.


A chaque tour de boucle (catégorie suivante), rebelotte :
-> re-vérification pour initialiser le N° de page
-> re-requête pour savoir le nombre total d'articles
-> re-requête pour obtenir les articles selon le N° de page


Les liens de chaque pagination doivent avoir 2 paramètres : l'ID de la catégorie en court et le N° de page correspondant, c'est obligatoire.


Citation:
Pour l'ajax, je ne sais pas l'utiliser.
Alors le plus sage c'est de remettre ça à un autre jour, et pour quelque chose de plus simple.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h54   #9
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
J'ai ajout ceci :
Code :
echo ' <a href="?page='.($page-1).'&cat='.$cat.'"><</a> ';
et

Code :
1
2
3
if(( isset($_GET['page']) && is_numeric($_GET['page']) ) AND isset($row['categorie']) ){
$page = $_GET['page'];
$cat = $row['categorie'];
Pour obtenir ce que je veux, j'ai pas été capable d'aller plus loin.

Si je mettais pas
Code :
WHERE categorie.id = ".$row['id']."
, j'obitendrais toutes les articles dans toutes les categories.

Complèt :

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
include 'config_open_db.php';
 
$sql="SELECT * FROM categorie";
 
$rs=mysqli_query($conn,$sql);
if(!$rs) die("Probleme : ". mysqli_error($conn));
 
echo '<table align="center">';
 
		while($row=mysqli_fetch_array($rs)){ // 1re boucle
      echo '<tr>';
        echo '<td bgcolor="#ddd">'.$row['categorie'].'</td>';
 
						if(( isset($_GET['page']) && is_numeric($_GET['page']) ) AND isset($row['categorie']) ){
								$page = $_GET['page'];
								$cat = $row['categorie'];
						}
						else{
								$page = 1;
						}
						$pagination = 1;
						$limit_start = ($page - 1) * $pagination;
 
						$asql="
							SELECT article.id, article.article, article.categorie_id, categorie.id
							FROM article
							INNER JOIN categorie ON article.categorie_id = categorie.id
							WHERE	categorie.id = ".$row['id']."						
							LIMIT $limit_start, $pagination
						";
						$ars=mysqli_query($conn,$asql);
						if(!$ars) die("Probleme : ". mysqli_error($conn));
 
						while($arow=mysqli_fetch_array($ars)){ // 2e boucle imbriquée
								echo '</tr><td> - '.$arow['article'].'</td><tr>';
						}
 
				    echo '</tr><tr><td>';
 
						$nb_total = mysqli_query($conn,'SELECT COUNT(*) AS nb_total FROM article WHERE article.categorie_id = '.$row['id']);
						$nb_total = mysqli_fetch_array($nb_total);
						$nb_total = $nb_total['nb_total'];
 
									$nb_pages = ceil($nb_total / $pagination);
 
									if($page <= $nb_total){
 
												if ($page > 1)
																echo ' <a href="?page='.($page-1).'&cat='.$cat.'"><</a> ';
														else
																echo ' < ';
														echo '<strong>'.$page.'</strong> of '.$nb_pages;
												if ($page < $nb_pages)
																echo ' <a href="?page='.($page+1).'&cat='.$cat.'">></a> ';
														else
																echo ' > ';
                  }
 
					echo '<hr></td></tr>';
 
		}
 
echo '</table>';
 
mysqli_close($conn);
ça donne ceci :
Code :
1
2
3
4
5
6
7
8
9
 
VOITURES   
- carcasse
< 2 of 2 >
ORDINATEURS
- hp
< 2 of 3 >
NOURRITURE
JOUETS
le url donne ceci :
Code :
http://localhost/index.php?page=2&cat=ORDINATEURS
J'ai mis le nom plutpot que le id pour cat pour être plus visuel.

Si j'aurais qqchose de plus simple, ça irait mieux.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h21   #10
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Tu ne tiens pas compte des explications que je t'ai mis :
Citation:
Envoyé par RunCodePhp
Il faut faire les vérifications à ce moment là, pour chaque catégories.
- Si l'ID correspond à l'ID en paramètre GET, alors il faudra tenir compte du N° de la page qui lui aussi se trouve en paramètre GET
- Si l'ID ne correspond pas, alors le N° de page doit être 1 (page 1)
Dans la boucle des catégories il faudrait plutôt faire comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
// 1re boucle
while ($row = mysqli_fetch_array($rs)) {
    if (isset($_GET['cat'], $_GET['page']) && (int)$_GET['cat'] === (int)$row['id']) {
        $page = (int)$_GET['page'];
    }
    else {
        $page = 1;
    }
    //
    $cat_id = (int)$row['id'];
    // ... etc ...
 
} // Fin 1ère boucle
Si tu initialise d'office le N° page obtenu en GET sans tenir compte de la catégorie ça ne va pas l'faire.
Si le N° de page reçu en GET est 5 alors qu'on ne sait pas si toutes les catégories ont 5 pages, alors ???
Vois tu le problème ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 16h06   #11
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Petite parenthèse au passage.

Les 2 requêtes dans la 1ère boucle seraient mieux si elles sont identiques (entre autre avoir les jointures), sinon il persistera un risque d'avoir un décalage/une incohérence entre le nombre total et les articles récupérés.

Comme ceci :
Code :
1
2
3
4
5
6
 
$asql = "SELECT a.id AS a_id, a.article, a.categorie_id, c.id AS c_id
FROM article AS a
INNER JOIN categorie AS c ON a.categorie_id = c.id
WHERE c.id = ".(int)$row['id']."
LIMIT $limit_start, $pagination";
J'ai rajouté des alias aux tables, ça simplifie la requête.
Et aussi des alias aux champs a.id (a_id) et c.id (c_id), ce qui fait qu'il faut exploiter les alias a_id et c_id.

Code :
1
2
3
4
5
$count_sql = 'SELECT COUNT(*) AS nb_total
FROM article AS a
INNER JOIN categorie AS c ON a.categorie_id = c.id
WHERE c.id = '.(int)$row['id'];
$nb_total = mysqli_query($conn, $count_sql);


A coté de ça, MySQL permet de faire cela un peu différemment.
Exemple :
Code :
1
2
3
4
5
6
 
$asql = "SELECT SQL_CALC_FOUND_ROWS a.id AS a_id, a.article, a.categorie_id, c.id AS c_id
FROM article AS a
INNER JOIN categorie AS c ON a.categorie_id = c.id
WHERE c.id = ".(int)$row['id']."
LIMIT $limit_start, $pagination";
Puis pour obtenir le nombre total :
Code :
1
2
$count_sql = 'SELECT FOUND_ROWS() AS nb_total';
$nb_total = mysqli_query($conn, $count_sql);
En somme, on a plus besoin de refaire (sensiblement) la même requête SQL que la 1ère pour obtenir le nombre total.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 19h11   #12
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Je vais prendre le temps d'étudier ça et d'exercer.
Oui, j'avoue ne pas avoir tout compris dans ton message précédent.
Un grand merci et je vais te donner un feedback.

C'est grandement apprécié et en plus, je trouve les messages
d'une grande qualité. Sincèrement.

__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 10h07   #13
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Par défaut

Ça marche comme je voulais. Je suis très content.

Je vais m'attarder sur ça pour assimiler les changements.

J'ai pas touché aux jointures mais je vais le faire aussi pour comprendre.

Merci RunCodePhp.

__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 10h14   #14
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Bonjour.

Je me demande si on peut garder la position des autres plutôt que de réinitialiser à 1.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 10h52   #15
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Citation:
Je me demande si on peut garder la position des autres plutôt que de réinitialiser à 1.
Si tu veux mémoriser chaque pagination, c'est à dire :
- Au départ on clique sur la page 2 de la catégorie 1. On l'affiche (les autres c'est la page 1).
- Puis après on clique sur la page 4 de la catégorie 2, on affiche celle-ci + on conserve/affiche celle d'avant : page 2 de la catégorie 1
- et ainsi de suite au fil des clics ...

C'est possible.
Tu peux utiliser les un cookie ou une session, et stocker chaque catégorie (chaque ID) et le N° de page associé.
Au départ les pages seront forcément la 1 (page 1), mais après ça variera, suffit de les ré-initialiser/mémoriser dans le cookie ou session.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 11h26   #16
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Citation:
Envoyé par RunCodePhp Voir le message
session, et stocker chaque catégorie (chaque ID) et le N° de page associé.
.
Ce que j'ai fait ($_SESSION['cat_id']):
Code :
1
2
3
4
5
6
7
8
9
10
11
		while ($row = mysqli_fetch_array($rs)){
      echo '<tr>';
        echo '<td bgcolor="#ddd">'.$row['categorie'].'</td>';
				if (isset($_GET['cat'], $_GET['page']) && (int)$_GET['cat'] === (int)$row['id']){
						$page = (int)$_GET['page'];
				}
				else{
						$page = 1;
				}
 
				$_SESSION['cat_id'] = (int)$row['id'];
aux liens :
Code :
echo ' <a href="?page='.($page-1).'&cat='.$_SESSION['cat_id'].'"><</a> ';
Je sais pas pour le reste.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 12h07   #17
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Code :
$_SESSION['cat_id'] = (int)$row['id'];
Là tu stock un seul et unique ID de catégorie.

Il te faut stocker/mémoriser TOUS les IDs de toutes les catégorie ET leur page associés.
De plus, il faudra les initialiser selon certaines conditions.

Il faut donc un tableau à plusieurs dimensions.
Quelque chose comme :
Code :
$_SESSION['pagination'][(int)$row['id']] = $page;
- Une seule variable de session "pagination" (1ère dimension)
- la clé de la 2ème dimension c'est la valeur de l'ID de la catégorie
- Puis la valeur de cet ensemble c'est le N° de page

Concernant les conditions, il faut en priorité vérifier la présence de l'ID de la catégorie en GET.
- SI l'ID de la catégorie est présente en GET, alors on ré-initialise le N° de page de la session avec la valeur du N° de page en GET + on initialise $page avec cette même valeur (du N° de page en GET)
- SINON on ne touche pas à la session, on initialise $page avec le N° de page dans la session.


A coté de ça, quand on arrivera la toute 1ère fois dans cette page, la session "pagination" n'existera pas.
Il faut à tout prix la créer, et ça 1 seule fois, et initialiser une page par défaut (page 1)
Il faut faire cela dès de départ de la boucle sur les catégories.
Code :
1
2
3
4
5
6
7
8
 
while ($row = mysqli_fetch_array($rs)) {
    if (!isset($_SESSION['pagination'][$row['id']])) {
        // Initialisation de la page par défaut de chaque catégorie (1 seule fois)
        $_SESSION['pagination'][$row['id']] = 1;
    }
    // ... etc ...
}
Essai d'écrire le déroulement de ton programme comme je le fais ici (et les fois d'avant).
Rassemble tes idées : ce qu'il faut, quelles conditions, etc ...
tout cela en français ... il n'y a pas besoin de savoir coder pour le faire
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 18h58   #18
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
J'ai tenté des scénarios. J'ai pas beaucoup de facilité à exprimer le déroulement. C'est une faiblesse que j'ai.

J'ai commenté dans le code ce que j'ai fais :

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
<?php 
session_start(); //ajouté
// 2012-02-09
 
include 'config_open_db.php';
 
$sql="SELECT * FROM categorie";
 
$rs=mysqli_query($conn,$sql);
if(!$rs) die("Probleme : ". mysqli_error($conn));
 
echo '<table align="center">';
 
  while ($row = mysqli_fetch_array($rs)){
    echo '<tr>';
      echo '<td bgcolor="#bcc">'.$row['categorie'].'</td>';
      // if (isset($_GET['cat'], $_GET['page']) && (int)$_GET['cat'] === (int)$row['id']){
      if (!isset($_SESSION['pagination'][$row['id']])) {
        $page = (int)$_GET['page']; 
        $_SESSION['pagination'][(int)$row['id']] = $page; // ajouté
      }
      else{
        $page = 1; // à supprimé je sais pas, j'ai essayé.
        $_SESSION['pagination'][$row['id']] = 1; // ajouté ou remplacé?
      }
 
        $cat_id = (int)$row['id']; // ici, je ne sais plus
 
        $pagination = 1;
        $limit_start = ($page - 1) * $pagination;
 
        $asql="
          SELECT article.id, article.article, article.categorie_id, categorie.id
          FROM article
          INNER JOIN categorie ON article.categorie_id = categorie.id
          WHERE	categorie.id = ".$row['id']."						
          LIMIT $limit_start, $pagination
        ";
        $ars=mysqli_query($conn,$asql);
        if(!$ars) die("Probleme : ". mysqli_error($conn));
 
        while($arow=mysqli_fetch_array($ars)){
          echo '</tr><td> - '.$arow['article'].'</td><tr>';
        }
 
        echo '</tr><tr><td>';
 
        $nb_total = mysqli_query($conn,'SELECT COUNT(*) AS nb_total FROM article WHERE article.categorie_id = '.$row['id']);
        $nb_total = mysqli_fetch_array($nb_total);
        $nb_total = $nb_total['nb_total'];
 
          $nb_pages = ceil($nb_total / $pagination);
 
          if($page <= $nb_total){
 
            if ($page > 1)
                //echo ' <a href="?page='.($page-1).'&cat='.$cat_id'.'"><</a> ';
                echo ' <a href="?page='.($page-1).'&cat='.$_SESSION['cat_id'].'"><</a> '; // modié ici
              else
                echo ' < ';
              echo '<strong>'.$page.'</strong> of '.$nb_pages;
            if ($page < $nb_pages)
                //echo ' <a href="?page='.($page+1).'&cat='.$cat_id.'">></a> ';
                echo ' <a href="?page='.($page+1).'&cat='.$_SESSION['cat_id'].'">></a> '; // modifié ici
              else
                echo ' > ';
          }
 
    echo '<hr></td></tr>';
 
  }
 
echo '</table>';
 
mysqli_close($conn);
?>
J'ai essayé des choses.

Ce que je sais, quand tu veux mettre une variable dans une session, c'est ajouter comme ceci :

variable = définition
session = variable

Là, je ne sais plus.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 06h00   #19
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Citation:
Ce que je sais, quand tu veux mettre une variable dans une session, c'est ajouter comme ceci :
variable = définition
session = variable
Je ne vois pas ce que tu tu veux dire par là.

$_SESSION est un tableau superglobal (superglobal car il est visible/accessible partout : fonction, classe, etc ...), et on dit que : chaque élément qui le compose est une variable de session.
La création d'une variable de session se fait en 1 opération.
Exemple :
Code :
$_SESSION['une_variable'] = 'Valeur de cette variable de session une_vriable';
La valeur peut être n'importe quel type : un entier, un tableau, un Objet, etc ...
C'est tout.


Mise à part cette parenthèse, en me relisant j'ai remarqué que j'avais oublier de conserver un aspect important au niveau des conditions.
Je reformule, et je le fait dans l'ordre.
D'abord, tout ce passe à l'intérieur de la boucle while des catégories.

1/ On créer une variable de session "pagination" contenant un tableau dont la clé est l'ID de la catégorie en court et la valeur la page par défaut (1) SI elle n'existe pas.
Le code je l'avais donné :
Code :
1
2
3
4
5
6
7
8
9
10
 
while ($row = mysqli_fetch_array($rs)) {
    // Etape 1
    if (!isset($_SESSION['pagination'][$row['id']])) {
        // Initialisation de la page par défaut de chaque catégorie (1 seule fois)
        $_SESSION['pagination'][$row['id']] = 1;
    }
    // Etape 2
    // ... etc ...
}
Il n'y a pas lieu de modifier ce code normalement.

Ensuite, c'est là où j'avais fais un oubli (je reformule donc) :
2/ Concernant les conditions, il faut en priorité vérifier la présence de l'ID de la catégorie en GET.
- SI un ID de catégorie est présent en GET
ET SI cet ID de catégorie est identique à l'ID de la catégorie en court ($row['id'])
ALORS on ré-initialise le N° de page de la session de cet ID de catégorie avec la valeur du N° de page en GET + on initialise $page avec cette même valeur (du N° de page en GET)
- SINON (on ne touche pas à la session) on initialise $page avec la valeur du N° de page se trouvant dans la session "pagination" correspondant à la catégorie en court.


Tout est là normalement.
Je ne mets pas le code volontairement, histoire de t'exercer (je sais c'est pas cool ).
Essai de traduire ça en code, en condition et initialisation.
Le reste du code (celui avant d'intégrer les sessions) devrait resté inchangé.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 17h35   #20
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Je ne sais pas interprété:
Citation:
ALORS on ré-initialise le N° de page de la session de cet ID de catégorie avec la valeur du N° de page en GET + on initialise $page avec cette même valeur (du N° de page en GET)
- SINON (on ne touche pas à la session) on initialise $page avec la valeur du N° de page se trouvant dans la session "pagination" correspondant à la catégorie en court.
Mais, le reste :
Code :
1
2
3
4
5
6
7
8
if(isset($_GET['id'])){ //vérifier la présence de l'id en get
  if($_GET['id'] === $row['id']){ //vérifier si identique
 
  }
  else{
 
  }
}
__________________
dancom5 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 15h59.


 
 
 
 
Partenaires

Hébergement Web