回答編集履歴

2

加筆修正

2019/05/17 01:34

投稿

退会済みユーザー
test CHANGED
@@ -33,3 +33,43 @@
33
33
  [PHP isset, empty, is_null の違い早見表 - Qiita](https://qiita.com/shinichi-takii/items/00aed26f96cf6bb3fe62)
34
34
 
35
35
  empty()は文字列長ゼロ文字列や数値ゼロもTRUE判定してしまいますので。
36
+
37
+
38
+
39
+ ---
40
+
41
+
42
+
43
+ ```
44
+
45
+ $stmt = $db->prepare("INSERT INTO users(firstname,lastname,email,phone,birthdate,username,password) VALUES ($firstname,$lastname,
46
+
47
+ $email,$phone,$birthdate,$username,$password)");
48
+
49
+ ```
50
+
51
+ この時点の $firstname,$lastname,$email,$phone,$birthdate,$username,$password って誰がいつデータを詰めているでしょうか。
52
+
53
+ 面倒でも`$firstname = $_POST['firstname'];`など必要なことはちゃんと書きましょう。
54
+
55
+
56
+
57
+ そして、テーブルusersの構造がどうなのかわかりませんが、
58
+
59
+ テーブルに設けられている制約に引っかかってクエリー実行時エラーが発生しているかもしれません。
60
+
61
+
62
+
63
+ せっかくprepare()使うのであれば(慣れないうちは)
64
+
65
+ prepare()してbindValue()してexecute()するようにした方が良いです。
66
+
67
+ 特に[PHP: PDOStatement::bindValue - Manual](https://www.php.net/manual/ja/pdostatement.bindvalue.php)はデータベース上でのデータ型を意識して値を引き渡すため、
68
+
69
+ 暗黙の型変換などが生じにくく確実性が高いと思います。
70
+
71
+ むやみにクエリー文字列を変数の連結で作ってはいけません。
72
+
73
+ ましてや、汚染されているかもしれない`$_POST`など外部から受信する文字列を検証せず組み込むと
74
+
75
+ 大変なことになるかもしれません。(SQLインジェクションを調べてほしい。)

1

見直し

2019/05/17 01:34

投稿

退会済みユーザー
test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- POST受信しているかどうかの判定はisset($_POST['firstname'])方がいいんじゃないかなぁ。
31
+ POST受信しているかどうかの判定は `if (isset($_POST['firstname']))` な書き方がいいんじゃないかなぁ。
32
32
 
33
33
  [PHP isset, empty, is_null の違い早見表 - Qiita](https://qiita.com/shinichi-takii/items/00aed26f96cf6bb3fe62)
34
34