1

我正在尝试以我认为正确的方式绑定参数,但是我从 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));

并显示错误消息:

Array ( [0] => 42000 [1] => 1064 [2] => 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,了解在 ''db_test'' 附近使用的正确语法在第 1 行)

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

4

2 回答 2

3
  1. 您似乎正在使用仿真,因为数据库甚至不允许您PREPARE这样做(设置$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
  2. 您不能在参数中命名标识符(列/表/数据库名称)、函数等,这不是准备好的语句的工作方式,您只能发送“真”字符串/浮点数/整数。简而言之,如果你在某处需要一个标识符或函数名,它应该在你的查询之前->prepare()
于 2012-06-27T18:22:08.970 回答
1

尝试以下操作:

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

在使用表而不是数据库时,您应该坚持使用准备/执行。此外,在发出多个类似查询时,您只会看到准备和执行的性能提高。引用PHP 联机帮助页

对于需要多次发出的查询,如果您使用 PDO::prepare() 准备 PDOStatement 对象并通过多次调用 PDOStatement::execute() 发出语句,您将获得更好的性能。

于 2012-06-27T18:23:26.453 回答