Pagination et redirection get

Avatar du membre
Eléphanteau du PHP | 36 Messages

04 févr. 2023, 13:40

Bonjour,

Je savais pas trop quel titre mettre mais en gros j'ai ma pagination qui fonctionne bien cela dit je me heurte a un soucis.

imaginons que mon Perpage atteint sa limite on va dire que je veut 4 pages, lors d'une réponse sur mes topic view j'ai déjà mes 4 page et donc la création d'une réponse va forcément créer une nouvelle page jusque ici je redirige vers la page en get que je peut facilement la récupéré, mais la page qui n'existe pas encore ici la page 5 comment puis-je la récupéré pour rediriger a la fin de ma requête ?

Merci bonne journée.

Mammouth du PHP | 2703 Messages

04 févr. 2023, 13:48

pour aller à la page 4, il y a 4 dans l'url. pour aller à la page 5, il y a 5 dans l'url.

Avatar du membre
Mammouth du PHP | 1564 Messages

04 févr. 2023, 20:31

Dans la vérification du nombre de page (lors du traitement de ta pagination en PHP) tu vérifie l'entrée utilisateur, si GET > 4 alors qu'il ya que 4 pages, tu affiche 4 , tu n'autorise pas > 4.

Normalement, si tu traite bien ta pagination en PHP, tu ne devrait pas afficher de lien vers la 5 si ta que 4 pages.
Si tu traite bien, il est quand même bien de TOUJOURS vérifier l'entrée de l'utilisateur et se préparer à plusieurs éventualités, ici la possibilité qu'un utilisateur entre manuellement une page qui va trop loin ou ya aussi la possibilité qu'une page soit indexée (page=5 ou >) sur internet qui serait plus d'actualité car le nombre d'article a diminué depuis ;)

Avatar du membre
Eléphanteau du PHP | 36 Messages

06 févr. 2023, 11:25

Bonjour,

Je pense pas que vous ayez bien compris surement parce que j'ai mal expliquer, je ne parle pas d'un utilisateur qui entrerais une page qui n'existe pas puisse que je le redirige toujours avec une 301 je vérifie si la page est bien un nombre positive et si c'est un int et qu'elle existe bien, je n'ai pas de problème avec ça.

Là je parle au moment de la création d'une réponse qui va incrémenté mon nombre de page total
$pages = ceil($Count/$PerPage);
donc rajouté une page qui n'existais pas avant cette réponse, je cherche a redirigé l'utilisateur vers la page en court soit vers la page nouvellement créer a l'instant de la réponse.

Si j'avais 4 page avant cette réponse forcement j'aurais 5 pages après cette réponse puisse que $perpage a atteint sa limite.

On parle d'un futur probable !

Avatar du membre
Mammouth du PHP | 1564 Messages

06 févr. 2023, 11:51

donc rajouté une page qui n'existais pas avant cette réponse, je cherche a redirigé l'utilisateur vers la page en court soit vers la page nouvellement créer a l'instant de la réponse.
Si je comprends bien, pendant la lecture de l'utilisateur sur la dernière page, il se peut qu'il y ai un nouveau post ?

"je cherche a redirigé l'utilisateur vers la page en court soit vers la page nouvellement créer a l'instant de la réponse."

Tu as la solution d'afficher les nouvelles réponses en AJAX, tu peux aussi mettre un bouton "recharger la page pour vérifier les nouvelles réponses"

Avatar du membre
Mammouth du PHP | 1609 Messages

06 févr. 2023, 13:19

Salut, comment fonctionne la redirection ? il doit bien y avoir le numéro de page dedans non ? il suffirait donc de mettre le bon numéro non ?
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 36 Messages

09 févr. 2023, 13:19

Bonjour,

Je ne pense pas qu'il y ai besoin de l'ajax juste une condition php qui va calculé la dernière insertion en bdd ce qu'il faut comprend c'est que je redirige en fonction de get page si j'ai une page en get, mais ce get sera supérieur a la page en court si j'ai une réponse qui incrémente mon nombre de page total a afficher et je sais pas comment calculé ça !

Voici ma pagination fonctionne avec altoRouter les global son temporaire.

Code : Tout sélectionner

