我试着准备一个pragma声明:
$sth = $dbh->prepare (q{pragma table_info(?)})
但是我收到以下错误:
DBD::SQLite::db prepare failed: near "?"
准备字符串有什么问题?
答案 0 :(得分:4)
来自DBI docs:
对于大多数驱动程序,占位符不能用于任何元素 声明会阻止数据库服务器验证 语句并为其创建查询执行计划。
因此,我只能假设这种情况下的占位符阻止数据库服务器(或本例中的自包含数据库引擎)验证该语句。
即使语句可以准备好,根据SQLite PRAGMA
docs,看起来table_info
期待一个不带引号的表名参数。 DBD :: SQLite希望quote all bind values by default,因此无论如何都会导致单独的问题。
答案 1 :(得分:3)
您可以像处理一样准备PRAGMA语句,但是您的语句有语法错误。
给定字符串时,?
等同于字符串文字。所以
SELECT * FROM Table WHERE field = ?
装置
SELECT * FROM Table WHERE field = 'test'
和
PRAGMA table_info(?)
装置
PRAGMA table_info('test')
问题是你想要提供
PRAGMA table_info(test)
因此,您需要使用
$dbh->prepare("PRAGMA table_info(".$dbh->quote_identifier('test').")")
答案 2 :(得分:0)
你问“这是准备的一般限制吗,它只能用于值而不能用于标识符?或者在我的例子中准备不知道上下文?”
您只能绑定(准备)值,而不能绑定表名或列名。对于所有相关的数据库都是如此。
使用参数的准备(绑定)使sqlite可以重用执行计划,因此它使sqlite更快。