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

Langage PHP Discussion :

Probleme pagination sur script recherche


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut Probleme pagination sur script recherche
    Bonjour

    Je viens vers vous car j'ai un soucis pour faire une pagination. Chaque fois que je met un code de pagination cela m'affiche plus de 5000 pages j'ai tout essayé et pas moyen d'y arriver j'essaie avec ce tuto http://antoine-herault.developpez.co...atique-en-php/ mais voila cela m'affiche trop de page

    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
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    <?php 
    mysql_connect('localhost','root','password');
    mysql_select_db('database');
    //pagination
    $messagesParPage=2; //Nous allons afficher 5 messages par page.
     
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total=mysql_query('SELECT COUNT(*) AS total FROM download'); //Nous récupérons le contenu de la requête dans $retour_total
    $donnees_total=mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
    $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);
     
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle=intval($_GET['page']);
     
         if($pageActuelle<$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
              $pageActuelle=$nombreDePages;
         }
    }
    else // Sinon
    {
         $pageActuelle=1; // La page actuelle est la n°1    
    }
     
    $premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire
    //On determine l'expression a rechercher
    if(isset($_GET['search']) && strlen($_GET['search'])>2)
    {
            $rec = mysql_real_escape_string(htmlspecialchars($_GET['search']));
     
    //On determine le type de recherche
    if(isset($_GET['type']))
    {
            if($_GET['type']=='un')//Un des mots
            {
                    $type = 1;
            }
            elseif($_GET['type']=='all')//Tout les mots
            {
                    $type = 2;
            }
            else//L'expression exacte
            {
                    $type = 3;
            }
    }
    else
    {
            $type = 1;//type par defaut: L'expression exacte
    }
    //On determine si on doit surligner les mots dans les resultats
    if(!isset($_GET['surligner']) or $_GET['surligner']!='true')
    {
            $surligner = false;
    }
    else
    {
            $surligner = true;
    }
     
    //On dertermine les identifiants, les noms et les informations des utilisateur
    $req = 'SELECT * FROM download WHERE ';
    if($type==1)
    {//ayant un des mots dans leurs informations
            $mots = explode(' ',$rec);//En separre lexpression en mots cles
            foreach($mots as $mot)
            {
                  $req .= ' keywords LIKE "%'.$mot.'%" OR (name LIKE "%'.$mot.'%") OR';
            }
            $req .= ' 1=0';
    }
    elseif($type==2)
    {//ayant tout des mots dans leurs informations
            $mots = explode(' ',$rec);//En separre lexpression en mots cles
            foreach($mots as $mot)
            {
                    $req .= ' (online = \'yes\' AND (keywords LIKE "%'.$mot.'%") OR (name LIKE "%'.$mot.'%")) AND';
            }
            $req .= ' 1=1';
    }
    else
    {//ayant l'expression exacte dans leurs informations
            //$req .= 'keywords LIKE "%'.$rec.'%"';
    		$req .= ' (online = \'yes\' AND (keywords LIKE "%'.$rec.'%") OR (name LIKE "%'.$rec.'%"))';
    }
     
    //Les utilisateur seront ranges par identifiant en ordre croissant
    $req .= '  ORDER BY adedd DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'';
    $requete = mysql_query($req);
    //Le formulaire de recherche
    ?>
    <form action="" method="get">
    Expression &agrave; rechercher: <input type="text" name="search" value="<?php echo $rec; ?>" /><br />
    Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="all"<?php if($type==2){echo 'checked="checked"';} ?> /> Tout les mots <input type="radio" name="type" value="exacte"<?php if($type==3){echo 'checked="checked"';} ?> /> Expression exacte<br />
    Mettre en gras les mots recherch&eacute;s: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br />
    <input type="submit" value="Rechercher" />
    </form>
    <h2>R&eacute;sultats</h2>
    <table>
            <tr>
                    <th>Affiche</th>
                    <th>Titre</th>
                    <th>Mots clefs</th>
            </tr>
    <?php
    echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
    for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
    {
         //On va faire notre condition
         if($i==$pageActuelle) //Si il s'agit de la page actuelle...
         {
             echo ' [ '.$i.' ] '; 
         }	
         else //Sinon...
         {
              echo ' <a href="search.php?page='.$i.'">'.$i.'</a> ';
         }
    }
    echo '</p>';
    //On affiche les resultats
    while($dnn = mysql_fetch_array($requete))
    {
    ?>
            <tr>
                    <td><?php echo '<img src="uploads/images/'.$dnn['image1'].'" alt="Help" width="100" />'; ?></td>
                    <td><?php echo $dnn['name']; ?></td>
                    <td><?php
    if($surligner)//Si il faut surligner les mots, on les surligne
    {
            if($type==3)
            {
                    echo preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['keywords']);//On surligne l'expression exacte
            }
            else
            {
                    echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['keywords']);//On surligne les mots cles de la recherche
            }
    }
    else
    {
            echo $dnn['keywords'];//On ne surligne pas
    }
    ?></td>
            </tr>
    <?php
    }
     
    ?>
    </table>
    <?php
    }else{
    ?>
    <form action="" method="get">
    Expression &agrave; rechercher: <input type="text" name="search" value="<?php echo $rec; ?>" /><br />
    Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="all"<?php if($type==2){echo 'checked="checked"';} ?> /> Tout les mots <input type="radio" name="type" value="exacte"<?php if($type==3){echo 'checked="checked"';} ?> /> Expression exacte<br />
    Mettre en gras les mots recherch&eacute;s: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br />
    <input type="submit" value="Rechercher" />
    </form>
    <?php
    }
    ?>
    Pouvez-me dire ou est le probleme?? merci de votre aide

  2. #2
    Membre du Club
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 51
    Points
    51
    Par défaut
    J'avoue n'avoir regarder que le début de ton code (la partie qui calcul le nombre de page) vu qu’apparemment c'est ça qui te pose un problème.

    Il existe une fonction pour compter le nombre de ligne d'une réponse à une requete sql: mysql_num_rows, cela devrai t'aider à compter le nombre de ligne qui se trouve dans ta table download.

    essaies avec quelque chose comme ça:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total=mysql_query("SELECT * FROM download"); //Nous récupérons le contenu de la requête dans $retour_total
    $total=mysql_num_rows($retour_total); //On compte le nombre de lignes.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);

    Mais je ne suis pas sur que cela résolve ton problème tu peux nous dire combien tu as d'enregistrement dans ta table et de combien il se trompe pour la pagination?

  3. #3
    Membre confirmé Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Points : 576
    Points
    576
    Par défaut
    bonjour,
    il faut voir d'ou vient le pb :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $messagesParPage=2; //Nous allons afficher 5 messages par page.
     
    $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);
     
    echo "Nb total : ".$total.' / Nb de page : '.$nombreDePage;
    a voir si les valeurs affichés corresponde bien a ce que tu attends....

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Tu pourra faire un echo de ta requéte a la fin pour voir quece qui donne

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par PtiteA2 Voir le message
    J'avoue n'avoir regarder que le début de ton code (la partie qui calcul le nombre de page) vu qu’apparemment c'est ça qui te pose un problème.

    Il existe une fonction pour compter le nombre de ligne d'une réponse à une requete sql: mysql_num_rows, cela devrai t'aider à compter le nombre de ligne qui se trouve dans ta table download.

    essaies avec quelque chose comme ça:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total=mysql_query("SELECT * FROM download"); //Nous récupérons le contenu de la requête dans $retour_total
    $total=mysql_num_rows($retour_total); //On compte le nombre de lignes.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);

    Mais je ne suis pas sur que cela résolve ton problème tu peux nous dire combien tu as d'enregistrement dans ta table et de combien il se trompe pour la pagination?
    Quanje fais cela j'ai cette erreur
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\web\www\search\index.php on line 138
    J'ai 11 673 entrée dans ma base j'effectue une recherche avec un nom et ce nom il y en a que 7 dans la base de donnée

    c'est bizarre et j'ai essayez plein de pagination et c'est le meme probleme d'affiche de page.

    Qu'appelez vous par faire un echo

    Je vous remercie de vos reponse

  6. #6
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Bonjour,

    déja, commence par récupérer le résultat de ta requête comme il le faut.
    mysql_fetch_assoc (comme indiqué dans la doc) retourne un tableau de résultat.

    donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $nombre_total=0;
    if($resultat= mysql_fetch_assoc($retour_total)) {
       $nombre_total= $resultat[0]['total'];
    }

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $messagesParPage=2; //Nous allons afficher 5 messages par page.
     
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total=mysql_query('SELECT COUNT(*) AS total FROM download'); //Nous récupérons le contenu de la requête dans $retour_total
    $donnees_total=mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
    $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);
    cela dit, en divisant un $total=10000 par un $messagesParPage=2, cela donne 5000

    ou je me trompe?

  8. #8
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    héhé

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ascito Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $messagesParPage=2; //Nous allons afficher 5 messages par page.
     
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total=mysql_query('SELECT COUNT(*) AS total FROM download'); //Nous récupérons le contenu de la requête dans $retour_total
    $donnees_total=mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
    $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);
    cela dit, en divisant un $total=10000 par un $messagesParPage2, cela donne 5000

    ou je me trompe?
    oui c'est sur. mais c'est un moteur de recherche interne. Donc si je fais une recherche avec un mot precis et qu'en sachant qu'il y a que 7 champs avec ce mots ma recherche donnera 7 messages avec un $messagesParPage=2 me donnera que 3 pages et non 5000 c'est cela qui ne va pas

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Donc si je fais une recherche avec un mot precis et qu'en sachant qu'il y a que 7 champs avec ce mots ma recherche donnera 7 messages
    7 champs ? Tu veux dire plutôt 7 lignes non ?
    Le nombre de lignes représente le nombre de messages non ?


    A mon avis il y a un problème dans la manière dont est conçu ce système de pagination.

    Théoriquement, il faut exécuter 2 fois cette même requête (avec les like etc ...).
    De ton coté tu récupère tout, sans aucun critère, du coup ce nombre maxi qui est à la base de la pagination est faut (trop de résultats).

    Il faudrait théoriquement :
    - Une 1ère requête qui elle n'intègrera pas de limite (pas de LIMIT 0, 10 par exemple).
    Le but étant de récupérer tout, d'avoir le nombre total de lignes (ou de messages), mais en intégrant les mêmes conditions (ou clauses), la même requête en somme.
    Ce sera grâce à ce nombre total où il sera possible de créer la pagination, et de définir les limites dans la 2ème requête.
    On pourra obtenir le nombre de page qu'il va avoir et le nombre de message par page.

    - Un 2ème requête identique à la différence que cette fois elle intègrera la limite, c'est à dire qu'on récupèrera seulement les messages selon le N° de page qu'on demande et du nombre de ligne voulus.

    Ci-dessus est donc un moyen que je dirais "classique" pour faire de la pagination.


    Cependant, MySQL intègre cette notion de pagination et offre ceci : SQL_CALC_FOUND_ROWS et FOUND_ROWS(), les 2 vont de paire.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SQL_CALC_FOUND_ROWS, champ1, champ2
    FROM table1 AS t1
    JOIN table2 AS t2 ON t1.id = t2.id
    WHERE t1.condition LIKE '%truc%'
    LIMIT 40, 20
    Puis on lance une 2ème requête pour récupérer le nombre total
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT FOUND_ROWS() AS total
    Ici, les choses sont légèrement différentes par rapport au 1er exemple plus haut.
    La 1ère c'est que cela évite de lancer 2 fois la même requête (ce qui normalement devrait être plus performant).
    Cependant, quand on lance la 1ère requête, il y a une inconnue, ça concerne le nombre de lignes que doit retourner la requête, c'est à dire le 20 dans le LIMIT.
    En mettant 20, on ne sait pas si on va avoir réellement 20 lignes ou moins.
    Mais ça n'est pas si gênant que ça.

    Grosso modo.
    On sait à l'avance le nombre de lignes maximum par page qu'il peu avoir, dans mon exemple c'est 20.
    On sait aussi à l'avance la page demandée (par défaut c'est la 1ère, soit LIMIT 0, 20).
    Donc lorsqu'on exécute la 1ère requête, et si c'est la 3ème page qui est demandée, alors on mettra : LIMIT 40, 20 (soit récupérer à partir de 40, et récupérer au maxi 20 lignes).
    Le résultat de cette 1er requête contiendra alors uniquement les messages voulus.
    A l’exécution de la 2ème requête, ceci permettra de créer la pagination car c'est à ce moment qu'on saura le nombre total de messages (sans aucune limite).
    (Si on regarde bien, ce fonctionnement est un peu l'inverse du 1er exemple).


    Il y a alors 2 manières de faire.
    A toi de voir.

  11. #11
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Bonjour,

    Tu peux très bien faire ça en 1 seule requête, bon j'avoue que je ment un peu là... en fait il s'agit de requêtes imbriquées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT c.*,t.* FROM (SELECT count(*) as total FROM aide_region) c,aide_region t LIMIT 0,20
    C'est plus portable que d'utiliser found_rows(), l'inconvénient est qu'il faut faire une petite contorsion au niveau du code pour récupérer le total...

    Bon après, en terme de perf, là je sais pas, faudrait un spécialiste mysql. Je pense néanmoins que cela doit être plus rapide que de faire 2 appels.


  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    wahou c'est du chinois tout ça.

    Oui je me suis trompé c'est 7 ligne. Mais je me pose une question est-ce que cela viendrais pas de mon script car j'en ai essayé plein de pagination et meme des classe pagination et c'est pareil

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Théoriquement, il faut exécuter 2 fois cette même requête (avec les like etc ...).
    De ton coté tu récupère tout, sans aucun critère, du coup ce nombre maxi qui est à la base de la pagination est faut (trop de résultats).

    Il faudrait théoriquement :
    - Une 1ère requête qui elle n'intègrera pas de limite (pas de LIMIT 0, 10 par exemple).
    Le but étant de récupérer tout, d'avoir le nombre total de lignes (ou de messages), mais en intégrant les mêmes conditions (ou clauses), la même requête en somme.
    Ce sera grâce à ce nombre total où il sera possible de créer la pagination, et de définir les limites dans la 2ème requête.
    On pourra obtenir le nombre de page qu'il va avoir et le nombre de message par page.

    - Un 2ème requête identique à la différence que cette fois elle intègrera la limite, c'est à dire qu'on récupèrera seulement les messages selon le N° de page qu'on demande et du nombre de ligne voulus.
    Bonsoir,

    Tout est indiqué ici McGyver59280.

    Ton code ne correspond pas à la logique de la pagination.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $retour_total=mysql_query('SELECT COUNT(*) AS total FROM download');
    Ton code ne prend pas en compte les critères de recherche utilisés par la suite.

    Autrement dit, tu as des critères qui font ta requête sql plus bas dans ton code.

    Ta requête doit être exécutée DEUX fois :
    - une fois sans les limites => pour compter le nombre total de résultats
    - une seconde fois par 'tranche', ici 2 résultats à chaque fois.

    Relis ton code et les commentaires associés !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $messagesParPage=2; //Nous allons afficher 5 messages par page.
    C'est 2 ou 5 ?


  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    J'ai mis deux pour des test autrement c'est par 5

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Bon je crois que ce script de recherche on ne peux mettre une pagination. Connaissez vous un bon moteur ou une class avec les plusieur option de recherche

    Merci a vous pour votre patience

  16. #16
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Bon je crois que ce script de recherche on ne peux mettre une pagination. Connaissez vous un bon moteur ou une class avec les plusieur option de recherche
    Si, il y a aucune raison de ne pas pourvoir le faire.

    Opte pour la 2ème solution que je t'ai mis, c'est beaucoup plus simple que tu le crois.
    Il juste procéder dans l'ordre.

    1/ On défini une variable qui contiendra le nombre maximum de ligne par page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb_lignemax_page = 20;
    Puis on défini le N° de page en court (ou demandée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $page_courante = 1;
    if (isset($_GET['page_courante']) && (int)$_GET['page_courante'] > 1) $page_courante = (int)$_GET['page_courante'];
    A ce stade on déjà définir le LIMIT qui est à la source de la pagination.
    Si la page demandée est la 3, alors : 3 x 20 = 60 (ça récupèrera à partir de cette ligne).
    Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $limit_debut = $page_courante * $nb_lignemax_page;
    Donc on peu lancer la 1ère requête. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "
    SELECT SQL_CALC_FOUND_ROWS, champ1, champ2
    FROM table1 AS t1
    JOIN table2 AS t2 ON t1.id = t2.id
    WHERE t1.condition LIKE '%truc%'
    LIMIT ".(int)$limit_debut.", 20";
    Cette requête contiendra uniquement les données de la page demandée. il y aura au maximum 20 résultats (20 lignes/20messages).
    Mais c'est un nombre maxi. Bien souvent il y a moins pour la dernière page.


    Et dans la foulée on lance la 2ème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT FOUND_ROWS() AS total_reel';
    Avec cette requête on obtiendra le nombre total réel.
    C'est avec celle ci qu'on pourra construire la pagination, c'est à dire la 1ère, les pages suivantes jusqu'à la dernière.
    Suffit des faire les divisions et compagnie (ceil, etc ...).
    Mais ça tu l'a déjà fais, donc suffit de le reprendre.

    Ou est le problème ?

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Le soucis est que je suis assez limité en connaissance php

  18. #18
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    C'est pourtant simple...

    -tu as configuré 2 messages par page
    -tu fais une requête sans aucun critère de filtre, tu obtiens environ 10000 résultats. (nous l'appellerons requête1)
    -tu fais une requête avec les critères de filtre, tu obtiens 7 résultats (nous l'appellerons requête2 )

    si tu divises le nombre de résultat obtenu par requête2 par le nombre de message par page :
    7 / 2 = 3,5 (pas pratique donc on utilise la méthode ceil() qui va nous arrondir la division au supérieur ce qui nous donne : 4 , on l'appellera nbpages)

    maintenant :

    -je veux afficher :
    "nombre de résultat / nombre total" alors :
    nb résultats requête2 / nb résultats requête1

    -je veux afficher
    "page courante / nombre de pages" alors :
    $page_actuelle / nbpages

    Voilà, c'est tout... actuellement tu obtiens 5000 pages, parce que tu t'entêtes à vouloir diviser le nombre total de lignes dans ta table (10000) par le nombre de message par page (2)...

    Ceci étant dit, tu récupères un script de pagination qui ne peut pas faire de pagination...
    Tu sollicite notre aide pour comprendre ton travail, on t'explique, et au final c'est trop compliqué, tu cherches maintenant un autre script....

    Je suis désolé de t'apprendre que tu auras sans aucun doute tout autant de problèmes avec un autre script... ce n'est pas le script qui ne fonctionne pas, c'est toi qui ne le comprends pas.

    Je ne veux pas te décourager, mais bon... ou tu fais un effort pour essayer de comprendre ce que les autres prennent du temps à t'écrire, ou tu cherches de la compétence autour de toi pour te le faire...

    Sinon pour trouver d'autres scripts, google en est gavé, tu trouveras facilement...

    J'espère que tu ne le prends pas mal et bonne continuation !...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Non je le prend pas mal. Tu as raison c'est en perseverant que l'on comprend.

    Je vais revoir mon script et faire etape par etape en suivant vos indications

    Je te remercie de ta patience

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/07/2014, 13h53
  2. [MySQL] probleme script recherche dans une table
    Par rhaamo dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/02/2007, 14h25
  3. [Scripts]recherche logiciel de capture d'image sur WMV
    Par gretch dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 20/11/2006, 11h46
  4. [vb6] probleme sur une recherche
    Par lumbroso dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 29/08/2006, 13h58
  5. Probleme lors d'une recherche sur les forums
    Par JUSTIN Loïc dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 8
    Dernier message: 27/07/2005, 12h22

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