PHP-MySQL : Afficher Résultats avec Moteur Recherche

Eléphanteau du PHP | 16 Messages

31 mars 2007, 12:11

Bonjour !

Je suis en train de créer un moteur de recherche sur un site, et je voudrais afficher les résultats de la requête en faisant apparaître un lien vers la prochaine page s'il y a plus de 10 résultats.
Tout fonctionne ou presque...

La requête s'effectue bel et bien en fonction du critère entré par l'utilisateur, les résultats apparaissent, mais s'il y a plus de 10 résultats, le lien vers la prochaine page ne figure pas.

Sans doute mon erreur provient-elle de la manière dont je m'y prends pour calculer s'il faut afficher une autre page.
A moins que je ne m'abuse, tel que je code, $totalRows ne saura jamais plus grand que $nextLimit. C'est là que je bloque.

Voici quelques parties de mon script:

Code : Tout sélectionner

// Defines query $select = "SELECT * FROM objects WHERE name LIKE '%".$recherche."%' OR description LIKE '%".$recherche."%' OR country LIKE '%".$recherche."%' ORDER BY name ASC LIMIT ".$limit.",".$results_pg; // Runs query $result = mysql_query($select, $connect) or die ("Erreur : ".mysql_error()); // Counts total records in query $row = mysql_num_rows($result); $totalRows = $row[0]; // Recalculates $limit to know if other results to display $nextLimit = $limit + $results_pg; $prevLimit = $limit - $results_pg; // Displays link to previous page if necessary if($limit != 0) { echo '<a href="'.$pgName.'?limit='.$prevLimit.'"><<&nbsp;&nbsp; Page précédente</a>'; } // Displays link to next page if necessary if($nextLimit < $totalRows) { echo '<a href="'.$pgName.'?limit='.$nextLimit.'">Page Suivante &nbsp;&nbsp;>></a>'; } ?>
Merci vivement de votre aide !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

31 mars 2007, 14:14

Dans la mesure ou ta requête ne te ramenes que $results_pg enregistrements, tu peux difficilement savoir s'il y a d'autres enregistrements ou pas dans ta base.
Si tu trouves effectivement moins de $results_pg résultats, tu peux effectivement savoir qu'il n'y en aura plus après, mais si tu tombes sur $results_pg impossible de savoir s'il y en a encore après ou pas.

Ton $totalRows devrait contenir le nombre total d'enregistrement correspondant à ta recherche (SELECT COUNT(*)) te permettant de savoir s'il y aura d'autres résultats.

Ceci dit, pour éviter de rejouer ta requête qui doit déjà être assez gourmande comme ça, il te suffit de ramener un enregistrement de plus dans le LIMIT : LIMIT ".$limit.",". ($results_pg+1);

Ainsi, tu ne joueras ta requête qu'une fois, et si le nombre d'enregistements retournés est supérieur à $results_pg, alors il te suffit de ne pas afficher le dernier (suffit d'un compteur) et de proposer le lien page suivante :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

31 mars 2007, 15:56

Ton $totalRows devrait contenir le nombre total d'enregistrement correspondant à ta recherche (SELECT COUNT(*)) te permettant de savoir s'il y aura d'autres résultats.
Est-il possible de faire une telle chose sur le résultat d'une requête , car il ne s'agit pas ici de questionner une base de données ?

Eléphant du PHP | 170 Messages

31 mars 2007, 18:16

Il y a des dizaines de tutos sur le net avec les méthodes d'un affichage page par page.
Je ne sais pas s'il y en a un sur ce site, c'est possible, faudrait vérifier !
Par contre, j'en connais un là, fait pour les débutants :
Affichage page par page
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

Mammouth du PHP | 19672 Messages

31 mars 2007, 21:09

Hum hum... Affichage page par page :-*

Faire un petit tour de la FAQ, ça nous donnerait des raisons de continuer à l'alimenter :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 16 Messages

31 mars 2007, 22:07

Merci pour vos conseils, mais mon pb ne consiste pas en un simple affichage page par page. Cela je parviens à le réaliser.

Il s'agit d'effectuer une requête, et à partir de cette requête faire un affichage sur plusieurs pages.

Autrement dit, une première requête est effectuée sur le mot qu'un utilisateur entre dans la zone de recherche. Jusque-la aucun pb.
Ensuite, les résultats doivent être affichés. Encore la, tout baigne.
Mais s'il y a plus de 10 résultats à afficher, le lien "suivant" ne s'affiche pas.

Il ne s'agit donc pas de questionner directement les données d'une bdd et de les afficher sur plusieurs pages, mais de travailler à partir d'une requête préalablement effectuée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 avr. 2007, 10:52

Ben disons que par habitude, on laisse justement faire la base pour la pagination, vu que grace à la fonction LIMIT de MySQL on peut le faire très simplement.

Si effectivement tu souhaites n'exécuter ta requête qu'une seule fois pour ramener tous les enregistrements et gérer la pagination en php (en gardant le résultat en session pour ne pas rejouer la requête) ou en javascript (pour ne pas recharger la page quand on clique sur suivant/précédent) tu peux effectivement le faire. Il te suffit dans ce cas tout simplement de ne pas utiliser la fonction LIMIT dans ta requête pour que celle-ci te retourne tous les enregistrements correspondant à la recherche, sans limite.
mysql_num_rows() te donnera ainsi le nombre total de résultats trouvés et tu n'auras plus qu'à te débrouiller en js ou php pour n'afficher que les lignes de la "page" demandées :)

si tu restes sur le LIMIT, il suffit de faire un SELECT COUNT(*) pour connaitre le nombre d'enregistrements correspondants, cf. la FAQ :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 804 Messages

01 avr. 2007, 12:38

Salut,

Et pour une telle complication ? tu cherche à optimiser ?