PDO - 引号正在生成MySQL语法错误

时间:2012-06-27 18:11:40

标签: php mysql pdo

我正在尝试以我认为正确的方式绑定参数,但是我从MySQL得到了1064错误,这表明涉及的引用太多了。编写的代码如下所示:

$db_host = 'localhost';
$db_username = 'root';
$db_password = 'Password123';
$db_database = 'db_test';

$dbh = new PDO("mysql:host=$db_host", $db_username, $db_password);
$stmt = $dbh->prepare("DROP DATABASE :db_database;");
$stmt->bindParam(':db_database', $db_database, PDO::PARAM_STR, 7);
$stmt->execute() or exit(print_r($stmt->errorInfo(), true));

并显示错误消息:

  

数组([0] => 42000 [1] => 1064 [2] =>您的SQL中有错误   句法;查看与MySQL服务器版本对应的手册   在第1行''db_test''附近使用正确的语法

当我以错误的方式插入变量$db_database时,它工作正常,即直接插入sql语法。此外,我已经检查过magic_quotes是否已关闭,如果这对它有任何影响。现在我被卡住了,因为感觉我做的事情正确(但显然我没有)。任何人都可以看到错误吗?

2 个答案:

答案 0 :(得分:3)

  1. 您正在使用仿真,因为数据库甚至不允许您PREPARE这个(设置$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
  2. 您不能在参数中命名标识符(列/表/数据库名),函数等,这不是预处理语句的工作方式,您只能发送'true'字符串/浮点数/整数。简而言之,如果您需要某个地方的标识符或函数名称,它应该位于->prepare()之前的查询中。

答案 1 :(得分:1)

尝试以下方法:

$dbh->query("DROP TABLE `{$db_database}`");

在使用表而不是数据库时,您应该坚持使用prepare / execute。此外,在发出多个类似查询时,您只会看到准备和执行时的性能提升。引用From the PHP Manpage

  

对于需要多次发出的查询,您会意识到   如果使用准备PDOStatement对象,性能会更好   PDO :: prepare()并发出多次调用的语句   PDOStatement对象::执行()。