回答編集履歴

2

見直し

2021/01/21 01:11

投稿

退会済みユーザー
test CHANGED
@@ -88,9 +88,9 @@
88
88
 
89
89
  SELECT
90
90
 
91
- date_format(product.date_arrivee,'%Y %b %d %k:%i') AS new_date_arri,
91
+ date_format(product.date_arrivee, '%Y %b %d %k:%i') AS new_date_arri,
92
92
 
93
- date_format(produit.date_depart,'%Y %b %d %k:%i') AS new_date_depa,
93
+ date_format(produit.date_depart, '%Y %b %d %k:%i') AS new_date_depa,
94
94
 
95
95
  EXTRACT(YEAR_MONTH FROM date_arrivee) AS ym,
96
96
 
@@ -118,8 +118,18 @@
118
118
 
119
119
 
120
120
 
121
- とか。見やすさ大事。
121
+ SQL文の中身は特に評価していないけど、PDOっぽく書き直すこんな感じとか。見やすさ大事。
122
122
 
123
123
  [PHP: filter_input - Manual](https://www.php.net/manual/ja/function.filter-input.php)
124
124
 
125
125
  [PHP: PDO::prepare - Manual](https://www.php.net/manual/ja/pdo.prepare.php)
126
+
127
+ [PHP: PDOStatement::bindValue - Manual](https://www.php.net/manual/ja/pdostatement.bindvalue.php)
128
+
129
+
130
+
131
+ 「product.*, room.*」みたいなのは個人的にはナシだな。
132
+
133
+ SQL文としては間違っていないけど、なんのどのデータがほしいか明示して
134
+
135
+ 無駄にデータを引っ張り出すことに依る無駄なリソース消費を抑えたいかな。

1

見直し

2021/01/21 01:11

投稿

退会済みユーザー
test CHANGED
@@ -11,3 +11,115 @@
11
11
  Aに関係あるBを3つほしい、
12
12
 
13
13
  ってことなんじゃないの?
14
+
15
+
16
+
17
+ ---
18
+
19
+
20
+
21
+ MySQLを実務で使ったことはないけど、これはおかしいんじゃないの?ってところはツッコミ入れたい。
22
+
23
+
24
+
25
+ ```php
26
+
27
+ $pdo->query("SETSET lc_time_names = 'ja_JP'");
28
+
29
+ ```
30
+
31
+ SETSETじゃなくてSET。
32
+
33
+ [MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.7 MySQL Server のロケールサポート](https://dev.mysql.com/doc/refman/5.6/ja/locale-support.html)
34
+
35
+ で、いつもいつもこれを実行する必要性ってあるのかどうか。
36
+
37
+ 日本向けじゃなく世界に向けてユーザーごとのロケールに合わせて表示します、
38
+
39
+ とかいうのでもない限り、データベース構築時にロケール情報を日本用にするはず。
40
+
41
+ それについては自分で調べてみてね。
42
+
43
+
44
+
45
+ ```php
46
+
47
+ $pdo = new PDO("mysql:host=******;dbname=********", "****", "***");
48
+
49
+ ```
50
+
51
+ try~catchしましょうね。
52
+
53
+ ベテランでも何度も読み返すこちらの記事を参照。
54
+
55
+ [PHPでデータベースに接続するときのまとめ - Qiita](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)
56
+
57
+
58
+
59
+ ```php
60
+
61
+ $result = $pdo->query("SELECT date_format(product.date_arrivee,'%Y %b %d %k:%i') AS new_date_arri,date_format(produit.date_depart,'%Y %b %d %k:%i') AS new_date_depa, EXTRACT(YEAR_MONTH FROM date_arrivee) AS ym, product.*, room.* FROM product JOIN room ON product.id_room = room.id_room WHERE id_product = ".$_GET['id_product']."");
62
+
63
+ ```
64
+
65
+
66
+
67
+ SQL文字列を作って実行するのは理解しているようだけど、
68
+
69
+ $_POSTや$_GETなど外部から受信するパラメータを直接連結するのは
70
+
71
+ 必ずしも自分らで作ったフォームじゃなくてもデータ受信できてしまうこともあり
72
+
73
+ SQLインジェクションによる攻撃を受けやすいため、
74
+
75
+ 対策が必要。
76
+
77
+ 不意にSQL文を終了させようとする記号や文字が入っていないことを検証するのが必要なのと、
78
+
79
+ せっかくPDO経由の接続を使っているのだからプリペアドステートメントを使いましょうってのと。
80
+
81
+
82
+
83
+ ```php
84
+
85
+ $id = filter_input(INPUT_GET, 'id_product', FILTER_VALIDATE_INT);
86
+
87
+ $sql = <<<EOT
88
+
89
+ SELECT
90
+
91
+ date_format(product.date_arrivee,'%Y %b %d %k:%i') AS new_date_arri,
92
+
93
+ date_format(produit.date_depart,'%Y %b %d %k:%i') AS new_date_depa,
94
+
95
+ EXTRACT(YEAR_MONTH FROM date_arrivee) AS ym,
96
+
97
+ product.*,
98
+
99
+ room.*
100
+
101
+ FROM
102
+
103
+ product JOIN room ON product.id_room = room.id_room
104
+
105
+ WHERE
106
+
107
+ id_product = :id
108
+
109
+ EOT;
110
+
111
+ $stmt = $pdo->prepare($sql);
112
+
113
+ $stmt->bindValue(':id', $id, PDO_PARAM_INT);
114
+
115
+ $result = $stmt->execute();
116
+
117
+ ```
118
+
119
+
120
+
121
+ とか。見やすさ大事。
122
+
123
+ [PHP: filter_input - Manual](https://www.php.net/manual/ja/function.filter-input.php)
124
+
125
+ [PHP: PDO::prepare - Manual](https://www.php.net/manual/ja/pdo.prepare.php)