Fermer la notification
Kosminea est un site communautaire de partage et d'échanges autour de nombreux sujets.
En vous inscrivant, vous pourrez participer aux discussions, personnaliser votre profil, naviguer sans publicité, et proposer vos propres fiches pour partager vos centres d'intérêt.
Fermer la notification
Pour vous permettre de profiter au mieux de Kosminea, nous utilisons des cookies. En navigant sur ce site, vous en acceptez l'usage.
Pour plus d'infos, cliquez ici.

Informatique [Dev.web] La pagination.

Discussion dans 'Technologies de l'Information & Communication' démarrée par Pixy, 1 Juin 2012.

Publicité

  1. Pixy
    Hors-ligne

    Pixy Matière noire Sérievore Argent Fleur du Chaos

    Inscrit:
    31 Mars 2012
    Messages:
    4.602
    Bonjour,

    Je crée ce topic car j'ai un petit souci.
    En effet, actuellement, je réalise un petit site pourri qui me sert de révisions au web et au Php/Mysql.

    Ma page d'accueil affiche des news, jusque là tout va bien. Seulement à un moment donné, j'aimerai qu'il s'affiche 5 news par page. Et c'est là qu'est le problème. Comment faire ?! Pour informations, je n'utilise pas un quelconque CMS, je fais ça à "la main" car comme dit précédemment, ça me sert de révisions. Qui plus est le langage utilisé est du Php avec une BDD MySql derrière.

    Si vous ne comprenez pas, voici quelques images tirées de Kosmi en illustration.

    Dès que ma table news contient plus de 5 news, la 6e news ( , etc ) s'affiche en page 2 ( , etc )
    pagination.png

    En conséquence, l'url donne ça :
    url.png


    Voila et donc je n'arrive pas à faire ça.

    J'ai parcouru pas mal de forums, de site et j'en ai trouvé un qui aurait presque fait mon bonheur. En effet, la personne donne un code pour réalisation une pagination mais je la trouve foireuse notamment par rapport à l'url malgré qu'elle fonctionne.
     
  2.  
  3. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    Pour connaître le nombre de pages, la requete SQL doit ressembler à ça :
    PHP:
    $result mysql_query("SELECT COUNT(*) FROM news;") or die (mysql_error());
    $row mysql_fetch_row($result);
    $nb_news $row[0];
    $nb_pages cell($nb_news $nb_news_par_page);
    A partir de ça tu pourras déjà construire ta pagination (selon le nombre de news affichées par page).

    Pour savoir quelle page est sélectionnée, il faut récupérer la variable "page" depuis les paramètres URL :
    PHP:
    $page $_GET["page"];
    Une fois que tu as la page, la requête SQL devrait avoir cette tête :
    PHP:
    $result mysql_query("SELECT * FROM news 
                    WHERE news.news_id < (
    $page*$nb_news_par_page
                    LIMIT 
    $nb_news_par_page
                    ORDER BY news.date DESC"
    ) or die (mysql_error());
    ... ou quelque chose qui ressemble, je ne connais pas la structure de tes tables.
     
  4. Dareen
    Hors-ligne

    Dareen Nébuleuse Mister Kosminea

    Inscrit:
    1 Mars 2012
    Messages:
    2.744
    Manon était plus rapide, je vais quand même poster ma solution écrite à l'arrache :

    Manon je n'ai pas compris ton :
    Code:
     WHERE news.news_id < ($page*$nb_news_par_page) 
    Quel rapport entre l'id et les pages ? C'est pas un peu casse gueule comme code ?
     
  5. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    Ooooh que si, mais comme je ne connais pas son modèle de données, j'intuite un peu rapidement. De même, il faut penser à utiliser htmlspecialchars() pour éviter les injections SQL.

    Mais pour l'exemple, si on veut les 5 news de la 3ème page, on peut penser qu'il faut sélectionner à partir de l'id (3*5)=15 les 5 précédentes (ou l'id 2*5=10 les 5 suivantes).
    Ta requête est plus propre assurément.

    J'ai édité, j'avais oublié le DESC.
     
  6. Pixy
    Hors-ligne

    Pixy Matière noire Sérievore Argent Fleur du Chaos

    Inscrit:
    31 Mars 2012
    Messages:
    4.602
    Merci déjà pour vos réponses.

    @ManOn : Pour la toute première requête, je n'ai eu aucun souci pour la trouver déjà à l'origine. Disons que ce n'est pas le plus compliqué dans l'affaire. Pour $page = $_GET['page'] je ne peux le récupérer qu'à partir du moment où je passe en page 2.

    @Dareen : Concernant le LIMIT des requêtes SQL je sais qu'il faut l'utiliser mais tu as souligné le problème. Lui faire comprendre que j'affiche de 0 à 4 puis en page 2 de 5 à x.

    Par contre pas totalement suivi ton calcul.

    Je crois que je ne vais pas m'en sortir XD
     
  7. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    Tu peux tester si tu le récupères ou non avec la fonction isset(). Et forcément, s'il n'est pas récupéré, c'est que tu est en page 1 ;)
    PHP:
    if (!isset($_GET['page'])
    {
        
    $page 1;
    }
    Pour "LIMIT", il faut lui indiquer deux éléments : un nombre de lignes, et un point de départ.
    Cet exemple issu de la doc MySql :
    PHP:
    "SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15"
    récupère les 10 news à partir de la 5ème ligne, soit les news 6 à 15 comme indiqué en commentaire.
     
  8. Dareen
    Hors-ligne

    Dareen Nébuleuse Mister Kosminea

    Inscrit:
    1 Mars 2012
    Messages:
    2.744
    C'est un sujet plus complexe que ça, j'ai réussi à hacker mes propres sites pourtant sécurisés avec ces fonctions de base. C'est un tout autre sujet et ça pourrait être intéressant d'en parler sur le forum un de ces jours. (n'embrouillons pas pixy qui souhait seulement apprendre le codage de base ^^)

    Ne dis pas ça, tu manques simplement d'entrainement. Plus tu codes plus tu auras des facilités. Regarde on est là pour t'aider ;)
    Je t'encourage à préparer ton système calmement. Réfléchis bien à l'algorythme, inspire toi de notre code et nos conseils, décompose bien les différentes étapes de la création de la pagination.

    Essaye d'écrire quelque chose même si c'est à moitié faux, on n'écrit jamais un petit système sans quelques difficultés ;)
     
  9. Pixy
    Hors-ligne

    Pixy Matière noire Sérievore Argent Fleur du Chaos

    Inscrit:
    31 Mars 2012
    Messages:
    4.602
    Bon, j'ai écris ça :

    PHP:
    function debut(){
                        if (!isset(
    $_GET['page']))
                        {
                            
    $page 1;
                            
    $result = ($page -1) * $nb_news_par_page;
                        }
                        else
                        {
                            
    $page $_GET['page'];
                            
    $result = ($page -1) * $nb_news_par_page+1;
                        }
                            return 
    $result;
                        }
    Fonction qui permet donc de déterminer le début de la limite.
    Oui elle est un peu cacateuse mais elle semble fonctionner o:

    Après j'ai fais ma requête pour tester la limite.
    Code:
    $sql = 'SELECT * FROM news LIMIT '.debut().','.$nb_news_par_page;
    J'ai affiché toutes mes infos pour que ça ressemble à une news.
    Ca marche parfaitement, ça m'affiche 3 news sur ma page 1. Mais... Je ne gère toujours pas la pagination XD
    A partir de là, je ne vois pas comment lui "dire" que la news 6 doit passer en page 2.

    EDIT : Je viens de tester un truc.
    A la fin de mon affichage, j'ai rajouté
    HTML:
    echo '<a href="?page=2">2</a>';
    Et en fait mon code au-dessus pseudo marche. A la page 2, il m'affiche les news de 2 à 4. En gros, sur 4 news de tests que j'ai dans ma BDD, à la page 2 il m'affiche les trois dernières alors que techniquement, c'est sensé n'afficher que la 4e toute seule. Auto-déduction : Ma fonction debut() est foireuse ! A REVOIR ! :X

    Je pense que ça vient du fait qu'elle ne prends pas en compte le fait qu'il puisse y avoir moins de 3 news sur une seule page.
     
  10. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    Pour la page = 2 et nb_news_par_page = 3 (si j'ai bien compris), ta fonction debut() retourne 4.
    La requête est donc
    PHP:
    $sql "SELECT * FROM news
             LIMIT 4,3;"
    Soit en principe les enregistrements 5, 6 et 7. Attention au décalage avec le premier argument passé à LIMIT.
    Donc en théorie il y a déjà un souci. Mais comme j'ai l'impression que tu t'es emmêlée les pinceaux dans ton message sur quelles news sont affichées ou non (news 6 ? 4 news ?), je ne sais pas exactement où peut être le problème.
     
  11. Pixy
    Hors-ligne

    Pixy Matière noire Sérievore Argent Fleur du Chaos

    Inscrit:
    31 Mars 2012
    Messages:
    4.602
    Dans ma BDD, pour tester l'affichage et la pagination, j'ai 4 news en tout et je veux en afficher 3 par page.
    Donc les news de 1 à 3 en page 1 et la news 4 en page 2. Au temps pour moi, le "news 6" j'ai oublié d'éditer.
     
  12. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    Alors à part cet écart dans LIMIT (tu as un +1 qui traine dans ton debut() ), ça devrait fonctionner... Un souci au parcours du résultat dans ton script PHP peut-être ?
     
  13. Pixy
    Hors-ligne

    Pixy Matière noire Sérievore Argent Fleur du Chaos

    Inscrit:
    31 Mars 2012
    Messages:
    4.602
    Il semblerait que ça provienne de la deuxième partie de la fonction. En fait, si je ne me trompe pas, elle ne récupère pas dans la variable $page, le numéro de ma page. J'ai beau être en page 2, elle reste à 0. Du coup, l'opération qui fait appelle à $page ne se fait pas correctement. Et le début de la limite reste toujours à 0.
     
  14. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    Sans ton code PHP, ce sera difficile de trouver l'erreur. Ta fonction en elle même me paraît correcte...
     
  15. Dareen
    Hors-ligne

    Dareen Nébuleuse Mister Kosminea

    Inscrit:
    1 Mars 2012
    Messages:
    2.744
    PHP:
     $page 1;
    $result = ($page -1) * $nb_news_par_page;
    Ton $result sera forcement égal à 0 puisque "(1-1)*3 = 0". Pas la peine de faire ton calcul, un $result = 0; serait plus rapide :)

    Mais ne va pas trop vite !
    A propos de ta fonction elle ne peut pas récupérer le $nb_news_par_page puisqu'il n'est pas défini. Il faut donc que tu passes des paramètres. Tu te retrouves alors :
    PHP:
    $nb_news_par_page 3;
    $page = (isset($_GET['page'])) ? $_GET['page'] : 1;
    $sql 'SELECT * FROM news LIMIT '.debut($page,$nb_news_par_page).','.$nb_news_par_page;

    function 
    debut($page,$nb_news_par_page){
       
    $result = ($page -1) * $nb_news_par_page+1;
       return 
    $result;
    }
    Comme ça ça devrait marcher :)

    EDIT : correction du message à propos des $_GET
     
  16. Jean-michel
    Hors-ligne

    Jean-michel Matière noire

    Inscrit:
    9 Mai 2012
    Messages:
    84
    En faite le htlmspecialchars, c'est pour contrer les faille Xss, je suis très interessé par la façon dont tu peux en créer une (pour mon boulot je précise, je vais pas pirater le site)
    Les injections c'est mysql_real_escape_string
     
  17. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    En principe $_GET est superglobale devrait pouvoir être appelée de n'importe où, non ? Anciennement ce n'était pas possible, mais si c'est bien ce qui fait flancher le script de Pixy, alors ce serait un souci avec sa version de PHP ?

    EDIT : La doc PHP dit :
     
  18. Dareen
    Hors-ligne

    Dareen Nébuleuse Mister Kosminea

    Inscrit:
    1 Mars 2012
    Messages:
    2.744
    Hum. Je viens de tester : c'est bien récupérable dans une fonction.
    Au temps pour moi, j'ai tellement l'habitude de prohiber les $_GET et $_POST dans mes fonctions que j'en suis venu à oublier ce genre de choses ;)

    Il y a toujours le problème du $nb_news_par_page qui ne doit pas marcher dans sa fonction.
     
  19. Pixy
    Hors-ligne

    Pixy Matière noire Sérievore Argent Fleur du Chaos

    Inscrit:
    31 Mars 2012
    Messages:
    4.602
    Alors.

    Dareen ma fonction que tu as réécrites marche très bien. J'ai juste eu à virer le "+1" car sinon la limite ne commençait pas à 0 mais à 1. Du coup, ça ne me prenait pas ma toute première news. Concernant le $nb_news_par_page, il marche correctement également. J'ai testé avec plusieurs valeurs et aucun problème n'est apparu.
    Voila donc il ne me reste plus qu'à faire le petit bout de code afin de créer mes liens pour les pages suivantes, je pense que pour ça je ne devrai pas rencontrer de difficultés.

    Merci pour votre aide qui m'a été très utile ! Et le code pour faire la pagination apparaît comme beaucoup plus simple par rapport à ceux sur lesquels je suis déjà tombée.

    Juste une dernière question : Comment gérer les accents et autres caractères spéciaux lors d'un SELECT ? o:
     
  20. ManOnDaMoon
    Hors-ligne

    ManOnDaMoon Matière noire Admin Kosminea Modo TIC

    Inscrit:
    2 Février 2012
    Messages:
    1.796
    Il y a plusieurs solutions.

    La plus simple c'est de travailler avec des fichiers et une base encodés en UTF-8.
    Pour la base de données, c'est une option à la création de ta base (ça ne change pas le code ou la manière d'utiliser MySQL). Tu dois pouvoir également modifier une base existante dans phpMyadmin, mais attention alors aux problèmes avec les accents déjà existants qui risquent de devenir illisibles. Si tu travailles sur une petite base de test, mieux vaut la recréer.
    Pour les fichiers PHP, tu pourras les encoder en UTF-8 dans les paramètres de ton éditeur. Même le bloc-note permet de le faire, mais l'emplacement de l'option dépend du logiciel que tu utilises.
    A partir de là, tu pourras utiliser les accents normalement dans ta base et ton code. Pense à protéger les noms dans tes requêtes avec des `backquotes` (AltGr+7 puis Espace sous Windows).

    La solution plus complexe, c'est de travailler avec des entités HTML, c'est à dire rempalcer "é" par "&eacute;", ou "è" par "&eagrave;". C'est potentiellement ingérable et illisible. Je te propose de l'oublier. ;)
     
  21. Jean-michel
    Hors-ligne

    Jean-michel Matière noire

    Inscrit:
    9 Mai 2012
    Messages:
    84
    Je rajouterai qu'à chaque fois que tu fais un SELECT UPDATE ou INSERT, tu dois mettre un mysql_query("SET NAMES UTF8"); avant (n'en mettre qu'un seul par page).
    Et bien sur mettre <meta http-equiv="Content-Type" content="text/html; charset="UTF-8"> dans ton <head>
     

Partager cette page