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 -
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 :
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 !
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:
- Problème pagination PHP
- Pagination powerpoint - Guide
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Sommaire avec pagination - Guide
- Le fichier de pagination est insuffisant pour terminer cette opération ✓ - Forum Matériel & Système
2 réponses
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
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,
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,
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).
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
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
Merci pour ta réponse
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 ?
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.