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

回答編集履歴

6

追記

2019/01/30 13:31

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -4,12 +4,14 @@
4
4
  //--------------①検索用ここから------------------>
5
5
  function getHostData($params){
6
6
  if(!isset($params['search'])){
7
- return[];
7
+ return[]; //これ返したらどうなるかわかって入れてるのだろうか
8
8
  }
9
9
  try{
10
10
  $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8','root','',
11
11
  array(PDO::ATTR_EMULATE_PREPARES => false));
12
12
  } catch (PDOException $e) {
13
+ //せっかくException捕捉してるのにその内容をどこにも出さないのでは問題が何か分からない。
14
+ //というか、接続のところだけcatchしても意味がない。全ての処理がうまくいく保障なんてないのでDB関係の処理は一通り囲っておくべき
13
15
  exit();
14
16
  }
15
17
 
@@ -58,7 +60,7 @@
58
60
  $sql->bindValue(":offset", $offset, PDO::PARAM_INT);
59
61
  $sql->execute();
60
62
 
61
- //これだと検索したときと同居できないんじゃ?
63
+ //これだと検索したときと一緒にできない
62
64
 
63
65
  $hostData=[];
64
66
  //---------------②ページング用ここまで-------------

5

修正

2019/01/30 13:31

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  if(!empty($params['name'])){
17
17
  $where[] = "name like '%{$params['name']}%'";
18
- }
18
+ }//SQLインジェクション対策してください。
19
19
 
20
20
  if($where){
21
21
  $whereSql = implode(' OR ', $where);

4

修正

2019/01/30 10:44

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -130,6 +130,7 @@
130
130
 
131
131
  if($p > 0){
132
132
  echo '<a href="2.php?p=', $prev_num, '">前へ</a>','</td>'; //検索条件もつけないと他のページで対応できない(今回質問者が聞いていること)
133
+ //,でも動かないことはないけど意味合いとしては「文字列連結」だから . の方が適切。統一すべき
133
134
  } else {
134
135
  echo '最新';
135
136
  }

3

修正

2019/01/30 08:37

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -153,4 +153,12 @@
153
153
  </body>
154
154
  </html>
155
155
 
156
- ```
156
+ ```
157
+
158
+ リクエストパラメータについて基本的な知識がついていないことで非効率で拡張性もなく達成に向かっていないコードになっています。
159
+ 下記きちんと読んで概念を理解してください
160
+ - [HTTPとPOSTとGET](https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf)
161
+ - [[PHP] リクエストパラメータ・セッションに関するまとめ](https://qiita.com/mpyw/items/7852213f478e8c5a2802)
162
+
163
+ teratail内を探せば類似の問題はあります。
164
+ - [PHP ページ移動時のデータ保存について](https://teratail.com/questions/26387)

2

修正

2019/01/30 08:34

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -58,7 +58,7 @@
58
58
  $sql->bindValue(":offset", $offset, PDO::PARAM_INT);
59
59
  $sql->execute();
60
60
 
61
- //これだと検索したときと同居できないんじゃ?検索条件はSESSIONで持ちまわるとかで対応可能。
61
+ //これだと検索したときと同居できないんじゃ?
62
62
 
63
63
  $hostData=[];
64
64
  //---------------②ページング用ここまで-------------
@@ -129,13 +129,13 @@
129
129
  $total_page= ceil($total_res / $limit);
130
130
 
131
131
  if($p > 0){
132
- echo '<a href="2.php?p=', $prev_num, '">前へ</a>','</td>';
132
+ echo '<a href="2.php?p=', $prev_num, '">前へ</a>','</td>'; //検索条件もつけないと他のページで対応できない(今回質問者が聞いていること)
133
133
  } else {
134
134
  echo '最新';
135
135
  }
136
136
 
137
137
  if($total_page-1 > $p){
138
- echo '<a href="2.php?p=', $next_num, '">次へ</a>','</td>';
138
+ echo '<a href="2.php?p=', $next_num, '">次へ</a>','</td>';//検索条件もつけないと他のページで対応できない(今回質問者が聞いていること)
139
139
  } else {
140
140
  echo '末尾';
141
141
  }

1

修正

2019/01/30 08:28

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -58,7 +58,7 @@
58
58
  $sql->bindValue(":offset", $offset, PDO::PARAM_INT);
59
59
  $sql->execute();
60
60
 
61
- //これだと検索したときと同居できないんじゃ?
61
+ //これだと検索したときと同居できないんじゃ?検索条件はSESSIONで持ちまわるとかで対応可能。
62
62
 
63
63
  $hostData=[];
64
64
  //---------------②ページング用ここまで-------------
@@ -88,7 +88,7 @@
88
88
  if(!empty($_GET)){ // $_GETの存在はチェックする必要ないのでは
89
89
  $hostData = getHostData($_GET);?> // $_GETはスーパーグローバル変数なので引数で渡す必要はなし。
90
90
  <div class="col-xs-6 col-xs-offset-3">
91
- <?php if(isset($hostData) && count($hostData)): ?>
91
+ <?php if(isset($hostData) && count($hostData)): ?>
92
92
  <p class="alert alert-success"><?php echo count($hostData) ?>件見つかりました。</p>
93
93
 
94
94
  <table class="table">
@@ -100,6 +100,8 @@
100
100
  <tbody>
101
101
  <?php
102
102
  while ($row = $sql -> fetch(PDO::FETCH_ASSOC)){ //$hostDataのデータが無駄になった。
103
+ //「検索結果0件」はlimitやoffsetで絞っても0は0なのでそのためだけに$hostDataを作るのはコストが高すぎる。
104
+ //例え10件ページングで12件ヒットしたとして「p=3」とブラウザのURL切り替えられても「検索結果0」というのは理論的に合っている
103
105
  echo '<tr>';
104
106
  echo '<td>', htmlspecialchars($row['name']),'</td>';
105
107
  echo '</tr>';
@@ -140,13 +142,11 @@
140
142
  //----ページング用ここまで------
141
143
 
142
144
  /*
143
- SQLは書き2本で充分今回の対応が可能 無駄なDB接続・SQL実行が多すぎるのでデータ件数が何千件何万件となったときかなり危険
145
+ SQLは下記2本で充分今回の対応が可能 無駄なDB接続・SQL実行が多すぎるのでデータ件数が何千件何万件となったときかなり危険
144
146
  select * from hosts $whereSql に offset limit つけたもの(要は現ページに表示するデータ)
145
147
 
146
- select count(*) from hosts $whereSql (要は検索結果の全件数)
148
+ select count(*) from hosts $whereSql (要は検索結果の全件数)
147
-
148
-
149
-
149
+
150
150
  */
151
151
  ?>
152
152