追記です。
わかりづらい質問をしてしまい、すみませんでした。GETのところを勘違いしていました。自己解決した部分もあるので改めました。
PHPでページング機能を実装したいです。
ユーザーが検索(POST)すると一致するレコード(投稿)を取り出して順に表示させたいです。
検索(POST)するときに、CSRF対策のトークンのチェックをしております。
ページングを実装できたのですが、2ページ目以降をクリックすると、トークンチェックで引っかかり、不正なPOST扱いになってしまいます。
ページングはGETリクエストで行っています。
トークンの設定は検索ページでhiddenで送り、検索一覧表示ページ(ページング実装したページ)の最初にトークンのチェックをしています。
なぜページングのGETリクエストがトークンチェックで引っかかってしまうのでしょうか?
教えていただけたら幸いです。
以前の質問を以下に復活させました。
PHPでページング機能を実装したいです。しかし$_GETをページ以外にも使っています。
実装したいのは、掲示板のようなものです。
(1) ユーザーが検索(POST)すると一致するレコード(投稿)を取り出して順に表示。
(2) 表示したレコードはURLになっており、詳細ページにリンクする。ここでGETリクエストを使用。
詳細ページ(detail.php)へのリンクは投稿idでGETリクエストしています。詳細ページでは再びDBにアクセスしてGETで送られたidをもとにレコードを取り出す仕組みです。
$result = $stm->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $row) { echo '<a href="detail.php ?id=',$row['id'],'">', "詳細", "</a>"; echo "<br>"; }
1ページあたり5つのレコードを表示させたいです。
以下のように実装したのですが、GETリクエストが重なるからなのか2ページ目にリンクできません。汚いコードで申し訳ないですが、コードは以下です。
$pdo = new PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); if (isset($_GET['page'])) { $page = (int)$_GET['page']; } else { $page = 1; } if ($page > 1) { $start = ($page * 5) - 5; } else { $start = 0; } //SQL文は省略します。 $sql = "ここに検索一致条件等を書いています。"; $sql.="LIMIT {$start}, 5"; $stm = $pdo->prepare($sql); $stm->execute($data); $result=$stm->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $row) { echo '<a href="detail.php ?id=',$row['id'],'">', "詳細", "</a>"; echo "<br>"; } $page_num = $pdo->prepare(" SELECT COUNT(*) id FROM table "); $page_num->execute(); $page_num = $page_num->fetchColumn(); $pagination = ceil($page_num / 5); ?> <?php for ($i=1; $i<= $pagination ; $i++):?> <a href="?page=<?php echo $i ?>"><?php echo $i; ?></a> <?php endfor; ?>
この状態だと全ページ数が、全レコードをもとに計算されたページ数になってしまいます。(検索して一致したレコード数をもとにページ数がけいさんされていない。)
詳細ページへのGETである?idとページネーションへのGETである?pageを両立するにはどうすればよいでしょうか?
また、詳細ページへのGETである?idとページネーションへのGETである?pageを両立するにはどうすればよいでしょうか?
教えていただけたら幸いです。
回答4件
あなたの回答
tips
プレビュー