Problème pagination PHP

Fermé
MaXDurand Messages postés 14 Date d'inscription samedi 1 octobre 2016 Statut Membre Dernière intervention 25 janvier 2017 - 3 oct. 2016 à 17:51
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 5 oct. 2016 à 09:17
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 mercredi 30 octobre 2013 Statut Membre Dernière intervention 17 mars 2021 1 322
3 oct. 2016 à 18:15
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 samedi 1 octobre 2016 Statut Membre Dernière intervention 25 janvier 2017
3 oct. 2016 à 18:36
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 mercredi 30 octobre 2013 Statut Membre Dernière intervention 17 mars 2021 1 322 > MaXDurand Messages postés 14 Date d'inscription samedi 1 octobre 2016 Statut Membre Dernière intervention 25 janvier 2017
4 oct. 2016 à 09:33
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 samedi 1 octobre 2016 Statut Membre Dernière intervention 25 janvier 2017
4 oct. 2016 à 11:44
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 lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
4 oct. 2016 à 14:11
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 samedi 1 octobre 2016 Statut Membre Dernière intervention 25 janvier 2017
4 oct. 2016 à 17:50
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 lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
5 oct. 2016 à 09:17
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