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 :

Pagination multiple même fichier [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    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 : 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
    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 : 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
    <?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 Images attachées  

  2. #2
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    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.

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  4. #4
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    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 : 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
    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.

  5. #5
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut Ne peut être résolu juste avec PHP et MYSQL
    Bonjour, voici ma révision:

    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
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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 :
    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.

  7. #7
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    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

  8. #8
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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.


    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.

  9. #9
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    J'ai ajout ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ' <a href="?page='.($page-1).'&cat='.$cat.'"><</a> ';
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE categorie.id = ".$row['id']."
    , j'obitendrais toutes les articles dans toutes les categories.

    Complèt :

    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  10. #10
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  11. #11
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  12. #12
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    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.


  13. #13
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    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.


  14. #14
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Bonjour.

    Je me demande si on peut garder la position des autres plutôt que de réinitialiser à 1.

  15. #15
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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.

  16. #16
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ' <a href="?page='.($page-1).'&cat='.$_SESSION['cat_id'].'"><</a> ';
    Je sais pas pour le reste.

  17. #17
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $_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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  18. #18
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    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 : 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
    <?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.

  19. #19
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $_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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  20. #20
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je ne sais pas interprété:
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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{
     
      }
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Chargement multiple d'un même fichier XML
    Par noblind dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 08/02/2011, 11h17
  2. Réponses: 3
    Dernier message: 25/01/2010, 13h49
  3. Macro pour sauvegardes multiples d'un même fichier
    Par gigotdagneau dans le forum Conception
    Réponses: 11
    Dernier message: 26/10/2009, 12h26
  4. Réponses: 5
    Dernier message: 08/12/2004, 20h42
  5. utiliser le même fichier dans plusieurs projets vc++6
    Par yannick_sch dans le forum MFC
    Réponses: 5
    Dernier message: 12/02/2004, 17h39

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