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 des commentaires [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut Pagination des commentaires
    Bonjour à tous,

    Voilà je vous expose mon soucis. Je fonctionne avec 2 pages php :
    - l'une affiche une liste de 3 articles avec un système de pagination (blog.php)
    - l'autre affiche les commentaires liés à un article (sur lequel on a cliqué)

    La pagination des articles est terminée mais je rencontre des problèmes sur la pagination des commentaires. Je pense que le problème réside dans la liaison entre les commentaires et le billet qui leur est associé.

    Voici le code des 2 fichiers :

    Blog.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
    60
    61
    62
    63
    64
    65
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<link type="text/css" rel="stylesheet" href="styles.css">
    	<title>TP Blog</title>
    </head>
    <body>
     
    <h1>TP Blog amélioré</h1>
     
    <?php
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
    ?>
     
    <?php
     
    $limite = 3;
    $page = (!empty($_GET['page']) ? $_GET['page'] : 1); // Définition d'un numéro de page par défaut
    $debut = ($page - 1) * $limite; // On calcule le numéro du premier élément à récupérer
     
    // PARTIE REQUETE DES BILLETS
    $requete = 'SELECT id, titre, contenu, DAY(date_creation) AS jour, MONTH(date_creation) AS mois, YEAR(date_creation) AS annee FROM billets ORDER BY date_creation DESC LIMIT :limite OFFSET :debut';
    $reponse = $bdd->prepare($requete);
    $reponse->bindValue(
    		'limite', // Le marqueur est nommé limite
    		$limite, // Il doit prendre la valeur de la variable $limite
    		PDO::PARAM_INT // Cette valeur est de type entier
    		);
    $reponse->bindValue(
    		'debut', // Le marqueur est nommé limite
    		$debut, // Il doit prendre la valeur de la variable $limite
    		PDO::PARAM_INT // Cette valeur est de type entier
    		);
    $reponse->execute();
     
     
    	while ($billets = $reponse->fetch())
    	{?>
    	<div class="news">
    		<h3>
    			<?php echo $billets['titre'];?> publié le 
    			<?php  echo $billets['jour'];?>/<?php  echo $billets['mois'];?> - <?php  echo $billets['annee'];?>
    		</h3>
    			<p><?php echo $billets['contenu']; ?><br><a href="commentaires.php?billet=<?php echo $billets['id'];?>">Commentaires</a></p>
    	</div>
    	<?php
    	}
     
    	$reponse->closeCursor();
    ?>
     
    <a href="blog.php?page=<?php echo $page - 1; ?>">Page précédente</a>
    <a href="blog.php?page=<?php echo $page + 1; ?>">Page suivante</a>
     
     
    </body>
    </html>
    commentaires.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
    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
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	<title>Commentaires</title>
    </head>
    <body>
     
    <h1>Liste des commentaires</h1>
     
    <?php
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }
    ?>
     
    <?php
     
    ?>
     
    <?php // AFFICHAGE DU BILLET SELECTIONNE
    $requete = 'SELECT id, titre, contenu, date_creation, DAY(date_creation) AS jour, MONTH(date_creation) AS mois, YEAR(date_creation) AS annee FROM billets WHERE id = ?';
    $reponse = $bdd->prepare($requete);
    $reponse->execute(array($_GET['billet']));
    $leBillet = $reponse->fetch();
    ?>
     
    <div class="news">
    	<h3>
    	<?php echo $leBillet['titre'];?> publié le 
    	<?php  echo $leBillet['jour'];?>/<?php  echo $leBillet['mois'];?> - <?php  echo $leBillet['annee'];?>
    	</h3>
    		<p><?php echo $leBillet['contenu']; ?></p>
    </div>
     
    <?php $reponse->closeCursor();?>
     
    <?php // AFFICHAGE DES COMMENTAIRES
     
    $limite = 3;
    $page = (!empty($_GET['page']) ? $_GET['page'] : 1); // Définition d'un numéro de page par défaut
    $debut = ($page - 1) * $limite; // On calcule le numéro du premier élément à récupérer
    $BilletSelection = $_GET['billet'];
     
    $requete = 'SELECT id, auteur, commentaire, date_commentaire, DAY(date_commentaire) AS jour, MONTH(date_commentaire) AS mois, YEAR(date_commentaire) AS annee FROM commentaires WHERE :id_billet ORDER BY date_commentaire DESC LIMIT :limite OFFSET :debut';
    $reponse = $bdd->prepare($requete);
    $reponse->bindValue(
    		'id_billet',
    		$_GET['billet'],
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		'limite',
    		$limite,
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		'debut',
    		$debut,
    		PDO::PARAM_INT
    		);
    $reponse->execute();
    while ($leCommentaire = $reponse->fetch())
    		{?>
    			<div class="news">Commentaire de 
    				<?php echo htmlspecialchars($leCommentaire['auteur']);?> publié le 
    				<?php echo $leCommentaire['jour'];?>/<?php  echo $leCommentaire['mois'];?> - <?php  echo $leCommentaire['annee'];?></br>
    				<?php echo htmlspecialchars($leCommentaire['commentaire']);?>
    			</div>
    		<?php $reponse->closeCursor();
    		}?>
     
     
    <a href="commentaires.php?billet=<?php echo $_GET['billet'] ?>&amp;page=<?php echo $page - 1; ?>">Page précédente</a>
    <a href="commentaires.php?billet=<?php echo $_GET['billet'] ?>&amp;page=<?php echo $page + 1; ?>">Page suivante</a>
    <p><a href="blog.php">Retour page d'accueil</a></p>
     
    </body>
    </html>
    A l'affichage, je n'ai aucune erreur. Les commentaires affichés ne correspondent à l'article en question et et leur affichage ne correspond pas à ce que je veux car je n'en vois qu'un par page (au lieu de 3 par page).

    Quelqu'un peut-il m'aider ?
    Merci d'avance pour vos conseil en tout cas

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Que fait le close curseur dans le while ?

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut
    Citation Envoyé par badaze Voir le message
    Que fait le close curseur dans le while ?
    Erreur de placement, je viens de le replacer hors de la boucle. Cela dit, ça ne règle pas le problème malheureusement

    Si ça peut t'aider badaze, j'ai changé ma requête commentaires dans le fichier commentaires.php en :

    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
    $requete = 'SELECT id, auteur, commentaire, date_commentaire, DAY(date_commentaire) AS jour, MONTH(date_commentaire) AS mois, YEAR(date_commentaire) AS annee FROM commentaires WHERE id_billet=".$_GET[\'billet\']." ORDER BY date_commentaire DESC LIMIT :limite OFFSET :debut';
    $reponse = $bdd->prepare($requete);
    $reponse->bindValue(
    		'limite',
    		$limite,
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		'debut',
    		$debut,
    		PDO::PARAM_INT
    		);
    $reponse->execute();
     
    while ($leCommentaire = $reponse->fetch())
    		{?>
    			<div class="news">Commentaire de 
    				<?php echo htmlspecialchars($leCommentaire['auteur']);?> publié le 
    				<?php echo $leCommentaire['jour'];?>/<?php  echo $leCommentaire['mois'];?> - <?php  echo $leCommentaire['annee'];?></br>
    				<?php echo htmlspecialchars($leCommentaire['commentaire']);?>
    			</div>
    		<?php
    		}$reponse->closeCursor(); ?>
    Mais cette fois, les commentaires ne s'affichent plus du tout !

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Tu as écrit : "Les commentaires affichés ne correspondent à l'article en question". Il y a un ne en trop ou il manque un pas ?

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut
    Citation Envoyé par badaze Voir le message
    Tu as écrit : "Les commentaires affichés ne correspondent à l'article en question". Il y a un ne en trop ou il manque un pas ?
    Le soucis c'est que lorsque je clique sur un article, seul un commentaire s'affiche (au lieu de 3) et il ne correspond pas à l'article en question.

    Dans mon premier message, je voulais écrire : "Les commentaires affichés ne correspondent pas à l'article en question".

  6. #6
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Et comme ça ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $requete = 'SELECT id, titre, contenu, DAY(date_creation) AS jour, MONTH(date_creation) AS mois, YEAR(date_creation) AS annee FROM billets ORDER BY date_creation DESC LIMIT :debut , :limite';

    Une chose. Quand j'utilise les paramètres avec PDO, si j'écris :debut dans la requête je passe :debut dans bindValue.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut
    Citation Envoyé par badaze Voir le message
    Et comme ça ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $requete = 'SELECT id, titre, contenu, DAY(date_creation) AS jour, MONTH(date_creation) AS mois, YEAR(date_creation) AS annee FROM billets ORDER BY date_creation DESC LIMIT :debut , :limite';

    Une chose. Quand j'utilise les paramètres avec PDO, si j'écris :debut dans la requête je passe :debut dans bindValue.
    Oui, je fais la même chose aussi, j'ai fais passer :debut et :limite dans bindValue.
    J'ai testé avec le conseil que tu m'as donné ça donne ça :
    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
    $requete = 'SELECT id, auteur, commentaire, date_commentaire, DAY(date_commentaire) AS jour, MONTH(date_commentaire) AS mois, YEAR(date_commentaire) AS annee FROM commentaires WHERE :id_billet ORDER BY date_commentaire DESC LIMIT :debut , :limite';
    $reponse = $bdd->prepare($requete);
    $reponse->bindValue(
    		'id_billet',
    		$_GET['billet'],
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		'limite',
    		$limite,
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		'debut',
    		$debut,
    		PDO::PARAM_INT
    		);
    $reponse->execute();
    Les commentaires s'affichent par tranche de 3 ce qui est parfait. En revanche, il s'agit de tous les commentaires de la base au lieu de ceux faisant partie de l'article sélectionné.

    En fait, j'ai l'impression qu'il ne prend pas du tout en compte le WHERE :id_billet et bindValue id_billet, $_GET['billet'] lorsque j'execute. Car même en les enlevant, j'obtiens le même résultat que le code que je t'ai exposé ci-dessus.

  8. #8
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Il te manque le nom du champ.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE :id_billet ....

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut
    Citation Envoyé par badaze Voir le message
    Il te manque le nom du champ.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE :id_billet ....
    J'ai effectué ce code et ça fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $requete = 'SELECT id, auteur, commentaire, date_commentaire, DAY(date_commentaire) AS jour, MONTH(date_commentaire) AS mois, YEAR(date_commentaire) AS annee FROM commentaires WHERE id_billet = "'.$_GET['billet'].'" ORDER BY date_commentaire DESC LIMIT :debut , :limite';
    $reponse = $bdd->prepare($requete);
    $reponse->bindValue(
    		'limite',
    		$limite,
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		'debut',
    		$debut,
    		PDO::PARAM_INT
    		);
    $reponse->execute();
    Merci 1000 fois badaze !

  10. #10
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    J'aurais fait comme suit :

    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
    $requete = 'SELECT id, auteur, commentaire, date_commentaire, DAY(date_commentaire) AS jour, MONTH(date_commentaire) AS mois, YEAR(date_commentaire) AS annee FROM commentaires WHERE id_billet = :id_billet ORDER BY date_commentaire DESC LIMIT :debut , :limite';
    $reponse = $bdd->prepare($requete);
    $reponse->bindValue(
    		':id_billet',
    		$_GET['billet'],
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		':limite',
    		$limite,
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		':debut',
    		$debut,
    		PDO::PARAM_INT
    		);
    $reponse->execute();

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut
    Citation Envoyé par badaze Voir le message
    J'aurais fait comme suit :

    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
    $requete = 'SELECT id, auteur, commentaire, date_commentaire, DAY(date_commentaire) AS jour, MONTH(date_commentaire) AS mois, YEAR(date_commentaire) AS annee FROM commentaires WHERE id_billet = :id_billet ORDER BY date_commentaire DESC LIMIT :debut , :limite';
    $reponse = $bdd->prepare($requete);
    $reponse->bindValue(
    		':id_billet',
    		$_GET['billet'],
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		':limite',
    		$limite,
    		PDO::PARAM_INT
    		);
    $reponse->bindValue(
    		':debut',
    		$debut,
    		PDO::PARAM_INT
    		);
    $reponse->execute();
    C'est la solution que j'avais privilégiée au début mais elle ne fonctionnait pas justement. Je suis d'accord avec toi, c'est plus logique et censé de cette manière pourtant.

    EDIT :
    SI, elle fonctionne aussi. Je n'avais pas lu ton code dans son intégralité ! Je viens de la tester et je la préfère à la mienne. Merci encore pour tout tes conseils !

  12. #12
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Il te manquait le nom du champ id_billet dans la clause where. C’est tout.

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

Discussions similaires

  1. Pagination des résultats d'une requête
    Par dl_jarod dans le forum ASP
    Réponses: 2
    Dernier message: 17/10/2005, 14h30
  2. [C#] Traduire la documentation issue des commentaires
    Par agueffier dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/06/2005, 01h52
  3. [C#] Comment se formalise des commentaires ?
    Par TheSeb dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 29/05/2005, 23h20
  4. [NetBeans] Changer la couleur des commentaires
    Par Lorenzox dans le forum NetBeans
    Réponses: 3
    Dernier message: 15/12/2004, 08h50

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