回答編集履歴
2
見直し
answer
CHANGED
@@ -43,8 +43,8 @@
|
|
43
43
|
$id = filter_input(INPUT_GET, 'id_product', FILTER_VALIDATE_INT);
|
44
44
|
$sql = <<<EOT
|
45
45
|
SELECT
|
46
|
-
date_format(product.date_arrivee,'%Y %b %d %k:%i') AS new_date_arri,
|
46
|
+
date_format(product.date_arrivee, '%Y %b %d %k:%i') AS new_date_arri,
|
47
|
-
date_format(produit.date_depart,'%Y %b %d %k:%i') AS new_date_depa,
|
47
|
+
date_format(produit.date_depart, '%Y %b %d %k:%i') AS new_date_depa,
|
48
48
|
EXTRACT(YEAR_MONTH FROM date_arrivee) AS ym,
|
49
49
|
product.*,
|
50
50
|
room.*
|
@@ -58,6 +58,11 @@
|
|
58
58
|
$result = $stmt->execute();
|
59
59
|
```
|
60
60
|
|
61
|
-
とか。見やすさ大事。
|
61
|
+
SQL文の中身は特に評価していないけど、PDOっぽく書き直すとこんな感じとか。見やすさ大事。
|
62
62
|
[PHP: filter_input - Manual](https://www.php.net/manual/ja/function.filter-input.php)
|
63
|
-
[PHP: PDO::prepare - Manual](https://www.php.net/manual/ja/pdo.prepare.php)
|
63
|
+
[PHP: PDO::prepare - Manual](https://www.php.net/manual/ja/pdo.prepare.php)
|
64
|
+
[PHP: PDOStatement::bindValue - Manual](https://www.php.net/manual/ja/pdostatement.bindvalue.php)
|
65
|
+
|
66
|
+
「product.*, room.*」みたいなのは個人的にはナシだな。
|
67
|
+
SQL文としては間違っていないけど、なんのどのデータがほしいか明示して
|
68
|
+
無駄にデータを引っ張り出すことに依る無駄なリソース消費を抑えたいかな。
|
1
見直し
answer
CHANGED
@@ -4,4 +4,60 @@
|
|
4
4
|
Aに関係あるB、Bに関係あるC、Cに関係あるDを順にたどって取得するようなイメージ。
|
5
5
|
だけど、やりたいことって、
|
6
6
|
Aに関係あるBを3つほしい、
|
7
|
-
ってことなんじゃないの?
|
7
|
+
ってことなんじゃないの?
|
8
|
+
|
9
|
+
---
|
10
|
+
|
11
|
+
MySQLを実務で使ったことはないけど、これはおかしいんじゃないの?ってところはツッコミ入れたい。
|
12
|
+
|
13
|
+
```php
|
14
|
+
$pdo->query("SETSET lc_time_names = 'ja_JP'");
|
15
|
+
```
|
16
|
+
SETSETじゃなくてSET。
|
17
|
+
[MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.7 MySQL Server のロケールサポート](https://dev.mysql.com/doc/refman/5.6/ja/locale-support.html)
|
18
|
+
で、いつもいつもこれを実行する必要性ってあるのかどうか。
|
19
|
+
日本向けじゃなく世界に向けてユーザーごとのロケールに合わせて表示します、
|
20
|
+
とかいうのでもない限り、データベース構築時にロケール情報を日本用にするはず。
|
21
|
+
それについては自分で調べてみてね。
|
22
|
+
|
23
|
+
```php
|
24
|
+
$pdo = new PDO("mysql:host=******;dbname=********", "****", "***");
|
25
|
+
```
|
26
|
+
try~catchしましょうね。
|
27
|
+
ベテランでも何度も読み返すこちらの記事を参照。
|
28
|
+
[PHPでデータベースに接続するときのまとめ - Qiita](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)
|
29
|
+
|
30
|
+
```php
|
31
|
+
$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']."");
|
32
|
+
```
|
33
|
+
|
34
|
+
SQL文字列を作って実行するのは理解しているようだけど、
|
35
|
+
$_POSTや$_GETなど外部から受信するパラメータを直接連結するのは
|
36
|
+
必ずしも自分らで作ったフォームじゃなくてもデータ受信できてしまうこともあり
|
37
|
+
SQLインジェクションによる攻撃を受けやすいため、
|
38
|
+
対策が必要。
|
39
|
+
不意にSQL文を終了させようとする記号や文字が入っていないことを検証するのが必要なのと、
|
40
|
+
せっかくPDO経由の接続を使っているのだからプリペアドステートメントを使いましょうってのと。
|
41
|
+
|
42
|
+
```php
|
43
|
+
$id = filter_input(INPUT_GET, 'id_product', FILTER_VALIDATE_INT);
|
44
|
+
$sql = <<<EOT
|
45
|
+
SELECT
|
46
|
+
date_format(product.date_arrivee,'%Y %b %d %k:%i') AS new_date_arri,
|
47
|
+
date_format(produit.date_depart,'%Y %b %d %k:%i') AS new_date_depa,
|
48
|
+
EXTRACT(YEAR_MONTH FROM date_arrivee) AS ym,
|
49
|
+
product.*,
|
50
|
+
room.*
|
51
|
+
FROM
|
52
|
+
product JOIN room ON product.id_room = room.id_room
|
53
|
+
WHERE
|
54
|
+
id_product = :id
|
55
|
+
EOT;
|
56
|
+
$stmt = $pdo->prepare($sql);
|
57
|
+
$stmt->bindValue(':id', $id, PDO_PARAM_INT);
|
58
|
+
$result = $stmt->execute();
|
59
|
+
```
|
60
|
+
|
61
|
+
とか。見やすさ大事。
|
62
|
+
[PHP: filter_input - Manual](https://www.php.net/manual/ja/function.filter-input.php)
|
63
|
+
[PHP: PDO::prepare - Manual](https://www.php.net/manual/ja/pdo.prepare.php)
|