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 :

Réaliser une pagination PHP ( PDO ) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut Réaliser une pagination PHP ( PDO )
    Bonjour à tous,
    J'essaye actuellement de créer une pagination pour une galerie d'image.
    Mes informations provenant de la BDD s'affichaient bien au par-avant ( que j'insère le code de pagination ). Pourtant aucune erreur ne s'affiche.
    Si quelqu'un pourrait m'aider à trouver ce qui ne va pas, voici mon code :

    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
     
    <?php
    require_once("connexiondessins.inc.php");
    try {
     
    $retour = $bdd->prepare('SELECT COUNT(*) AS nb_images FROM dessins');
     
    $retour->execute();
    $imageparpage=12;
    $dess = $retour->fetch(PDO::FETCH_ASSOC);
    $totaldesimages = $dess['nb_images'];
     
    $nombredepage  = ceil($totaldesimages/$imageparpage);
    echo 'Page : ';
    for ($i = 1 ; $i <= $nombredepage ; $i++)
    {
        echo '<a href="sps.php?page=' . $i . '">' . $i . '</a> ';
    }
    if (isset($_GET['page']) && !is_numeric($_GET['page']))
    {
            $page = intval($_GET['page']);
    }
    else
    {
            $page = 1;
    }
     
    $premiereimageafficher = ($page - 1)* $imageparpage - $imageparpage;
     
    $reponse = $bdd->prepare('SELECT id,categorie,titre,image,description FROM dessins WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages');
     
    $reponse->bindValue(':category', 'sps');
    $reponse->bindParam(':nbimages', $imageparpage);
    $reponse->bindParam(':offset', $premiereimageafficher);
     
    $reponse->execute();
     
    ?>
    <?php while ($dessins = $reponse->fetch()) { ?>
    <div class="cat1">
      <?php echo '<span class="classtext1v">'.htmlspecialchars($dessins['categorie']).'</span>'; ?>
      <br />
      <?php echo '<span class="classtext2v">'.htmlspecialchars($dessins['titre']).'</span>'; ?>
      <br />
      <a href="selectionsps.php?id=<?php echo htmlspecialchars($dessins['id']); ?>"><img src="images/<?php echo htmlspecialchars($dessins['image']);?>" width="200" height="250" /></a>
    </div>
     
    <?php  
    }
            $reponse->closeCursor();
     
    }
    catch (Exception $e) {
            echo 'Erreur : ',  $e->getMessage();
    } 
    ?>
    Merci pour votre attention et votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut, plusieurs choses à corriger que je t'avais déjà parlé d'ailleurs dans un autre tuto

    Citation Envoyé par reverb94 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Ici ce n'était pas !is_numeric() et j'ai rajouté des conditions pour protéger le tout
    if (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0 && $_GET['page'] <= $nombredepage)
    {
            $page = intval($_GET['page']);
    }
    else
    {
            $page = 1;
    }
     
    // Ensuite ici c'est pas bon (il fallait enlever le  -1)
    $premiereimageafficher = $page* $imageparpage - $imageparpage;
    Essaye ca, sinon qu'est ce qui ne marche pas exactement ?
    As tu essayé de passer une page en paramètre (?page=2) ?
    A quel moment se bloque la page, c'est une page blanche ?

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut
    Bonjour Walane , oui j'ai essayé de modifier quelque partie du code à l'aide de tuto en ligne mais sans succès ^^'. Merci encore pour ton soutien .

    Lorsque je suis sur ma page dessins.php, je séléctionne la catégorie sps.
    Cela m'envoie bien sur ma page 1 : sps.php?=1 , mais aucunes de mes vignettes dessins ( avec la catégorie, titre, et image réduite ) ne s'affichent.
    La pagination est bien présente sur la page ( visible ), mais, elle comporte 10 pages ( toutes vides ) alors qu'en comtabilisant le total de vignette il ne devrait y avoir que 2 ou 3 page :/. ( aucunes pages n'affichent d'informations provenant de ma bdd ).

    Voici le codage mis à jour :

    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
     
    <?php
    require_once("connexiondessins.inc.php");
    try {
     
    $retour = $bdd->prepare('SELECT COUNT(*) AS nb_images FROM dessins');
     
    $retour->execute();
    $imageparpage=12;
    $dess = $retour->fetch(PDO::FETCH_ASSOC);
    $totaldesimages = $dess['nb_images'];
     
    $nombredepage  = ceil($totaldesimages/$imageparpage);
    echo 'Page : ';
    for ($i = 1 ; $i <= $nombredepage ; $i++)
    {
        echo '<a href="sps.php?page=' . $i . '">' . $i . '</a> ';
    }
    if (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0 && $_GET['page'] <= $nombredepage)
    {
            $page = intval($_GET['page']);
    }
    else
    {
            $page = 1;
    }
     
    $premiereimageafficher = $page* $imageparpage - $imageparpage;
     
    $reponse = $bdd->prepare('SELECT id,categorie,titre,image,description FROM dessins WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages');
     
    $reponse->bindValue(':category', 'sps');
    $reponse->bindParam(':nbimages', $imageparpage);
    $reponse->bindParam(':offset', $premiereimageafficher);
     
    $reponse->execute();
     
    ?>
    <?php while ($dessins = $reponse->fetch()) { ?>
    <div class="cat1">
      <?php echo '<span class="classtext1v">'.htmlspecialchars($dessins['categorie']).'</span>'; ?>
      <br />
      <?php echo '<span class="classtext2v">'.htmlspecialchars($dessins['titre']).'</span>'; ?>
      <br />
      <a href="selectionsps.php?id=<?php echo htmlspecialchars($dessins['id']); ?>"><img src="images/<?php echo htmlspecialchars($dessins['image']);?>" width="200" height="250" /></a>
    </div>
     
    <?php  
    }
            $reponse->closeCursor();
     
    }
    catch (Exception $e) {
            echo 'Erreur : ',  $e->getMessage();
    } 
    ?>
    Merci pour ton attention est ton aide.
    Sincèrement.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Debug pas à pas, avec des echos par exemple, pour voir là où ca plante.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut
    Re,
    Je me suis aperçu que nb_images était une erreur ( sur la premiere requête ) je l'ai donc corrigé en 'nbimages' comme dans la requête qui suit (sa na malheuresement rien résolu, exepté le faite que ma pagination passe de 10 à 3 page max).

    j'ai également rajouter critère de selection pour la catégorie sps seulement avec WHERE categorie="sps"';

    J'ai donc suivi ton conseil en faisant des "echo print_r($mavariable);"

    et je me suis aperçu que pour $totaldesimages, il me comptabilise 251 images alors qu'il n'y en a qu'une vingtaine (de la catégorie 'sps').

    peut-être y a t'il une solution à ce problème ^^' je continue mes recherches de mon cotés. Merci pour ton attention walane .

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut
    Bonjours,

    une nouvelle erreur s'affiche, j'ai fait des recherches dessus grâce à notre amis google, mais sa ne m'aide pas vraiment :/.
    Voici l'erreur qui m'est afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '12'' at line 1
    Merci pour ton aide.
    Sincèrement.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Fais voir la requête correspondante et rajoute ça à ta connexion pour que ça affiche les erreurs plus en détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
        $pdo = new PDO($dsn, $user, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo 'Échec lors de la connexion : ' . $e->getMessage();
    }

  8. #8
    Membre émérite
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Points : 2 427
    Points
    2 427
    Billets dans le blog
    27
    Par défaut Méthode
    Bonjour,

    Je serais toi, je débuterais par une classe suffisamment large pour traiter n'importe quoi, car l'objectif de la PDO est la réutilisation. Voici ce que je te propose (écrit à la volée, pas débuggé) :

    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
     
    Class Pagination () { 
     
    	protected $Nbre_Item = 0; 
    	protected $Pas = 6; // exprès pour pas tomber juste ! 
    	protected $Nbre_pages = 0; 
     
    	function __construct($Pas,$Nbre_Item) { 
    		$this->Nbre_Item = Nbre_Item; 
    		$this->Pas_Definir($Nbre_Item); 
    		$this->NbrePage_Definir($Nbre_Item); 
    	} 
     
    	function Pas_Definir($Pas=null) { 
    		$Pas = intval($Pas); 
    		if ($Pas > 0 and $Pas < 99) 
    			$this->Pas = $Pas; 
    	} 
     
    	function NbrePage_Definir($Nbre_Item = 0) { 
    		$Nbre_Item = intval($Nbre_Item); 
    		$this->Nbre_pages = ($Nbre_Item-($Nbre_Item%$this->Pas))/$this->Pas; // retourne un entier positif si $Pas est supérieur à 0 
    		if ($Nbre_Item%$this->Pas > 0) 
    			$this->Nbre_pages++; // car il reste une page avec moins d'éléments que le max du pas 
    	} 
     
    	function NumeroPage_Determiner($Numero_Item=0) { 
    		if ($Numero_Item > $this->Nbre_Item or $Numero_Item<=0) 
    			return false; 
     
    		return array( 
    			'numero de la page' => ($Numero_Item-($Numero_Item%$this->Pas))/$this->Pas+(
    				(($Numero_Item%$this->Pas)>0)?1:0
    			), 
    			'indice dans la page' => ($Numero_Item%$this->Pas) 
    		); 
    	} 
     
    } 
     
    $Pagination = new Pagination(6, 50); // 50 éléments, 6 par pages 
    $Pagination->NumeroPage_Determiner(8); // Retourne 2 (donc page 2) et position 2 (car 6+2 = 8)
    ... Tu peux ainsi traiter ce que tu veux sous la forme de tableaux et d'indices.
    Pour afficher un menu, il te suffit ensuite d'un FOREACH à partir de $Pagination->Nbre_Pages !

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut
    re, voici ma connexion, je doit garder l'utf8 sinon erreur sur mes ' é è etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    try
    {
    	$dns = 'mysql:host=localhost;dbname=dbname';
      $utilisateur = 'users';
      $motDePasse = 'mdp';
      $bdd = new PDO( $dns, $utilisateur, $motDePasse, array (PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8',PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    ?>

  10. #10
    Invité
    Invité(e)
    Par défaut
    +1 Nothus

    Mets montre nous la requête en question qui pose problème

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Nothus Voir le message
    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
     
    Class Pagination () { 
     
    	protected $Nbre_Item = 0; 
    	protected $Pas = 6; // exprès pour pas tomber juste ! 
    	protected $Nbre_pages = 0; 
     
    	function __construct($Pas,$Nbre_Item) { 
    		$this->Nbre_Item = Nbre_Item; 
    		$this->Pas_Definir($Nbre_Item); 
    		$this->NbrePage_Definir($Nbre_Item); 
    	} 
     
    	function Pas_Definir($Pas=null) { 
    		$Pas = intval($Pas); 
    		if ($Pas > 0 and $Pas < 99) 
    			$this->Pas = $Pas; 
    	} 
     
    	function NbrePage_Definir($Nbre_Item = 0) { 
    		$Nbre_Item = intval($Nbre_Item); 
    		$this->Nbre_pages = ($Nbre_Item-($Nbre_Item%$this->Pas))/$this->Pas; // retourne un entier positif si $Pas est supérieur à 0 
    		if ($Nbre_Item%$this->Pas > 0) 
    			$this->Nbre_pages++; // car il reste une page avec moins d'éléments que le max du pas 
    	} 
     
    	function NumeroPage_Determiner($Numero_Item=0) { 
    		if ($Numero_Item > $this->Nbre_Item or $Numero_Item<=0) 
    			return false; 
     
    		return array( 
    			'numero de la page' => ($Numero_Item-($Numero_Item%$this->Pas))/$this->Pas+(
    				(($Numero_Item%$this->Pas)>0)?1:0
    			), 
    			'indice dans la page' => ($Numero_Item%$this->Pas) 
    		); 
    	} 
     
    } 
     
    $Pagination = new Pagination(6, 50); // 50 éléments, 6 par pages 
    $Pagination->NumeroPage_Determiner(8); // Retourne 2 (donc page 2) et position 2 (car 6+2 = 8)
    Est-ce une méthode plus "moderne" pour la conception :/ je ne connais pas du tout cette méthode de class :/. Pourquoi pas apprendre son fonctionement mais est-ce vraiment plus pratique ?

    Merci pour ton intêret à mon soucis .

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut
    Je ne comprend pas :/ dans l'erreur il m'indique la ligne 1, qui correspond dans la page de mon code à <!DOCTYPE HTML> ^^'. Sauf si il faut comptabiliser la ligne 1 à celle ou débute mon code php, l'erreur correspond donc à : require_once("connexiondessins.inc.php");

    petite question par rapport à ça,
    :/ faut-il inclure : require_once("connexiondessins.inc.php"); dans mon try { ?

  13. #13
    Membre émérite
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Points : 2 427
    Points
    2 427
    Billets dans le blog
    27
    Par défaut
    Une classe est un objet au sens où c'est une boîte vide.

    Une boîte où tu mets dedans des fonctions, des variables, etc.

    Intérêts : faire un objet qui se gère lui-même. Réutiliser le même code pour des situations identiques. Gérer la "visibilité" de la portée des fonctions et variables en interne (càd est-ce que ta boîte est étanche ou pas vis-à-vis du script qui la gère).

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $Corinne = new Utilisateur($id = 5); 
    $Thierry = new Utilisateur($id = 8); 
     
    echo $Corinne->Nom_Chercher(); // renverra "Page" 
    echo $Thierry->Nom_Chercher(); // renverra "Breton"

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par reverb94 Voir le message
    Je ne comprend pas :/ dans l'erreur il m'indique la ligne 1, qui correspond dans la page de mon code à <!DOCTYPE HTML>
    Non c'est ton sgbd qui te donne ce message là rien à voir avec le php (enfin presque).
    Pour savoir à partir de quelle ligne ça bug c'est à dire à quelle requête ça plante il faut que tu débugue ligne par ligne. Tu peux mettre des echos ou des die('blabla').

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 149
    Points : 87
    Points
    87
    Par défaut
    Bonjour à tous,

    J'ai trouvé ( grâce à l'aide de "Moogli" ) ce qui n'allait pas.
    Voici la solution si ça peu en aider d'autre ^^.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        $reponse->bindValue(':category', 'sps');
        $reponse->bindParam(':nbimages', $imageparpage, \PDO::PARAM_INT);
        $reponse->bindParam(':offset', $premiereimageafficher, \PDO::PARAM_INT);

    Il fallait rajouter un pour que tout cela fonctionne .

    Merci à tous de m'avoir aidé.
    Sincèrement.

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

Discussions similaires

  1. comment réaliser une pagination avec zend
    Par aziza_1989 dans le forum Autres composants
    Réponses: 3
    Dernier message: 04/06/2012, 18h37
  2. [SQL] Réaliser une pagination comme dans le forum
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/06/2006, 18h04
  3. [MySQL] Réaliser une pagination sur un forum
    Par maroweb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/02/2006, 12h39
  4. [MySQL] réaliser une sous requete en php
    Par SENCABOY dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 14/02/2006, 20h19
  5. question pour réaliser une pagination
    Par vbcasimir dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 08h17

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