teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

追記

2017/09/20 07:14

投稿

gsuisk
gsuisk

スコア72

title CHANGED
File without changes
body CHANGED
@@ -17,4 +17,64 @@
17
17
 
18
18
  なぜページングのGETリクエストがトークンチェックで引っかかってしまうのでしょうか?
19
19
 
20
+ 教えていただけたら幸いです。
21
+
22
+
23
+
24
+
25
+ 以前の質問を以下に復活させました。
26
+
27
+ PHPでページング機能を実装したいです。しかし$_GETをページ以外にも使っています。
28
+ 実装したいのは、掲示板のようなものです。
29
+ (1) ユーザーが検索(POST)すると一致するレコード(投稿)を取り出して順に表示。
30
+ (2) 表示したレコードはURLになっており、詳細ページにリンクする。ここでGETリクエストを使用。
31
+ 詳細ページ(detail.php)へのリンクは投稿idでGETリクエストしています。詳細ページでは再びDBにアクセスしてGETで送られたidをもとにレコードを取り出す仕組みです。
32
+ ```
33
+ $result = $stm->fetchAll(PDO::FETCH_ASSOC);
34
+ foreach ($result as $row) {
35
+ echo '<a href="detail.php ?id=',$row['id'],'">', "詳細", "</a>";
36
+ echo "<br>";
37
+ }
38
+ ```
39
+ 1ページあたり5つのレコードを表示させたいです。
40
+ 以下のように実装したのですが、GETリクエストが重なるからなのか2ページ目にリンクできません。汚いコードで申し訳ないですが、コードは以下です。
41
+ ```
42
+ $pdo = new PDO($dsn, $user, $password);
43
+ $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
44
+ if (isset($_GET['page'])) {
45
+ $page = (int)$_GET['page'];
46
+ } else {
47
+ $page = 1;
48
+ }
49
+ if ($page > 1) {
50
+ $start = ($page * 5) - 5;
51
+ } else {
52
+ $start = 0;
53
+ }
54
+
55
+ //SQL文は省略します。
56
+ $sql = "ここに検索一致条件等を書いています。";
57
+ $sql.="LIMIT {$start}, 5";
58
+ $stm = $pdo->prepare($sql);
59
+ $stm->execute($data);
60
+ $result=$stm->fetchAll(PDO::FETCH_ASSOC);
61
+ foreach ($result as $row) {
62
+ echo '<a href="detail.php ?id=',$row['id'],'">', "詳細", "</a>";
63
+ echo "<br>";
64
+ }
65
+ $page_num = $pdo->prepare("
66
+ SELECT COUNT(*) id
67
+ FROM table
68
+ ");
69
+ $page_num->execute();
70
+ $page_num = $page_num->fetchColumn();
71
+ $pagination = ceil($page_num / 5);
72
+ ?>
73
+ <?php for ($i=1; $i<= $pagination ; $i++):?>
74
+ <a href="?page=<?php echo $i ?>"><?php echo $i; ?></a>
75
+ <?php endfor; ?>
76
+ ```
77
+ この状態だと全ページ数が、全レコードをもとに計算されたページ数になってしまいます。(検索して一致したレコード数をもとにページ数がけいさんされていない。)
78
+ 詳細ページへのGETである?idとページネーションへのGETである?pageを両立するにはどうすればよいでしょうか?
79
+ また、詳細ページへのGETである?idとページネーションへのGETである?pageを両立するにはどうすればよいでしょうか?
20
80
  教えていただけたら幸いです。

3

質問の改善

2017/09/20 07:14

投稿

gsuisk
gsuisk

スコア72

title CHANGED
@@ -1,1 +1,1 @@
1
- $_GETを使ったページング機能
1
+ PHPでのページング機能とCSRF
body CHANGED
@@ -1,82 +1,20 @@
1
- PHPページング機能を実装したいです。しかし$_GETをページ以外にも使っています。
1
+ 追記です。
2
2
 
3
- 実装のは掲示板ようなもので
3
+ わかりづらい質問をてしまい、すみませんでした。GETところを勘違いしていました。自己解決した部分あるので改めました
4
4
 
5
- (1) ユーザーが検索(POST)すると一致するレコード(投稿)を取り出して順に表示。
6
5
 
7
- (2) 表示したレコードはURLになっており、詳細ページにリここでGETリクエストを使用。
6
+ PHPでページング機能を実装したいです。
8
7
 
