我的代码与以下内容类似:
$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不要放任何引号或放(`)而不是单引号?
答案 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引号。