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 :

Probléme de pagination


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 123
    Par défaut Probléme de pagination
    Bonjour à tous,

    Voici mon problème. Le site internet de la société dans laquelle je travail à été développé par un prestataire externe. Depuis de nombreuses semaines, nous avons un soucis (nous l'avons toujours eu depuis la création du site...) auquel notre prestataire n'a jamais trouvé une solution. Aprés une multitude de conflit, nous n'avons plus aucun contact avec ce prestataire...

    Ayant les bases en PHP, je cherches à résoudre le soucis afin d'éviter les coûts supplémentaires.

    Le soucis :

    Nous avons 3 champs de recherche sous forme de combos. Le résultats obtenu s'affiche sur plusieurs pages (1-2-3...Etc). Les pages 1,2 fonctionnent parfaitement, cependant à partir de la page 3, nous avons des résultats complétements faux

    Voici le code PHP concerné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    <?php
    require_once("application_top.php");
    require_once("template/class/mysqlClass.php");
    require_once("template/class/paginationClass.php");
     
    ?>
    <h1><img src="template/images/h1-catalogue.png"></h1>
    <br /><br />
    <?php
      // print_r($_SESSION);
    		if(!empty($_POST)) {
                        $_SESSION['recherche'] = array();
                    }
                    if(!empty($_SESSION['recherche'])) {
                        $recherche = $_SESSION['recherche'];
                        //echo $recherche;
                    } else {
    		$recherche = "";
     
    		if (!empty($_GET['tarif'])) { 
    		$tarif = explode("-", $_GET['tarif']);
    		} else {
    		$tarif = explode("-", $_POST['tarif']);
    		}
     
    		$tarif_min =  $tarif[0]; // tarif min
    		$tarif_max =  $tarif[1]; // tarif max
    		//echo $tarif_min." / ".$tarif_max;
    		if (!empty($_GET['type'])) { 
    		$recherche .= "AND type LIKE '%".$_GET['type']."%'";	}
    		if (!empty($_GET['periode'])) { 
    		$recherche .= " AND date_debut LIKE '%".$_GET['periode']."%'";	}
    		if (!empty($_GET['tarif'])) { 
    		$recherche .= " AND tarif > ".$tarif_min." AND tarif < ".$tarif_max."";	}
     
    		if (!empty($_POST['type'])) { 
    		$recherche .= " AND type LIKE '%".$_POST['type']."%'";	}
    		if (!empty($_POST['periode'])) { 
    		$recherche .= " AND month(date_debut)=".$_POST['periode'];	}
    		if (!empty($_POST['tarif'])) { 
    		$recherche .= " AND tarif > ".$tarif_min." AND tarif < ".$tarif_max."";	}
     
    		//if (empty($recherche)) { $recherche = '';	}
    		$_SESSION['recherche'] = $recherche;
                    }
    				/* Calcul du nombre total d'entrées $total dans la table posts */	
    		$sql1 = new DB();
    		$query1 = "SELECT COUNT(*) FROM catalogue AS c LEFT JOIN catalogue_dates AS cd ON c.id = cd.catalogue_id WHERE c.id!=0 ".$recherche." ORDER BY date_debut ASC";
    		//echo $query1;
    		$sql1->query($query1);
    		while ($pagine = $sql1->next_record()) {
    		$total = $pagine[0];
    		}
     
     
    		/* Déclaration des variables */
    		$epp = 5; // nombre d'entrées à afficher par page (entries per page)
    		$countp = ceil($total/$epp); // calcul du nombre de pages $countp (on arrondit à l'entier supérieur avec la fonction ceil() )
     
    		/* Récupération du numéro de la page courante depuis l'URL avec la méthode GET */
    		if(!isset($_GET['p']) || !is_numeric($_GET['p']) ) // si $_GET['p'] n'existe pas OU $_GET['p'] n'est pas un nombre (petite sécurité supplémentaire)
    			$current = 1; // la page courante devient 1
    		else
    		{
    			$page = intval($_GET['p']); // stockage de la valeur entière uniquement
    			if ($page < 1) $current=1; // cas où le numéro de page est inférieure à 1 : on affecte 1 à la page courante
    			elseif ($page > $countp) $current=$countp; //cas où le numéro de page est supérieur au nombre total de pages : on affecte le numéro de la dernière page à la page courante
    			else $current=$page; // sinon la page courante est bien celle indiquée dans l'URL
    		}
     
    		/* $start est la valeur de départ du LIMIT dans notre requête SQL (est fonction de la page courante) */
    		$start = ($current * $epp - $epp);
     
    		$test_id = array();
     
    			$sql = new DB();
    				$query = "SELECT distinct * FROM catalogue AS c LEFT JOIN catalogue_dates AS cd ON c.id = cd.catalogue_id WHERE c.id!=0 ".$recherche." ORDER BY date_debut ASC LIMIT $start, $epp";
    			//print_r($query);
    			$sql->query($query);
    			while ($cata = $sql->next_record()) {
     
     
    		if (in_array($cata['0'], $test_id)) {
    			//echo "deja present";
    		} else {
    		array_push($test_id, $cata['0']);
    		//print_r($test_id);
     
    ?>
    Voilà, si vous avez une piste, je suis preneur.

    Merci beaucoup

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    et si tu disais ce qui va pas?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 123
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    et si tu disais ce qui va pas?
    Il me semblait l'avoir signalé

    Mon soucis est que sur ma page j'ai 3 combos et un bouton valider permettant d'effectuer une recherche dans ma base.

    le résultat de ma recherche s'affiche sur plusieurs pages (5 résultats par pages).
    Les pages 1 et pages 2 fonctionnent très bien, par contre, à partir de la page 3 les résultats affichés sont complétement faux

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    ce que je veux te faire comprendre c'est que "faux" ne veut pas dire grand chose

    ça peut venir de la requête qui a un problème ou ton code php qui génère une page de trop par rapport au nombre de résultats...

    as tu essayé ta requête pour voir ce qu'elle te sort et à partir de quelle ligne de résultat ça part en vrille...

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    pourrais tu poster le code générant les liens des pages.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 123
    Par défaut
    Bonjour à tous

    Merci pour vos réponses :

    Concernant la requête principale à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "SELECT distinct * FROM catalogue AS c LEFT JOIN catalogue_dates AS cd ON c.id = cd.catalogue_id WHERE c.id!=0 ".$recherche." ORDER BY date_debut ASC LIMIT $start, $epp";
    Elle fonctionne bien, et m'affiche les resultats voulus dans mon phpmyadmin

    Voici le code du fichier les liens de pages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    <?php
    /**
     * paginate($url, $param, $total, $current [, $adj]) appelée à chaque affichage de la pagination
     * @param string $url - URL ou nom de la page appelant la fonction, ex: 'index.php' ou 'http://example.com/'
     * @param string $param - paramètre à ajouter à l'URL, ex: '?page=' ou '&amp;p='
     * @param int $total - nombre total de pages
     * @param int $current - numéro de la page courante
     * @param int $adj (facultatif) - nombre de numéros de chaque côté du numéro de la page courante (défaut : 3)
     * @return string $pagination
     */
    function paginate($url, $param, $total, $current, $adj=3)
    {
    	/* Déclaration des variables */
    	$prev = $current - 1; // numéro de la page précédente
    	$next = $current + 1; // numéro de la page suivante
    	$n2l = $total - 1; // numéro de l'avant-dernière page (n2l = next to last)
     
    	/* Initialisation : s'il n'y a pas au moins deux pages, l'affichage reste vide */
    	$pagination = '';
     
    	/* Sinon ... */
    	if ($total > 1)
    	{
    		/* Concaténation du <div> d'ouverture à $pagination */
    		$pagination .= "<div class=\"pagination\">\n";
     
    		/* ////////// Début affichage du bouton [précédent] ////////// */
    		if ($current == 2) // la page courante est la 2, le bouton renvoit donc sur la page 1, remarquez qu'il est inutile de mettre ?p=1
    			$pagination .= "<a href=\"{$url}\"><</a>";
    		elseif ($current > 2) // la page courante est supérieure à 2, le bouton renvoit sur la page dont le numéro est immédiatement inférieur
    			$pagination .= "<a href=\"{$url}{$param}{$prev}\">?</a>";
    		else // dans tous les autres, cas la page est 1 : désactivation du bouton [précédent]
    			$pagination .= '<span class="inactive"><</span>';
    		/* Fin affichage du bouton [précédent] */
     
    		/* ///////////////
    		Début affichage des pages, l'exemple reprend le cas de 3 numéros de pages adjacents (par défaut) de chaque côté du numéro courant
    		- CAS 1 : il y a au plus 12 pages, insuffisant pour faire une troncature
    		- CAS 2 : il y a au moins 13 pages, on effectue la troncature pour afficher 11 numéros de pages au total
    		/////////////// */
     
    		/* CAS 1 */
    		if ($total < 7 + ($adj * 2))
    		{
    			/* Ajout de la page 1 : on la traite en dehors de la boucle pour n'avoir que index.php au lieu de index.php?p=1 et ainsi éviter le duplicate content */
    			$pagination .= ($current == 1) ? '<span class="active">1</span>' : "<a href=\"{$url}\">1</a>"; // Opérateur ternaire : (condition) ? 'valeur si vrai' : 'valeur si fausse'
     
    			/* Pour les pages restantes on utilise une boucle for */
    			for ($i = 2; $i<=$total; $i++)
    			{
    				if ($i == $current) // Le numéro de la page courante est mis en évidence (cf fichier CSS)
    				$pagination .= "<span class=\"active\">{$i}</span>";
    				else // Les autres sont affichés normalement
    				$pagination .= "<a href=\"{$url}{$param}{$i}\">{$i}</a>";
    			}
    		}
     
    		/* CAS 2 : au moins 13 pages, troncature */
    		else
    		{
    			/*
    			Troncature 1 : on se situe dans la partie proche des premières pages, on tronque donc la fin de la pagination.
    			l'affichage sera de neuf numéros de pages à gauche ... deux à droite (cf figure 1)
    			*/
    			if ($current < 2 + ($adj * 2))
    			{
    				/* Affichage du numéro de page 1 */
    				$pagination .= ($current == 1) ? "<span class=\"active\">1</span>" : "<a href=\"{$url}\">1</a>";
     
    				/* puis des huit autres suivants */
    				for ($i = 2; $i < 4 + ($adj * 2); $i++)
    				{
    				if ($i == $current)
    					$pagination .= "<span class=\"active\">{$i}</span>";
    					else
    					$pagination .= "<a href=\"{$url}{$param}{$i}\">{$i}</a>";
    				}
     
    				/* ... pour marquer la troncature */
    				$pagination .= ' ... ';
     
    				/* et enfin les deux derniers numéros */
    				$pagination .= "<a href=\"{$url}{$param}{$n2l}\">{$n2l}</a>";
    				$pagination .= "<a href=\"{$url}{$param}{$total}\">{$total}</a>";
    			}
     
    			/*
    			Troncature 2 : on se situe dans la partie centrale de notre pagination, on tronque donc le début et la fin de la pagination.
    			l'affichage sera deux numéros de pages à gauche ... sept au centre ... deux à droite (cf figure 2)
    			*/
    			elseif ( (($adj * 2) + 1 < $current) && ($current < $total - ($adj * 2)) )
    			{
    				/* Affichage des numéros 1 et 2 */
    				$pagination .= "<a href=\"{$url}\">1</a>";
    				$pagination .= "<a href=\"{$url}{$param}2\">2</a>";
     
    				$pagination .= ' ... ';
     
    				/* les septs du milieu : les trois précédents la page courante, la page courante, puis les trois lui succédant */
    				for ($i = $current - $adj; $i <= $current + $adj; $i++)
    				{
    					if ($i == $current)
    					$pagination .= "<span class=\"active\">{$i}</span>";
    					else
    					$pagination .= "<a href=\"{$url}{$param}{$i}\">{$i}</a>";
    				}
     
    				$pagination .= ' ... ';
     
    				/* et les deux derniers numéros */
    				$pagination .= "<a href=\"{$url}{$param}{$n2l}\">{$n2l}</a>";
    				$pagination .= "<a href=\"{$url}{$param}{$total}\">{$total}</a>";
    			}
     
    			/*
    			Troncature 3 : on se situe dans la partie de droite, on tronque donc le début de la pagination.
    			l'affichage sera deux numéros de pages à gauche ... neuf à droite (cf figure 3)
    			*/
    			else
    			{
    				/* Affichage des numéros 1 et 2 */
    				$pagination .= "<a href=\"{$url}\">1</a>";
    				$pagination .= "<a href=\"{$url}{$param}2\">2</a>";
     
    				$pagination .= ' ... ';
     
    				/* puis des neufs dernières */
    				for ($i = $total - (2 + ($adj * 2)); $i <= $total; $i++)
    				{
    					if ($i == $current)
    						$pagination .= "<span class=\"active\">{$i}</span>";
    					else
    						$pagination .= "<a href=\"{$url}{$param}{$i}\">{$i}</a>";
    				}
    			}
    		}
    		/* Fin affichage des pages */
     
    		/* ////////// Début affichage du bouton [suivant] ////////// */
    		if ($current == $total)
    			$pagination .= "<span class=\"inactive\">></span>\n";
    		else
    			$pagination .= "<a href=\"{$url}{$param}{$next}\">></a>\n";
    		/* Fin affichage du bouton [suivant] */
     
    		/* </div> de fermeture */
    		$pagination .= "</div>\n";
    	}
     
    	/* Fin de la fonction, renvoi de $pagination au programme */
    	return ($pagination);
    }
    ?>

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    J'ai regardé le code, je ne rien trouvé à première vue qui clochait (il s'est quand même compliqué la vie pour la pagination).
    Par contre, il faudrait rechercher dans tous les scripts ceux qui font appel à $_SESSION['recherche']. Il se pourrait que le problème soit lié à un écrasement de valeur de session. Je m'explique : vu qu'il stocke la clause where dans la session sous la clé générique 'recherche', il est tout à fait possible que sur un autre onglet tu fasses une autre recherche et que cette dernière utilise aussi la même manière pour stocker le where et écrase du coup le where de la recherche précédente. Donc quand tu reviens sur la pagination de ta première recherche, tu obtiens des valeurs fantaisistes.
    Si c'est ça, le problème, va falloir repasser à travers tout le code.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 123
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Salut,

    J'ai regardé le code, je ne rien trouvé à première vue qui clochait (il s'est quand même compliqué la vie pour la pagination).
    Par contre, il faudrait rechercher dans tous les scripts ceux qui font appel à $_SESSION['recherche']. Il se pourrait que le problème soit lié à un écrasement de valeur de session. Je m'explique : vu qu'il stocke la clause where dans la session sous la clé générique 'recherche', il est tout à fait possible que sur un autre onglet tu fasses une autre recherche et que cette dernière utilise aussi la même manière pour stocker le where et écrase du coup le where de la recherche précédente. Donc quand tu reviens sur la pagination de ta première recherche, tu obtiens des valeurs fantaisistes.
    Si c'est ça, le problème, va falloir repasser à travers tout le code.

    Merci,

    La meilleure solution n'est il pas de refaire une pagination plus simple ?

    Si oui , quelle(s) méthode utiliser ?

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par jujurochedu42 Voir le message
    La meilleure solution n'est il pas de refaire une pagination plus simple ?
    Le forum a plusieurs discussions concernant la pagination. Voici la dernière à la quelle j'ai participé : ici (problème similaire)

Discussions similaires

  1. [Struts-Layout] Problème de pagination
    Par Haplo2006 dans le forum Struts 1
    Réponses: 1
    Dernier message: 23/02/2007, 18h09
  2. Problème de pagination avec un GridView
    Par Perceuse-Killer dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/02/2007, 13h30
  3. [DisplayTag] Problème de pagination
    Par questionneuse dans le forum Taglibs
    Réponses: 6
    Dernier message: 21/08/2006, 16h54
  4. [MySQL] Problème de pagination dans un script.
    Par Scurz dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/08/2006, 12h47
  5. [SQL] Problème de pagination avec tableau
    Par guy2004 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 06/05/2006, 22h16

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