Perl dbi准备是错误的报价

时间:2015-08-24 08:28:22

标签: mysql perl dbi

我的代码与以下内容类似:

$sth = $dbh->prepare("CREATE TABLE IF NOT EXISTS ? (`id` bigint(100) unsigned NOT NULL AUTO_INCREMENT");
$sth->execute('test');

我最终得到了错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test'

从跟踪中我发现perl DBI在表名周围放了单引号,mysql不喜欢。如何告诉DBI不要放任何引号或放(`)而不是单引号?

2 个答案:

答案 0 :(得分:5)

这只是按照你的要求做的。给定字符串时,?等同于字符串文字。所以

SELECT * FROM Table WHERE field = ?

装置

SELECT * FROM Table WHERE field = 'test'

SELECT * FROM ?

装置

SELECT * FROM 'test'

您需要使用

$dbh->prepare("
   CREATE TABLE IF NOT EXISTS ".( $dbh->quote_identifier('test') )." (
             `id` bigint(100) unsigned NOT NULL AUTO_INCREMENT
          )
");

答案 1 :(得分:1)

您不能将占位符用于表名或列名。 PreparedStatement会将此值解释为字符串,并在其周围生成sinlge引号。