Problème pagination PHP

MaXDurand Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -  
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Dans mon système de recherche de noms, lorsque je suis sur ma page (www.monsite.fr/recherche) et que j'effectue une recherche les 15 premiers résultats attendus s'affichent sur www.monsite.fr/recherche et lorsque je clique sur la deuxième page j'ai www.monsite.fr/recherche?page2 il ne m'affiche rien.

Par contre si je fais la même recherche à partir de cette page numéro deux, il va m'afficher la suite des résultats à partir du 16ème résultat.

Je travail en local mais j’ai testé en ligne sur OVH et j’ai eu le même résultat. Je désespère car je ne sais pas du tout comment résoudre ce soucis.

Voici mon code PHP :

<?php
$annonceParPage = 15;
$annonceTotalesReq = $dbh->query('SELECT id_annonce FROM matable');
$annonceTotales = $annonceTotalesReq->rowCount();
$pagesTotales = ceil($annonceTotales/$annonceParPage);
if (isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $pagesTotales) {
$_GET['page'] = intval($_GET['page']);
$pageCourante = $_GET['page'];
}
else {
$pageCourante = 1;
}
$depart = ($pageCourante-1)*$annonceParPage;
if (isset($_POST['rechercher'])) {
extract($_POST);
echo '<table class="resultat_recherche">';
echo '<tr>';
echo '<th class="Pseudonyme">Members</th>';
echo '<th class="Âge">Country</th>';
echo '<th class="Sexe">Supports</th>';
echo '</tr>';
$_POST['pseudonyme'] = htmlentities($_POST['pseudonyme'], ENT_QUOTES | ENT_IGNORE, "UTF-8");
$_POST['age'] = htmlentities($_POST['age'], ENT_QUOTES | ENT_IGNORE, "UTF-8");
$_POST['sexe'] = htmlentities($_POST['sexe'], ENT_QUOTES | ENT_IGNORE, "UTF-8");
if (!empty($_POST['pseudonyme'])) { $choix[] = "pseudonyme = '$pseudonyme'";}
if (!empty($_POST['age'])) { $choix[] = "age = '$age'";}
if (!empty($_POST['sexe'])) { $choix[] = "sexe = 'sexe'";}
$critere = implode(' AND ', $choix);
$requete = ma requête préparée
echo '<tr>';
echo '<td>'.$pseudonyme.'</td><br>';
echo '<td>'.$age.'</td><br>';
echo '<td>'.$sexe.'</td><br>';
echo '</tr>';
}
echo '</table>';
// PAGINATION
for ($i=1;$i<=$pagesTotales;$i++)
if ($i == $pageCourante) {
echo $i. ' ';
}
else {
echo '<a href="?page='.$i.'" rel="nofollow noopener noreferrer" target="_blank">'.$i.'</a>';
}
?>


Le var_dump de ma requête préparée m'affiche la requête que j'execute dans PHPMyAdmin et qui m'affiche tous les résultats attendus.

D’avance un très grand merci !
A voir également:

2 réponses

elgazar Messages postés 5841 Date d'inscription   Statut Membre Dernière intervention   1 326
 
c'est le lien vers la page 2 qui n'est pas bon, cela devrait être quelque chose dans ce style
www.tonsite.fr/recherche/page/2/?s=terme

0
MaXDurand Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
sur une page de buddypress j'ai adapté le même code et ça fonctionne c'est bien ce qui m'étonne. Que verrais-tu dans la modification du code ?

Merci pour ta réponse
0
elgazar Messages postés 5841 Date d'inscription   Statut Membre Dernière intervention   1 326 > MaXDurand Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
faut déjà que je comprenne le problème
tu dis que tu ne peut pas passer de la page 1 à la page 2 dans la pagination mais que si tu tapes directement l'url de la page 2, tu accèdes aux résultats normaux
donc qu'est qui est différent entre l'url que tu tapes et celle qui s'affiche dans la pagination ?
0
MaXDurand Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
Non, quand je tape l'adresse de la page 2 il ne m'affiche rien comme si je n'avais pas fait de recherche, de la même façon que si je cliquais sur la page 2.
En revanche si je fais la même recherche alors que je suis sur la page 2 il va m'afficher la suite logique des résultats à partir du 16ème résultat.
0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Salut,

Le problème semble venir du fait que tu utilises les paramètres POST pour stocker les critères de recherche. Cela fonctionne donc correctement lorsque les paramètres POST sont remplis, c-a-d lorsque tu valide la recherche, néanmoins en cliquant ensuite sur le lien vers la page2, les paramètres POST sont alors vide (normal puisqu'il n'y a pas d'envoi de formulaire).

Une solution possible est d'enregistrer les critères de recherche dans des variables de session PHP puis d'utiliser ces variables de session pour effectuer la requête sql. Puisque les variables de session sont conservés entre les pages, la page 2 affichera alors correctement les résultats avec les critères validé lors de la validation du formulaire sur la page 1.

Bonne journée,
0
MaXDurand Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup pour cette solution. En revanche aurais-tu un exemple de code car si je comprends tout à fait le concept, sur la pratique je sèche un peu :)
0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Il faut commencer par ouvrir la session php avec l'instruction session_start() pour pouvoir utiliser les variables de session.
Ensuite à la soumission du formulaire (donc lorsque $_POST['rechercher'] est définie, isSet), on enregistre les critères de recherches passés en post en session.
Enfin, que le formulaire soit envoyé ou non (donc en dehors de la condition
"if (isset($_POST['rechercher']))", on construit la requête préparée à partir des critères en session).

session_start();

if (isset($_POST['rechercher'])) {
    // extract($_POST);
    $_SESSION['pseudonyme'] = $_POST['pseudonyme'];
    $_SESSION['age'] = $_POST['age'];
    $_SESSION['sexe'] = $_POST['sexe'];
}

// construction de la requête préparée
if (!empty($_SESSION['pseudonyme'])) { $choix[] = "pseudonyme = '$pseudonyme'";}
if (!empty($_SESSION['age'])) { $choix[] = "age = '$age'";}
if (!empty($_SESSION['sexe'])) { $choix[] = "sexe = 'sexe'";}
$critere = implode(' AND ', $choix);
$requete = ma requête préparée


Petites remarques complémentaires :
- évite l'utilisation de la fonction extract() qui peut être dangereuse, récupère directement les paramètres attendus
- htmlentities() devrait être utilisée uniquement lors de l'affichage des données dans le document html, pas avant l'utilisation des données dans une requête sql
- attention aux injections sql, puisque tu utilises PDO, tu devrais utiliser une requête préparée avec des marqueurs ou la méthode PDO::quote() pour éviter les injections sql
0