回答編集履歴

7

微調整($word3は中でも良かった)

2018/06/19 05:39

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -242,14 +242,14 @@
242
242
 
243
243
  //検索条件
244
244
 
245
- $word3 = "";
246
-
247
245
  $where = "";
248
246
 
249
247
 
250
248
 
251
249
  if(isset($_SESSION)){
252
250
 
251
+ $word3 = "";
252
+
253
253
  if(array_key_exists("word3",$_SESSION) && !empty($_SESSION["word3"])){
254
254
 
255
255
  $word3 = $_SESSION['word3'];

6

追記

2018/06/19 05:39

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -198,6 +198,12 @@
198
198
 
199
199
 
200
200
 
201
+
202
+
203
+ # 更に追記 2018/6/19 14:20
204
+
205
+
206
+
201
207
  検索部分 ※session_start()部分、DB接続部分は除く
202
208
 
203
209
  ```php
@@ -277,3 +283,29 @@
277
283
  $result = pg_query($con,$sql);
278
284
 
279
285
  ```
286
+
287
+
288
+
289
+ $sqlの出力結果例:
290
+
291
+ word3に何もない場合
292
+
293
+ ```sql
294
+
295
+ SELECT * FROM theme limit 5 offset 0
296
+
297
+ ```
298
+
299
+ word3にaと入力された場合
300
+
301
+ ```sql
302
+
303
+ SELECT * FROM theme where ( (theme_ans LIKE '%a%') OR (theme_que LIKE '%a%') ) limit 5 offset 0
304
+
305
+ ```
306
+
307
+
308
+
309
+ まず確認しなければならないのは「想定通りのデータを取得できるSQLができているかどうか」です。
310
+
311
+ $sqlをechoで画面出力してみるなり何なりして、PHPからではなくPostgreSQLであればPgAdminなどのツールで直接DBに対して取得したSQLを実行してみると良いです。

5

検索処理部分追記

2018/06/19 05:28

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -195,3 +195,85 @@
195
195
 
196
196
 
197
197
  ※本来は[SQLのエスケープ](http://php.net/manual/ja/function.pg-escape-string.php)も入れるべきですが、省略しています。
198
+
199
+
200
+
201
+ 検索部分 ※session_start()部分、DB接続部分は除く
202
+
203
+ ```php
204
+
205
+ if($_SERVER['REQUEST_METHOD'] === "POST"){
206
+
207
+ $_SESSION['word'] = $_POST['word'];
208
+
209
+ $_SESSION['word1'] = $_POST['word1'];
210
+
211
+ $_SESSION['word2'] = $_POST['word2'];
212
+
213
+ $_SESSION['word3'] = $_POST['word3'];
214
+
215
+ }
216
+
217
+
218
+
219
+ if (!isset($_GET['page'])) {
220
+
221
+ $page = 1; // 最初のアクセス
222
+
223
+ } else {
224
+
225
+ $page = intval($_GET['page']); // ページ指定でのアクセス
226
+
227
+ if ($page == 0 ) { die('page no error'); }
228
+
229
+ }
230
+
231
+
232
+
233
+ $offset = ($page-1) * 5;
234
+
235
+
236
+
237
+ //検索条件
238
+
239
+ $word3 = "";
240
+
241
+ $where = "";
242
+
243
+
244
+
245
+ if(isset($_SESSION)){
246
+
247
+ if(array_key_exists("word3",$_SESSION) && !empty($_SESSION["word3"])){
248
+
249
+ $word3 = $_SESSION['word3'];
250
+
251
+ }
252
+
253
+ $where_list = [];
254
+
255
+ if($word3 !== ""){
256
+
257
+ $where_list[] = " ( (theme_ans LIKE '%{$word3}%') OR (theme_que LIKE '%{$word3}%') ) ";
258
+
259
+ }
260
+
261
+ $where = "";
262
+
263
+ if(count($where_list) > 0){
264
+
265
+ $where = " where ".implode(" and ",$where_list);
266
+
267
+ }
268
+
269
+ }
270
+
271
+
272
+
273
+
274
+
275
+ $sql = "SELECT * FROM theme ".$where. " limit 5 offset ".$offset;
276
+
277
+ $result = pg_query($con,$sql);
278
+
279
+ ```

4

関数名修正

2018/06/19 05:19

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -154,7 +154,7 @@
154
154
 
155
155
  $word3 = "";
156
156
 
157
- if(array_key_exists("word3",$_SESSION) && !is_empty($_SESSION["word3"])){
157
+ if(array_key_exists("word3",$_SESSION) && !empty($_SESSION["word3"])){
158
158
 
159
159
  $word3 = $_SESSION['word3'];
160
160
 

3

追記

2018/06/19 00:14

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- session_start()は基本的に何かの出力前に書くべきものです。
45
+ [session_start()](http://php.net/manual/ja/function.session-start.php)は基本的に何かの出力前に書くべきものです。
46
46
 
47
47
  > クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要があります。
48
48
 

2

追記

2018/06/18 05:52

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -35,3 +35,163 @@
35
35
 
36
36
 
37
37
  参考まで。
38
+
39
+
40
+
41
+ # 追記
42
+
43
+
44
+
45
+ session_start()は基本的に何かの出力前に書くべきものです。
46
+
47
+ > クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要があります。
48
+
49
+
50
+
51
+ ファイル冒頭で宣言しましょう。
52
+
53
+ また、おそらく画面にエラー出力してないですよね?
54
+
55
+ 下記のようにベタで書いてあると、GETアクセスの場合、必ずエラーが出ます。
56
+
57
+ ```php
58
+
59
+ $KEY = $_POST['word'];
60
+
61
+ $KEY1 = $_POST['word1'];
62
+
63
+ $KEY2 = $_POST['word2'];
64
+
65
+ $KEY3 = $_POST['word3'];
66
+
67
+ ```
68
+
69
+ 基本的にはエラー表示はOnにしておきましょう。
70
+
71
+ - [PHPのエラー表示設定について](https://qiita.com/shotets/items/3c95aef631b2c5eadae5)
72
+
73
+
74
+
75
+ で、上記を踏まえますと、「DBの結果が表示されません」の理由が分かります。
76
+
77
+
78
+
79
+ 下記のようなつくりになっていますが、ページ送りのリンクでアクセスした際は**必ずGETでのアクセスとなります。**
80
+
81
+ ```php
82
+
83
+ $KEY = $_POST['word'];
84
+
85
+ $KEY1 = $_POST['word1'];
86
+
87
+ $KEY2 = $_POST['word2'];
88
+
89
+ $KEY3 = $_POST['word3'];
90
+
91
+ $_SESSION['word3'] =$KEY3;
92
+
93
+ ```
94
+
95
+
96
+
97
+ ということは$_POSTはそもそも存在しません。
98
+
99
+ おそらくNULLになっているんじゃないかと(試したわけではないですが)
100
+
101
+
102
+
103
+ ということは上記は「POSTのときのみ実行する」ようにしなければなりません。
104
+
105
+
106
+
107
+ ```php
108
+
109
+ if($_SERVER["REQUEST_METHOD"] === "POST"){
110
+
111
+ $KEY = $_POST['word'];
112
+
113
+ $KEY1 = $_POST['word1'];
114
+
115
+ $KEY2 = $_POST['word2'];
116
+
117
+ $KEY3 = $_POST['word3'];
118
+
119
+ $_SESSION['word3'] =$KEY3;
120
+
121
+ }
122
+
123
+ ```
124
+
125
+ - [POSTかGETかを判別](https://www.phpbook.jp/appli/keijiban/index3.html)
126
+
127
+
128
+
129
+ というかおそらく使わない変数が増えてくるのでむしろこうでもいい。
130
+
131
+ ```php
132
+
133
+ if($_SERVER["REQUEST_METHOD"] === "POST"){
134
+
135
+ $_SESSION['word'] = $_POST['word'];
136
+
137
+ $_SESSION['word1'] = $_POST['word1'];
138
+
139
+ $_SESSION['word2'] = $_POST['word2'];
140
+
141
+ $_SESSION['word3'] = $_POST['word3'];
142
+
143
+ }
144
+
145
+ ```
146
+
147
+
148
+
149
+ で、あとは、SESSIONに値が存在するか確認して受け取る
150
+
151
+ ※ひとまずword3のみ。他も同じ。
152
+
153
+ ```php
154
+
155
+ $word3 = "";
156
+
157
+ if(array_key_exists("word3",$_SESSION) && !is_empty($_SESSION["word3"])){
158
+
159
+ $word3 = $_SESSION['word3'];
160
+
161
+ }
162
+
163
+ ```
164
+
165
+ あとは$word3が空じゃないときにSQLにセット。
166
+
167
+ ※複数条件の場合も$where_listに追加でいけるはず
168
+
169
+ 例:
170
+
171
+ ```php
172
+
173
+ $where_list = [];
174
+
175
+ if($word3 !== ""){
176
+
177
+ $where_list[] = " ( (theme_ans LIKE '%{$word3}%') OR (theme_que LIKE '%{$word3}%') ) ";
178
+
179
+ }
180
+
181
+ $where = "";
182
+
183
+ if(count($where_list) > 0){
184
+
185
+ $where = " where ".implode(" and ",$where_list);
186
+
187
+ }
188
+
189
+ $sql = "SELECT * FROM theme ".$where;
190
+
191
+ $result = pg_query($con,$sql);
192
+
193
+ ```
194
+
195
+
196
+
197
+ ※本来は[SQLのエスケープ](http://php.net/manual/ja/function.pg-escape-string.php)も入れるべきですが、省略しています。

1

追記

2018/06/18 05:48

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -10,9 +10,15 @@
10
10
 
11
11
  そのままoffsetに指定している時点で**本来の1件目が取得できていません。**
12
12
 
13
+ 今の状態だとページ2がきたときに3件目から8件目を取得していることになります。
14
+
15
+ (ページ3の場合は4件目から9件目)
13
16
 
14
17
 
18
+
19
+ つまり、
20
+
15
- $pageが1の場合は0、$pageが2の場合は+1ページ表示分の件数でないといけません。
21
+ ページが1の場合は0、2の場合は+1ページ表示分の件数でないといけません。
16
22
 
17
23
 
18
24