回答編集履歴

2

コメントへの回答を追記しました

2020/07/14 08:44

投稿

ockeghem
ockeghem

スコア11701

test CHANGED
@@ -73,3 +73,81 @@
73
73
  $stmt->execute([$test]);
74
74
 
75
75
  ```
76
+
77
+
78
+
79
+ ---
80
+
81
+ (追記)
82
+
83
+
84
+
85
+ 以下の書き方ですが、
86
+
87
+
88
+
89
+ ```
90
+
91
+ $stmt = $db->prepare("INSERT INTO test (name) VALUES ($test)");
92
+
93
+ $stmt->execute();
94
+
95
+ ```
96
+
97
+
98
+
99
+ 生成されるSQL文は下記となります。
100
+
101
+
102
+
103
+ ```
104
+
105
+ INSERT INTO test (name) VALUES (test)
106
+
107
+ ```
108
+
109
+
110
+
111
+ 正しくは下記です。
112
+
113
+
114
+
115
+ ```
116
+
117
+ INSERT INTO test (name) VALUES ('test')
118
+
119
+ ```
120
+
121
+
122
+
123
+ これを受けて、先のPHPスクリプトを以下のように修正すれば、一応動くようになります。
124
+
125
+
126
+
127
+ ```
128
+
129
+ $stmt = $db->prepare("INSERT INTO test (name) VALUES ('$test')");
130
+
131
+ $stmt->execute();
132
+
133
+ ```
134
+
135
+
136
+
137
+ しかし、これですとSQLインジェクション脆弱性が入りやすいので、元の回答のような書き方をすべきです。
138
+
139
+
140
+
141
+ なお、先に触れた以下のSQL文ですが、MySQLだとエラーにはならないようです。
142
+
143
+
144
+
145
+ ```
146
+
147
+ INSERT INTO test (name) VALUES (test)
148
+
149
+ ```
150
+
151
+
152
+
153
+ これですと、test列の内容をname列に挿入することになるわけですが、INSERTの文脈ではtest列は存在しないので、空文字列あるいはNULLがINSERTされるようです。MySQL以外のPostgreSQL等ではエラーになります。どちらにしても、意図した操作ではないと思います。

1

軽微な追記

2020/07/14 08:44

投稿

ockeghem
ockeghem

スコア11701

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  $db = new PDO($dsn['db_info'],$dsn['user'],$dsn['password']);
42
42
 
43
- $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
43
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // この行を追加
44
44
 
45
45
  ```
46
46