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

回答編集履歴

2

見直し

2021/01/21 01:11

投稿

退会済みユーザー
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

見直し

2021/01/21 01:11

投稿

退会済みユーザー
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)