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

Langage PHP Discussion :

Afficher des commentaires en plusieurs fois


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Afficher des commentaires en plusieurs fois
    Bonjour,
    j'aimerai afficher par exemple les commentaires de 5 en 5 et un bouton afficher la suite pour ajouter les 5 suivants
    ma question:
    c'est possible avec une requette mysql ou il faut du code?

  2. #2
    Membre émérite
    Salut,

    Oui bien sûr que c'est possible si tu as une table mysql dans laquelle tu enregistre les données puis tu lances une requête avec un limit start , 5 dont start=0 au premier chargement de la page, puis à chaque fois que tu cliques sur suivant tu incrémentes le start de 5 pour arriver à limit 0 , 5, limit 5 , 5, limit 10 , 5 .... ET bien sûr un code serveur pour gérer la récupération des commentaires de la requête mysql.

  3. #3
    Membre régulier
    ok, merci je vais essayer

  4. #4
    Membre régulier
    J'ai fait ce que vous préconisez et j'ai essayà d'incrémenter le limit avec une variable de 3 en 3 mais le premier passage ca marche et après ca ne marche plus, ca incrémente pas de 3?
    voici le 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
    <?php
    $i = 0;
      $avis = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis DESC LIMIT 0,3");
        while ($lavis = $avis -> fetch())
          //$image=$lavis['emo_avis'];
        {
          ?>
          //la je met les commentaires
          <?php 
         } 
       ?>
       <!--input type="submit" value="Avis suivants ->" name="go" /-->
       <?php
     
       $avis2 = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis ");
       $compteuravis2=$avis2->rowCount();
       $compteuravis=$avis->rowCount();
       if($compteuravis>0 and ($compteuravis2!=$compteuravis)){
        ?>
        <form method="POST" action="visualiserAnnonce2.php?id=<?php echo $id;?>#commentaires">
          <input type="submit" name="go"  value="Avis suivants ->">
        </form> 
        <?php
      }else{
        ?>
        <input type="button" id="go" name="go" value="Avis suivants ->" style="display:none" />
        <?php
      }
     
          if(isset($_POST['go'])){
          $i=$i+3;
          $avis = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis DESC limit 0,".$i."");
     
        while ($lavis = $avis -> fetch())
          //$image=$lavis['emo_avis'];
        {
          ?>
          //la je met les commentaires
           <?php 
         } 
       }
       ?>

  5. #5
    Membre émérite
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    $avis = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis DESC limit 0,".$i."");



    limit start , offset, la variable $i doit représenter le start et pas l'offset et c'est le start qui s'incrémente et le offset reste toujours à 3 si tu veux afficher 3 commentaires par 3.

    Donc la requête doit être comme suite :

    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    $avis = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis DESC limit ".$i." , 3 ");


    Une autre remarque, tes requêtes ne sont pas préparées, mais bon pour l'instant je ne vais pas te compliquer les choses...

  6. #6
    Membre régulier
    ok, merci

    j'ai essayé mais ça n'affiche que 3 commentaires même quand je clic sur le bouton? avant il y en avait 3 commentaires au début et quand je clic sur le bouton il y en a 6, mais le problème est que quand je clic encore il n'affiche pas les suivants? j'ai l'impression que le $i ne s'incrémente pas?

  7. #7
    Membre émérite
    oui le $i ne s'incrémente pas, parce que à chaque fois tu appelle le script le $i = 0; s’initialise à 0 au début.

    il va falloir trouver un moyen pour sauvegarder la valeur de $i dans un input hidden de ton <form>.

  8. #8
    Membre régulier
    voilà le nouveau code mais ca marche toujours pas?
    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
    <?php
     
      $avis = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis DESC LIMIT 0,3");
        while ($lavis = $avis -> fetch())
          //$image=$lavis['emo_avis'];
        {
          ?>
          //ici les commentaires
          <?php 
         } 
       ?>
       <!--input type="submit" value="Avis suivants ->" name="go" /-->
       <?php
     
       $avis2 = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis ");
       $compteuravis2=$avis2->rowCount();
       $compteuravis=$avis->rowCount();
       if($compteuravis>0 and ($compteuravis2!=$compteuravis)){
        ?>
        <form method="POST" action="visualiserAnnonce2.php?id=<?php echo $id;?>#commentaires">
          <input type="submit" name="go"  value="Avis suivants ->">
          <input type="hidden" name="vA" value="<?php echo $i=0; ?>"/>
        </form> 
        <?php
      }else{
        ?>
        <input type="button" id="go" name="go" value="Avis suivants ->" style="display:none" />
        <?php
      }
     
          if(isset($_POST['go'])){
          $i=$i+3;
          $avis = $bdd -> query("SELECT * FROM avis WHERE id_ann_avis='$id' ORDER BY id_avis DESC limit ".$i.",3");
     
        while ($lavis = $avis -> fetch())
          //$image=$lavis['emo_avis'];
        {
          ?>
          //ici les commentaires
           <?php 
         } 
       }
       ?>

  9. #9
    Membre émérite
    tu n'as pas compris le principe.

    Peux-tu Exporter ta base de donnée dans un fichier .sql afin que je puisse tester ton code ?

  10. #10
    Membre régulier
    voici la table

  11. #11
    Membre émérite
    Bonsoir,

    Si le script s’exécute sur la même page visualiserAnnonce2.php, voilà une solution simple pour gérer l'affichage des commentaires 3 par 3 :
    Code php :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
     
    <?php
        try{
    	$bdd=new PDO('mysql:host=localhost;dbname=nomBase', 'root', 'motdepasse'
    	    , array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION /* cette option permet d'afficher les avertissements/exceptions, il faut TOUJOURS  l'utiliser ! */
                      ,PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8') /* cette option permet l'encodage des caractères spéciaux, comme les accents et autres caractères .... */
            );
       }catch(Exception $e){
    	echo "Erreur oonnection à la base : ".$e->getMessage();
            exit();/* si la connection à la base échoue, on quitte le script et on s'arrête ici */
       }
       $id=isset($_POST['id'])?$_POST['id']:376;//récupération de l'id utilisateur
       $offset=isset($_POST['offset'])?$_POST['offset']+3:3;//si la valeur de offset est récupérée depuis le  <input name='offset' ../>, on l'incrémente +3, sinon (au premier chargement) par défaut c'est 3 
       /*La préparation des requêtes est TOUJOURS nécessaires lorsqu'on traite des variables récupérés avec $_POST ou $_GET !*/
       $avis = $bdd -> prepare("SELECT count(*) FROM avis WHERE id_ann_avis=:id");//compter le nombre totale des commentaires appartenant à $id
       $avis->bindParam(":id",$id,PDO:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />ARAM_INT);
       $avis->execute();
       $compteuravis=$avis->fetchColumn();//stocker le nombre dans $compteuravis
     
     
        if($compteuravis>0){
        ?>
        <form method="POST" action="visualiserAnnonce2.php"><!-- Reste en post, pas la peine de mettre ?id dans l'action -->
    	<?php if($offset<$compteuravis){?>
                    <!-- indiquer à l'utilisateur le nombre des commentaires masqués (restants)-->
    		<input type='submit' name='go' value='<?php echo $compteuravis-$offset>1?($compteuravis-$offset)." commentaires restants":" 1 commentaire restant";?>' />
    	<?php } ?>
    		<input type='hidden' name="id" value="<?=$id?>" /> <!-- c ici qu'il faut stocker le $id ....-->
    		<?php 
    			$avis = $bdd->prepare('SELECT * FROM avis WHERE id_ann_avis = :id ORDER BY id_avis DESC LIMIT :offset ');
    			$avis->bindParam(":id",$id,PDO:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />ARAM_INT);
    			$avis->bindParam(":offset",$offset,PDO:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />ARAM_INT);
    			$avis->execute();
                            $nbr=$avis->rowCount();
    			$compteur=0;
    			while ($lavis = $avis -> fetch()){
    				$compteur++;
    			  ?>
    			  <div>
    				<p>id_avis : <?=$lavis["id_avis"];?></p>
    				<?php
    				if($compteur==$nbr){//à chaque fois qu'on appuie sur go, on ajoute un input dans lequel on stock le nombre de commentaires affichés, seulement si c'est le dernier message affiché.
    				?>
    				<input type='hidden' name='offset' value="<?=$compteur;?>" /><!-- Le plus important c'est ça, la value de l'input... -->
    				<?php 
    				} ?>
    			  </div>
    			  <?php
    			} 
     
     
    		?>
    	</form>
    	<?php }
             else {
    		echo "aucun commentaire pour l'id ".$id;
    	}


    Remarque : Ce script recharge la page à chaque fois que tu cliques sur le bouton submit, et le nombre de résultat dépend toujours de l'offset et réellement si l'offset est 6, là on récupère 6 enregistrements et pas 3....

    Au début ça commence par 3, après 6 puis après 9 et ainsi de suite...., la même chose pour 12,15 et 18....

    Si j'étais à ta place je l'aurais fait avec XMLHttpRequest (en pur javascript) ou bien avec jQuery.ajax (en jQuery) pour ne récupérer que 3 lignes à chaque fois et sans rechargement de page

    select * from avis where id_avis<:dernier_id_avis_visible limit 3....

  12. #12
    Membre régulier
    merci beaucoup pour le temps passé, excellent, merci encore