<?php namespace App; class URL{ public static function getInt(string $name, ?int $default = null): ?int { global $router, $match; if(!isset($_GET[$name])) return $default; if($_GET[$name] === '0') return 0; if(!filter_var($_GET[$name], FILTER_VALIDATE_INT)) { if(isset($match['params']) && $match['params'] != null){ if(isset($match['params']['slug']) && $match['params']['slug'] != null){ header('Location:' . $router->generate($match['name'], ['slug' => $match['params']['slug'], 'id' => $match['params']['id']])); }else{ header('Location:' . $router->generate($match['name'], ['id' => $match['params']['id']])); } }else{ header('Location:' . $router->generate($match['name'])); } setFlash("Le paramètre $name dans l'url n'est pas un entier",'orange'); http_response_code(301); exit(); } return (int)$_GET[$name]; } public static function getPositiveInt(string $name, ?int $default = null): ?int { global $router,$match; $param = self::getInt($name, $default); if($param !== null && $param <= 0){ if(isset($match['params']) && $match['params'] != null){ if(isset($match['params']['slug']) && $match['params']['slug'] != null){ header('Location:' . $router->generate($match['name'], ['slug' => $match['params']['slug'], 'id' => $match['params']['id']])); }else{ header('Location:' . $router->generate($match['name'], ['id' => $match['params']['id']])); } }else{ header('Location:' . $router->generate($match['name'])); } setFlash("Le paramètre $name dans l'url n'est pas un entier positif",'orange'); http_response_code(301); exit(); } return $param; } }
page viewtopic

Code : Tout sélectionner

if(isset($_GET['page']) && $_GET['page'] === '1'){ $uri = explode('?',$_SERVER['REQUEST_URI'])[0]; $get = $_GET; unset($get['page']); $query = http_build_query($get); if(!empty($query)){ $uri = $uri . '?' . $query; } header('Location:' . $uri); http_response_code(301); exit(); } /******** * pagination *********/ use App\URL; $PerPage = (int) $GetParams->GetParam(2); $CurrentPage = URL::getPositiveInt('page', 1); $smtp = $db->prepare('SELECT COUNT(id) FROM f_topics_reponse WHERE f_topic_id = ?'); $smtp->execute([intval($params['id'])]); $Count = (int)$smtp->fetch(PDO::FETCH_NUM)[0]; $pages = ceil($Count/$PerPage); //on vérifie si la page existe bien sinon on redirige si on a pas de réponse if($CurrentPage > $pages && $CurrentPage > 1) { setflash("Ce numéro de page n'hexiste pas","orange"); header('Location:' . $router->generate($match['name'], ['id' => $params['id']])); http_response_code(301); exit(); } $offset = $PerPage * ($CurrentPage - 1); //ici ma requête select from reponse ORDER BY f_topic_rep_date ASC LIMIT $PerPage OFFSET $offset");
C'est ici que je dois prendre en compte la futur page

Code : Tout sélectionner

$db->prepare("INSERT INTO f_topics_reponse SET f_user_id = ?, f_rep_name = ?, f_topic_reponse = ?, f_topic_id = ?, f_topic_rep_date = NOW()")->execute($i); setFlash("Votre réponse a bien étais poster"); redirect($router->generate('viewtopic',['id' => $params['id'] . '?page=' . $pages . '#rep-' . $db->lastInsertId()]));

Mammouth du PHP | 2703 Messages

09 févr. 2023, 14:18

il faut que le insert soit traité avant le select, et alors, rien de spécial à faire.

Avatar du membre
Eléphanteau du PHP | 36 Messages

14 févr. 2023, 02:12

Bonsoir,

je parle d'une condition a la fin de l'insert je dois redirigé vers la bonne page
var_dump('nombre max de page ' . $PerPage,'page en cour ' . $CurrentPage, 'nombre de pages total '.$pages,'nombre de réponse obtenue ' .$Count);

public\modules\viewtopic.php:109:string 'nombre max de page 6' (length=20)

public\modules\viewtopic.php:109:string 'page en cour 1' (length=14)

public\modules\viewtopic.php:109:string 'nombre de pages total 1' (length=23)

public\modules\viewtopic.php:109:string 'nombre de réponse obtenue 6' (length=28)
sur un topic j'ai 1 page et ma pagination s'arrête a 6 réponse max par page, au moment de la réponse je passerai a la nouvelle page donc la 2 mais au moment de la réponse elle n'existe pas puisse qu'elle se créer pendant la réponse $Count passe a 7 donc seulement là j'aurais 1 page +1 donc pendant la redirection je dois redirigé ver la 2 ieme page sauf si elle n'existe pas bien sur.

Avatar du membre
Mammouth du PHP | 1609 Messages

14 févr. 2023, 12:00

Je comprends pas trop la complexité de la chose, ça me paraît simple. Si tu sais que tu remplies x pages et que l'insertion va demander une page de plus tu as juste à rediriger vers x + 1.
Si nombre d'éléments % (modulo) max par page === 0 => total pages = total pages + 1.
Redirection.
Développeur web depuis + de 20 ans