9
- 詳細ページ(detail.php)へのリンクは投稿idでGETリクエストしています。詳細ページでは再びDBにアクセスしてGETで送られたidをもとにレコードを取り出す仕組みです。
10
- ```
11
- $result = $stm->fetchAll(PDO::FETCH_ASSOC);
8
+ ユーザーが検索(POST)すると一致するレコード(投稿)を取り出して順に表示させたいです。
12
9
 
13
- foreach ($result as $row) {
10
+ 検索(POST)するときに、CSRF対策のトークンのチェックをしております。
14
11
 
15
- echo '<a href="detail.php ?id=',$row['id'],'">', "詳細", "</a>";
12
+ ページングを実装できたのですが、2ページ目以降をクリックすると、トークンチェックで引っかかり、不正なPOST扱いになってしまいます。
16
- echo "<br>";
17
- }
18
- ```
19
13
 
20
- 1ページあたり5つのレコードを表示させたいです。
14
+ ページングはGETリクエスト行っています。
21
15
 
22
- 以下ように実装したのですが、GETリクエストが重なるからなのか2ページンクできません。汚いコードで申訳なが、コードは以下です
16
+ トークン設定は検索ページでhiddenで送り、検索一覧表示ページ(ページング実装したページ)の最初トークのチェッす。
23
17
 
24
- ```
25
- $pdo = new PDO($dsn, $user, $password);
18
+ なぜページングのGETリクエストがトークンチェックで引っかかってしまうのでしょうか?
26
- $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
27
19
 
28
- if (isset($_GET['page'])) {
29
- $page = (int)$_GET['page'];
30
- } else {
31
- $page = 1;
32
- }
33
-
34
- if ($page > 1) {
35
- $start = ($page * 5) - 5;
36
- } else {
37
- $start = 0;
38
- }
39
-
40
-
41
- //SQL文は省略します。
42
- $sql = "ここに検索一致条件等を書いています。";
43
-
44
- $sql.="LIMIT {$start}, 5";
45
-
46
- $stm = $pdo->prepare($sql);
47
- $stm->execute($data);
48
-
49
- $result=$stm->fetchAll(PDO::FETCH_ASSOC);
50
-
51
- foreach ($result as $row) {
52
-
53
- echo '<a href="detail.php ?id=',$row['id'],'">', "詳細", "</a>";
54
- echo "<br>";
55
- }
56
-
57
-
58
- $page_num = $pdo->prepare("
59
- SELECT COUNT(*) id
60
- FROM table
61
- ");
62
-
63
- $page_num->execute();
64
- $page_num = $page_num->fetchColumn();
65
-
66
- $pagination = ceil($page_num / 5);
67
-
68
-
69
- ?>
70
-
71
- <?php for ($i=1; $i<= $pagination ; $i++):?>
72
-
73
- <a href="?page=<?php echo $i ?>"><?php echo $i; ?></a>
74
-
75
- <?php endfor; ?>
76
-
77
- ```
78
- この状態だと全ページ数が、全レコードをもとに計算されたページ数になってしまいます。(検索して一致したレコード数をもとにページ数がけいさんされていない。)
79
-
80
- また、詳細ページへのGETである?idとページネーションへのGETである?pageを両立するにはどうすればよいでしょうか?
81
-
82
20
  教えていただけたら幸いです。

2

追記

2017/09/20 06:02

投稿

gsuisk
gsuisk

スコア72

title CHANGED
File without changes
body CHANGED
@@ -75,7 +75,8 @@
75
75
  <?php endfor; ?>
76
76
 
77
77
  ```
78
+ この状態だと全ページ数が、全レコードをもとに計算されたページ数になってしまいます。(検索して一致したレコード数をもとにページ数がけいさんされていない。)
78
79
 
79
- 詳細ページへのGETである?idとページネーションへのGETである?pageを両立するにはどうすればよいでしょうか?
80
+ また、詳細ページへのGETである?idとページネーションへのGETである?pageを両立するにはどうすればよいでしょうか?
80
81
 
81
82
  教えていただけたら幸いです。

1

追記

2017/09/19 18:54

投稿

gsuisk
gsuisk

スコア72

title CHANGED
File without changes
body CHANGED
@@ -6,8 +6,7 @@
6
6
 
7
7
  (2) 表示したレコードはURLになっており、詳細ページにリンクする。ここでGETリクエストを使用。
8
8
 
9
- 詳細ページ(detail.php)へのリンクは投稿idでGETリクエストしています。
9
+ 詳細ページ(detail.php)へのリンクは投稿idでGETリクエストしています。詳細ページでは再びDBにアクセスしてGETで送られたidをもとにレコードを取り出す仕組みです。
10
-
11
10
  ```
12
11
  $result = $stm->fetchAll(PDO::FETCH_ASSOC);
13
12