PHP PDO Basic编写的声明

时间:2010-12-12 22:08:12

标签: php mysql pdo

我正在尝试使用pdo + mysql做一个基本的预备语句..我似乎无法获得为我的生命分配的值:/

 $dbh = new PDO('mysql:dbname=users;host=127.0.0.1', 'localAPI', 'localAPI');
 $a = 'asdf';
 $sth = $dbh->prepare("INSERT INTO users (userName, userPass, accountStatus) VALUES (':a', ':userPass', 'unconfirmed')");
 $sth->bindParam(':a', $a, PDO::PARAM_STR);
 $sth->execute();

有什么想法吗? 在此先感谢!!

表结果:

mysql> select * from users;
+--------+----------+-----------+---------------+-------------+---------+---------------------+----------+------------+---------+------+
| userId | userName | userPass  | accountStatus | accountType | balance | tCreated            | tUpdated | tLastLogin | promoId | ref  |
+--------+----------+-----------+---------------+-------------+---------+---------------------+----------+------------+---------+------+
|      1 | :a       | :userPass | unconfirmed   | user        |       0 | 2010-12-12 13:42:10 |     NULL |       NULL |    NULL | NULL | 
+--------+----------+-----------+---------------+-------------+---------+---------------------+----------+------------+---------+------+

2 个答案:

答案 0 :(得分:2)

您在SQL语句中使用引号... ':a' ..包围变量。删除它们,因为解析器会认为你在这里意味着一个字符串,而不是一个变量。您告诉数据库您的意思是带有bind()调用的字符串。

答案 1 :(得分:0)

var_dump不应该向您显示:test替换为123的查询,这似乎是您所期望的。致电$sth->execute();,您就完成了。

原因与预备语句的工作方式有关。请参阅,执行查询时,会发生的情况是查询是作为字符串发送到数据库的。在这里,我将其解析为内部表单,然后在解释器中执行。使用预准备语句,变量的值(例如123的{​​{1}})将与查询分开传输和解析。这意味着你不能“欺骗”解析器 - 这是注入类型攻击依赖的 - 只是因为值永远不是查询的一部分,因此永远不会到达解析器。