Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP minichat amélioration

Sujet résolu
    26 mars 2017 à 15:26:45

    Bonjour je planche sur l'amélioration du TP minichat. En particulier l'affichage des pages pour les messages, et je tente de vérifier le paramètre page de l'url.

            $messPage = 5; // On definit le nombre de message par page à afficher
            $totalPage = ceil ($totalMess/$messPage); // On force le total de page au nombre entier superieur     
            if (!empty($_GET['page'])) // On test si $_GET['page'] existe
            {           
                $pageAffich = (int) $_GET['page']; // On force $_GET['page'] en nombre entier
                if ($_GET['page'] > $totalPage)// Si $pageAffich est plus grand que $pageTotal
                {
                    $pageAffich = $totalPage;// On affiche la dernière page
                }
            }
            else // Sinon on affiche la première page
            {
                $pageAffich = 1;  // On affiche la première page
            }
    
            ?>
            <p>
                <?php
                for($i = 1; $i <= $totalPage; $i++)
                {
                    //Si il s'agit de la page actuelle
                    if($i == $pageAffich)
                    {
                        echo ' ['.$i.'] '; 
                    }  
                    else
                    {
                         echo ' <a href="index.php?page='.$i.'">'.$i.'</a> ';
                    }
                }
                ?>
            </p>

    Si $_GET['page'] est absent j'affiche la première page

    Si $_GET['page'] est plus grand que $totalPage j'affiche la dernière page

    jusque la sa fonctionne bien, mais je n'arrive à rien si je remplace la valeur pour une lettre. Je ne sais pas du tout comment faire pour y arriver. Quelqu'un serait il me mettre sur la voie?

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 mars 2017 à 15:34:54

      Salut. 

      Je ne comprends pas. Pourquoi tu voudrais remplacer par une lettre, où est l'utilité? 

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        26 mars 2017 à 15:36:34

        Je vais te dire un truc tout simple : (j'espère avoir compris, j'ai regardé vite):

        Utilise plus les ifs, et strlen !

        • Partager sur Facebook
        • Partager sur Twitter
          26 mars 2017 à 15:56:51

          JustAnotherGuy a écrit:

          Salut. 

          Je ne comprends pas. Pourquoi tu voudrais remplacer par une lettre, où est l'utilité? 

          Je ne veux pas remplacer par une lettre, je veux justement éviter que l'utilisateur le fasse, dans le cours il est dit de ne pas faire confiance aux données reçu c'est pour ça que j'ai remplacé le chiffre de la page par une lettre.

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            26 mars 2017 à 16:34:27

            Okay.

            C'est bien d'intégrer le "never trust the user" dès qu'on débute, tous les pros ne l'ont pas encore compris.

            Ce que tu veux faire c'est filtrer les inputs :

            L'une des manières les plus propres est celle-ci : https://secure.php.net/manual/en/function.filter-input.php

            Si c'est un peu compliqué pour le moment tu peux effectivement bricoler avec intval() mais ça reste du bricolage, au lieu que ton appli te renvoie des erreurs, elle trouve ça normal qu'on lui donne des caractères, ce qui n'est pas un fonctionnement très sain. Mais ça peut le faire dans un premier temps.

            • Partager sur Facebook
            • Partager sur Twitter
              26 mars 2017 à 18:13:26

              Merci pour vos réponses,

              Il semble effectivement qui´il soit mieux d'utiliser filter_input j'ai commencé à lire un tuto sur le site. Je regarderais aussi le conseil sur intval.

              Merci à vous pour vos réponse, je ne passe pas tout de suite le sujet en résolu au cas où j'aurais encore des questions.

              • Partager sur Facebook
              • Partager sur Twitter
                6 avril 2017 à 22:58:13

                Bonsoir,

                Je vous dérange encore avec mes problème. Je cherche toujours a faire mes vérifications d'URL, sur vos conseil j'essaie d'utiliser "filter_input", j'ai lu le cours "Les filtres en PHP pour valider les données utilisateur" mais mon code me pose des problèmes et je ne sais pas ou je me plante.

                Le souci viens quand j'affiche la page pour la première fois car je n'ai pas la variable 'page' dans mon URL.

                En revanche quand je clique sur une des pages et que le paramètre est dans l'URL les contrôles fonctionnent, si je rentre des caractère au lieu d'un numéro de page, il m'affiche la page damandé.

                <!DOCTYPE html>
                <html lang="fr">
                    <head>
                
                        <meta charset="utf-8" />
                        <link rel="stylesheet" type="text/css" href="style.css" />
                        <!--[if lte IE 7]><link rel="stylesheet" href="style_ie.css" /><![endif]-->
                        <title>mon premier blog</title>
                
                    </head>
                
                    <body>
                
                    	<h1>Mon Premier Blog !</h1>><br />
                        <a href="billet2.php"><input type="button" value="Rafraichir" id="refresh" /></a><br />
                            
                    	<?php
                
                			// ---------- Étape 1 -----------
                            // Connexion à la base de données
                            // ------------------------------
                
                			try
                			{
                				$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                			}
                			catch(Exception $e)
                			{
                				die('Erreur : '.$e->getMessage());
                			}
                
                            // ------------------ Étape 2 --------------------
                            // On créer les liens pour chaque pages à afficher
                            // -----------------------------------------------
                
                			// On met dans une variable le nombre de messages que l'on veut afficher par page
                            $billetsPage = 3;
                
                            // On récupère le nombre total de billets
                            $reponse = $bdd->query('SELECT COUNT(*) AS totalBillets FROM billets ') /* affiche l'erreur si c'est le cas */ or die(print_r($bdd->errorInfo()));
                            $donnees = $reponse->fetch();
                            $totalBillets = $donnees['totalBillets'];
                
                            // Termine le traitement de la requête
                            $reponse->closeCursor();
                
                            // On calcule le nombre de pages à créer
                            $totalPage  = ceil ($totalBillets / $billetsPage);
                
                            $pageAffich = $_GET['page'];
                
                            $i = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
                            if($pageAffich === null)
                            {
                                echo ' <a href="billet2.php?page='.$pageAffich.'">'.$pageAffich.'</a> ';
                            }
                            elseif ($pageAffich !== false && $pageAffich > $totalPage) 
                            {
                                $pageAffich = $totalPage;
                            }
                            elseif ($pageAffich !== false && $pageAffich < $totalPage) 
                            {
                                $pageAffich = 1;
                            }
                            else
                            {
                                echo ' <a href="billet2.php?page='.$i.'">'.$i.'</a> ';
                            }
                
                            // On calcul le premier message à afficher
                            $premierBillet = ($pageAffich - 1) * $billetsPage;
                
                            for($i = 1; $i <= $totalPage; $i++)
                            {
                                //Si il s'agit de la page actuelle
                                if($i == $pageAffich)
                                {
                                    echo ' ['.$i.'] '; 
                                }  
                                else
                                    {
                                         echo ' <a href="billet2.php?page='.$i.'">'.$i.'</a> ';
                                    }
                                
                            }
                            // Termine le traitement de la requète
                            $reponse->closeCursor();
                            
                                // Récupération des 3 derniers billets
                                $reponse = $bdd->query('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets ORDER BY date_creation DESC LIMIT '.$premierBillet.','.$billetsPage.'');
                
                                // Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
                                while ($donnees = $reponse->fetch())
                                {
                                    ?>
                                    <div class="news">
                                        <h3>
                                            <?php echo htmlspecialchars($donnees['titre']); ?>
                                            <em>posté le <?php echo $donnees['date_creation_fr']; ?></em>
                                        </h3>
                                        
                                        <p>
                                            <?php
                                            // On affiche le contenu du billet
                                            echo nl2br(htmlspecialchars($donnees['contenu']));
                                            ?>
                                            <br />
                                            <em><a href="commentaires.php?billet=<?php echo $donnees['id']; ?>">Commentaires</a></em>
                                        </p>
                                    </div>
                                    <br />
                                    <?php
                                }
                            
                           
                                
                        ?>           
                    </body>
                </html>

                Voila l'erreur que ça me donne :

                Notice: Undefined index: page in /Users/Mushi/PHP_mySQL/TP_php/TP3_monBlog/2017_04_mon_blog/billet2.php on line 51
                1 2 3
                Fatal error: Uncaught PDOException: 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 '-3,3' at line 1 in /Users/Mushi/PHP_mySQL/TP_php/TP3_monBlog/2017_04_mon_blog/billet2.php:91 Stack trace: #0 /Users/Mushi/PHP_mySQL/TP_php/TP3_monBlog/2017_04_mon_blog/billet2.php(91): PDO->query('SELECT id, titr...') #1 {main} thrown in /Users/Mushi/PHP_mySQL/TP_php/TP3_monBlog/2017_04_mon_blog/billet2.php on line 91

                • Partager sur Facebook
                • Partager sur Twitter
                  6 avril 2017 à 23:49:08

                  Fait une vérification si tu as 'page' dans ton url ? ;)

                  if(isset($_GET['page']))



                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 avril 2017 à 2:05:19

                    Bonsoir et merci pour ta réponse.

                    Je pense que j'avance, mais je bloque encore sur certains points. j'arrive maintenant à afficher la première page dès la première ouverture, quand je suis par exemple sur la page 3 et que je remplace le 3 par une lettre j'affiche la page défini dans le code. Le problème maintenant c'est que sur mes quatre page "dans mon cas" il m'affiche les mêmes billets sur chacune sauf sur la dernière.

                            // On calcule le nombre de pages à créer
                            $totalPage  = ceil ($totalBillets / $billetsPage);
                    		
                            // On vérifie que $_GET['page']	est bien un nombre entier
                            $pageAffich = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
                            
                            // On vérifie qu $_GET['page'] existe   
                            if(isset($_GET['page']))
                            {
                                // Si égal à FALSE j'affiche la dernère page 
                                if($pageAffich === false)
                                {
                                    $pageAffich = $totalPage;
                                }
                                // Si différent de FALSE et plus grand que $totalPage j'affiche la dernière page
                                elseif ($pageAffich !== false && $pageAffich > $totalPage) 
                                {
                                    $pageAffich = $totalPage;
                                }
                                // Si différent de FALSE et plus petit que la première pae j'affiche la prmière page
                                elseif ($pageAffich !== false && $pageAffich < $totalPage) 
                                {
                                    $pageAffich = 1;
                                } 
                            }
                            // Sinon j'affiche la première page
                            else
                            {
                                $pageAffich = 1;
                            }
                                
                            // On calcul le premier message à afficher
                            $premierBillet = ($pageAffich - 1) * $billetsPage;
                    
                            for($i = 1; $i <= $totalPage; $i++)
                            {
                                //Si il s'agit de la page actuelle
                                if($i == $pageAffich)
                                {
                                    echo ' ['.$i.'] '; 
                                }  
                                else
                                    {
                                         echo ' <a href="billet2.php?page='.$i.'">'.$i.'</a> ';
                                    }
                                
                            }
                            // Termine le traitement de la requète
                            $reponse->closeCursor();

                    Je dois certainement mal utiliser quelque chose, mais avec mon petit niveau je ne vois pas quoi.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 avril 2017 à 0:16:15

                      Bonsoir,

                      Après je ne sais pas combien de jours de prise de tête, d'envie de tout jeter par la fenêtre, j'ai fini par avoir un code qui fonctionne. Je test la présence de la variable $_GET['page'] et ce qu'elle contient. Quelle n'existe pas (quand on affiche la page pour la première fois), que la valeur soit < à 0 ou > à $totalPage ou bien encore que la valeur soit une chaine de caractère, J'affiche la première page.

                      J'aurais juste besoin de votre avis, pour savoir si c'est corect ou si on peut faire autrement.

                      if(isset($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $totalPage)
                                  {
                                      $pageAffich = intval($_GET['page']);
                                  }
                                  else
                                  {
                                      $pageAffich = 1;
                                  }



                      • Partager sur Facebook
                      • Partager sur Twitter

                      TP minichat amélioration

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown