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 sur pages de résultats de recherche multicritères [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Par défaut Pagination sur pages de résultats de recherche multicritères
    Bonjour,

    J’ai un problème de pagination sur une page de résultat de recherche.

    J’ai une page formulaire de recherche à remplir la page de résultat à un affichage par colonne de type fiches users avec des infos.

    Une première requête avec mysql_numrows m’affiche le nombre de fiches.

    Ensuite viens une seconde requête avec un LIMIT qui m’affiche les résultats de plusieurs tables avec mysql_fetch_assoc afin de travailler en colonne correspondantes 2 colonnes et 6 fiches

    Tout cela fonctionne très bien…

    Au moment de mettre ma requête de pagination je reprends exactement la même requête et je mets un COUNT(*) et cela ne marche pas… il ne me trouve qu’un enregistrement donc une seule page.

    J’ai tout essayé et je ne comprends pas d’où vient le problème… merci de votre aide.

    * J’ai épuré le code pour ne pas être trop chiant… j’espère que cela vous suffira

    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
     
    <?php 				
    $select02 = "SELECT coordonnes.refID,coordonnes.nom,coordonnes.prenom,coordonnes.genre,coordonnes.pays,coordonnes.ville,coordonnes.age,coordonnes.groupe,users_profils.taille,users_profils.searchingFor01,users.pseudo,users.active FROM coordonnes INNER JOIN users_profils ON coordonnes.refID=users_profils.id_users INNER JOIN users ON coordonnes.refID=users.userID WHERE users.active='1' AND coordonnes.genre='$genre_recherche' AND coordonnes.pays LIKE '%$countryLive%' AND users_profils.maritalStatus LIKE '%$maritalStatus%' AND users_profils.searchingFor01 LIKE '%$searchingFor01%' AND users_profils.searchingFor02 LIKE '%$searchingFor02%' AND users_profils.searchingFor03 LIKE '%$searchingFor03%' AND users_profils.searchingFor04 LIKE '%$searchingFor04%' AND users.pseudo LIKE '%$pseudo_rech%' AND coordonnes.age >= '$age_min' AND coordonnes.age <= '$age_max' ORDER BY coordonnes.groupe DESC "; 
    $result02 = mysql_query($select02)or die(mysql_error());
    $res02= mysql_numrows($result02);								
    ?>
     
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                          <td width="93%"><em><strong><font color="#333333" face="Verdana">
                            <?php if($res02>1){ ?>
                            <?php echo TXT_MOTEUR_RECHERCHE_TITRE2 ?>
                            <?php } else { ?>
                            <?php echo TXT_MOTEUR_RECHERCHE_TITRE ?>
                            <?php } ?>
                            &nbsp;(<?php echo $res02 ?>)</font></strong></em></td>
                          <td width="3%">&nbsp;</td>
                        </tr>
                        <tr>
                          <td>&nbsp;</td>
                          <td>&nbsp;</td>
                        </tr>
                      </table>
     
    <?php				
    // ***************************************************************************************************************
    // Numero de page (1 par défaut)
    if( isset($_GET['page']) && is_numeric($_GET['page']) )
        $page = $_GET['page'];
    else
        $page = 1;
     
    // Nombre d'infos par page
    $pagination = "$nbr_fiche_liste"; // Corresponds a 6 fiches
    // Numéro du 1er enregistrement à lire
    $limit_start = ($page - 1) * $pagination;
    //*****************************************************************************************************************					  
     
     
    //requête de recherche 
    $req ="SELECT coordonnes.refID,coordonnes.nom,coordonnes.prenom,coordonnes.genre,coordonnes.pays,coordonnes.ville,coordonnes.age,coordonnes.groupe,users_profils.taille,users_profils.searchingFor01,users.pseudo,users.active FROM coordonnes INNER JOIN users_profils ON coordonnes.refID=users_profils.id_users INNER JOIN users ON coordonnes.refID=users.userID WHERE users.active='1' AND coordonnes.genre='$genre_recherche' AND coordonnes.pays LIKE '%$countryLive%' AND users_profils.maritalStatus LIKE '%$maritalStatus%' AND users_profils.searchingFor01 LIKE '%$searchingFor01%' AND users_profils.searchingFor02 LIKE '%$searchingFor02%' AND users_profils.searchingFor03 LIKE '%$searchingFor03%' AND users_profils.searchingFor04 LIKE '%$searchingFor04%' AND users.pseudo LIKE '%$pseudo_rech%' AND coordonnes.age >= '$age_min' AND coordonnes.age <= '$age_max' ORDER BY coordonnes.groupe DESC LIMIT $limit_start, $pagination";
     
    //----------------------------------------------------------------------
     
    $result = mysql_query($req)or die(mysql_error());
     
     
    //--- Résultat ---// 
    $res = mysql_query($req);  
    while($data = mysql_fetch_assoc($res))  
    {  
     $tablo[]=$data; //--- mettre les données dans un tableau  
    }  
    $nbcol=2; //--- détermine le nombre de colonnes  
     
     
    echo '<div align=\"center\"><table align=\"center\" width="100%">';  
    $nb=count($tablo); 
    for($i=0;$i<$nb;$i++){ 
     
    //--- les valeurs que l'on souhaite afficher 
    $valeur1=$tablo[$i]['refID'];  
    $valeur2=$tablo[$i]['nom'];
    $valeur3=$tablo[$i]['pseudo'];  
    $valeur4=$tablo[$i]['pays'];    
    $valeur5=$tablo[$i]['ville'];
    $valeur6=$tablo[$i]['age'];
    $valeur7=$tablo[$i]['groupe'];
    $valeur8=$tablo[$i]['genre'];
    $valeur9=$tablo[$i]['date_profil_visite'];
     
     
    if($i%$nbcol==0) 
     
    echo '<tr height="100">';  
    echo '<td width="350" height="80" valign="top">'; 
     
     
    // ***********ICI LE RESULTAT DES FICHES
     
     
    echo'</td>';
     
    if($i%$nbcol==($nbcol-1))  
    echo '</tr>';  
     
    }  
    echo '</table></div>';  
     
    }
    //**********************************************************************************************
    // Pagination
     
    $nb_total = mysql_query("SELECT COUNT(*) AS nb_total FROM coordonnes,users_profils,users WHERE coordonnes.refID=users_profils.id_users AND coordonnes.refID=users.userID AND users.active='1' AND coordonnes.genre='$genre_recherche' AND coordonnes.pays LIKE '%$countryLive%' AND users_profils.maritalStatus LIKE '%$maritalStatus%' AND users_profils.searchingFor01 LIKE '%$searchingFor01%' AND users_profils.searchingFor02 LIKE '%$searchingFor02%' AND users_profils.searchingFor03 LIKE '%$searchingFor03%' AND users_profils.searchingFor04 LIKE '%$searchingFor04%' AND users.pseudo LIKE '%$pseudo_rech%' AND coordonnes.age >= '$age_min' AND coordonnes.age <= '$age_max'");
     
    $nb_total = mysql_fetch_array($nb_total);
    $nb_total = $nb_total['nb_total'];
     
    $nb_pages = ceil($nb_total / $pagination);
     
    ?>
                      <table width="100%" border="0" cellpadding="0" cellspacing="0">
                        <tr>
                          <td height="10" colspan="3"></td>
                        </tr>
                        <tr>
                          <td width="2%" height="25" background="../images/fond_boite01.png"></td>
                          <td width="7%" background="../images/fond_boite01.png"><strong>Page :</strong></td>
                          <td width="91%" background="../images/fond_boite01.png"><?php // Boucle sur les pages
    for ($i = 1 ; $i <= $nb_pages ; $i++) {
        if ($i == $page ) { ?>
                            <strong><font color="#666666" size="2" face="Verdana"><?php echo $i ?></font></strong>
                            <?php   } else { ?>
                            <a href="?lang=<?php echo $lang ?>&page=<?php echo $i ?>" class="lien09"><strong><font size="2" face="Verdana"><?php echo $i ?></font></strong></a>
                            <?php }} ?>
                          </td>
                        </tr>
                      </table>

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Par défaut
    Salut,

    A première vue, je ne vois pas tellement d'où peut venir le problème, si ce n'est que tu n'exécutes pas exactement la même requête (une avec des jointures, l'autre avec sélection multi-tables). Il y a cependant pas mal de trucs qui sont à améliorer et qui pourraient t'aider à débugger :

    - Préfères l'utilisation des fonctions mysqli_* à mysql_* (voire PDO)
    - Essaies d'indenter tes requêtes au même titre que ton code, ce sera beaucoup plus lisible :
    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
    $select02 = 
    "SELECT coordonnes.refID,coordonnes.nom,coordonnes.prenom,coordonnes.genre,coordonnes.pays,coordonnes.ville,coordonnes.age,coordonnes.groupe,users_profils.taille,users_profils.searchingFor01,users.pseudo,users.active 
    FROM coordonnes 
    INNER JOIN users_profils ON coordonnes.refID=users_profils.id_users 
    INNER JOIN users ON coordonnes.refID=users.userID 
    WHERE users.active='1' 
    AND coordonnes.genre='$genre_recherche' 
    AND coordonnes.pays LIKE '%$countryLive%' 
    AND users_profils.maritalStatus LIKE '%$maritalStatus%' 
    AND users_profils.searchingFor01 LIKE '%$searchingFor01%' 
    AND users_profils.searchingFor02 LIKE '%$searchingFor02%' 
    AND users_profils.searchingFor03 LIKE '%$searchingFor03%' 
    AND users_profils.searchingFor04 LIKE '%$searchingFor04%' 
    AND users.pseudo LIKE '%$pseudo_rech%' 
    AND coordonnes.age >= '$age_min' 
    AND coordonnes.age <= '$age_max' 
    ORDER BY coordonnes.groupe DESC ";

    - Pourquoi à certains moments tu fais des jointures propres (INNER JOIN), et à d'autres tu fais des sélections sur tables multiples ? Vaut mieux tout passer en jointures
    - Les résultats d'une requête, notamment quand il y a une jointure, peuvent dépendre des champs sélectionnés. Etant donné que la seule différence entre ton résultat de recherche et ta pagination c'est la clause "LIMIT", essaies de voir si en effectuant la même requête sans LIMIT pour le nombre total tu obtiens le même résultat :
    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
    $limit = " LIMIT $limit_start, $pagination";
    $reqTotal="SELECT coordonnes.refID,coordonnes.nom,coordonnes.prenom,coordonnes.genre,coordonnes.pays,coordonnes.ville,coordonnes.age,coordonnes.groupe,users_profils.taille,users_profils.searchingFor01,users.pseudo,users.active 
    FROM coordonnes 
    INNER JOIN users_profils ON coordonnes.refID=users_profils.id_users 
    INNER JOIN users ON coordonnes.refID=users.userID 
    WHERE users.active='1' 
    AND coordonnes.genre='$genre_recherche' 
    AND coordonnes.pays LIKE '%$countryLive%' 
    AND users_profils.maritalStatus LIKE '%$maritalStatus%' 
    AND users_profils.searchingFor01 LIKE '%$searchingFor01%' 
    AND users_profils.searchingFor02 LIKE '%$searchingFor02%' 
    AND users_profils.searchingFor03 LIKE '%$searchingFor03%' 
    AND users_profils.searchingFor04 LIKE '%$searchingFor04%' 
    AND users.pseudo LIKE '%$pseudo_rech%' 
    AND coordonnes.age >= '$age_min' 
    AND coordonnes.age <= '$age_max' 
    ORDER BY coordonnes.groupe DESC";
    $reqResult = $reqTotal . $limit;

    Essaies de voir sur cette piste !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/02/2014, 16h49
  2. Réponses: 2
    Dernier message: 24/11/2010, 09h40
  3. Problème résultat dans recherche multicritères
    Par MAMANHOU dans le forum IHM
    Réponses: 36
    Dernier message: 12/06/2010, 19h14
  4. Résultats de recherche google sur MA page
    Par Interface dans le forum Webmarketing
    Réponses: 1
    Dernier message: 14/01/2008, 22h35
  5. Réponses: 13
    Dernier message: 23/05/2007, 14h39

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