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

回答編集履歴

2

修正

2019/05/02 13:20

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -11,6 +11,9 @@
11
11
 
12
12
  ポイントだけ調整コード
13
13
  (既にアドバイスした内容ですが)
14
+
15
+ ---
16
+
14
17
  ```php
15
18
 
16
19
  class Price {
@@ -23,7 +26,8 @@
23
26
  public $_result = [];
24
27
  ```
25
28
 
26
-
29
+ ---
30
+
27
31
  ```php
28
32
  public function _searchDate() {
29
33
 
@@ -53,6 +57,8 @@
53
57
  }
54
58
  ```
55
59
 
60
+ ---
61
+
56
62
  ```php
57
63
  public function post() {
58
64
  try {

1

修正

2019/05/02 13:20

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -5,4 +5,120 @@
5
5
  - 入力値そのままSQLに突っ込むとSQLインジェクションの脆弱性があるので、[bindValue()](https://www.php.net/manual/ja/pdostatement.bindvalue.php)でバインドしてSQLエスケープすること(PHPマニュアル確認してもらえればわかりますが使うメソッドはquery()ではなくなるので注意)
6
6
  - fetchだと最初の1件しか取得できないけど、それでいいのでしょうか。[fetchAll](https://www.php.net/manual/ja/pdostatement.fetchall.php)で全部取ってきたほうがいいような
7
7
  - データがとれてること確認できてるならそのデータをreturnして呼び先で受け取って出力処理書けばいいだけでは
8
- - _validateSelect()とか_validateToken()でException投げてるのはいいけど受け取ってもリダイレクトしているだけなので意味ないのでは。それならException投げるのではなくてエラー受け取って画面にエラーメッセージ出力したほうがいいと思う(そこは決めてください。エラー捕捉しているのに使ってないことが問題なので)
8
+ - _validateSelect()とか_validateToken()でException投げてるのはいいけど受け取ってもリダイレクトしているだけなので意味ないのでは。それならException投げるのではなくてエラー受け取って画面にエラーメッセージ出力したほうがいいと思う(そこは決めてください。エラー捕捉しているのに使ってないことが問題なので)
9
+
10
+ -----------
11
+
12
+ ポイントだけ調整コード
13
+ (既にアドバイスした内容ですが)
14
+ ```php
15
+
16
+ class Price {
17
+ private $_db;
18
+ ```
19
+
20
+ ```php
21
+ class Price {
22
+ private $_db;
23
+ public $_result = [];
24
+ ```
25
+
26
+
27
+ ```php
28
+ public function _searchDate() {
29
+
30
+ $date = filter_input(INPUT_POST,'date',FILTER_SANITIZE_NUMBER_INT);
31
+ $res = $this->_db->prepare('select カラム名 from テーブル名 where カラム名 = :date');
32
+ $res->bindValue(':date', $date, \PDO::PARAM_STR);
33
+ $res->execute();
34
+ ```
35
+
36
+ ※「メソッドはどこからどう呼び出されるか知らない」のが実際の前提なので「前のメソッドでチェックしている前提」は捨ててきちんと丁寧に書くこと。PDOException も同理由。
37
+ ```php
38
+ public function _searchDate() {
39
+ try {
40
+ $date = filter_input(INPUT_POST,'date',FILTER_SANITIZE_NUMBER_INT);
41
+ $where = '';
42
+ if(!is_null($date)){
43
+ $where = ' where カラム名 = :date';
44
+ }
45
+ $stmt = $this->_db->prepare('select カラム名 from テーブル名'.$where );
46
+ if(!is_null($date)){
47
+ $stmt->bindValue(':date', $date, \PDO::PARAM_STR);
48
+ }
49
+ $stmt->execute();
50
+ $this->_result = $stmt->fetchAll();
51
+ } catch (\PDOException $e){
52
+ die(var_dump($e));
53
+ }
54
+ ```
55
+
56
+ ```php
57
+ public function post() {
58
+ try {
59
+
60
+ $this->_validateSelect();
61
+ $this->_validateToken();
62
+ $this->_searchDate();
63
+
64
+ } catch (\Exception $e) {
65
+ header('Location: http://' . $_SERVER['HTTP_HOST']);
66
+ }
67
+ exit;
68
+ }
69
+ ```
70
+
71
+ exit入れるならheaderの直後であるべき、だけど、元の記述だとせっかく捕捉したExceptionを握りつぶしているので、練習とか学習とか開発途中のものだったらExceptionを全てvar_dump()などで出力しておくべき。
72
+ ```php
73
+ public function post() {
74
+ try {
75
+
76
+ $this->_validateSelect();
77
+ $this->_validateToken();
78
+ $this->_searchDate();
79
+
80
+ } catch (\Exception $e) {
81
+ die(var_dump($e));
82
+ }
83
+ }
84
+ ```
85
+
86
+ index.php
87
+ ```php
88
+ <?php
89
+ require_once(__DIR__ . '/config.php');
90
+ require_once(__DIR__ . '/search.php');
91
+
92
+ $search = new \SearchDate\Price();
93
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
94
+ $search->post();
95
+ }
96
+ ?>
97
+ <!DOCTYPE html>
98
+ <html lang="ja">
99
+ <head>
100
+ <meta charset="utf-8">
101
+ <title>練習サイト</title>
102
+ <link rel="stylesheet" href="styles.css">
103
+ </head>
104
+ <body>
105
+
106
+ <form action="" method="post">
107
+ <label> 日付: <input type="date" name="date"></label>
108
+ <input type="submit" value="検索">
109
+
110
+ <div>サンプル1</div>
111
+ <div>サンプル2</div>
112
+ <div>
113
+ <?php
114
+ foreach($search->_result as $rownum=>$rowdata){
115
+ echo $rowdata["カラム名"];
116
+ }
117
+ ?>
118
+ </div>
119
+
120
+ </form>
121
+
122
+ </body>
123
+ </html>
124
+ ```