占位符对于SQLite表在PHP中

时间:2011-08-17 08:46:02

标签: php sqlite pdo

我有一个想要使用的查询,我想重新用于其他选择查询 是否可以使用这样的选择查询:

SELECT * FROM ? WHERE id = ?;

然后绑定像这样的值:

$stmt->bindValue(1, $table, PDO::PARAM_STR);  
$stmt->bindValue(2, $id, PDO::PARAM_INT);

问题是,当我这样做时,我从PDOException

获得此$database->errorInfo()
  

HY000 1附近“?”语法错误。

我尝试取出表占位符,它确实有效。是可以按照我的方式进行,还是需要单独的功能?

1 个答案:

答案 0 :(得分:2)

简短回答:


答案很长:

请参阅PDO::prepare手册。有一个声明:This must be a valid SQL statement for the target database server.这意味着您的数据库后端必须支持您使用的预准备语句语法。

据我所知,mysql和任何其他数据库都不允许在FROM子句中出现绑定变量。其原因在于准备陈述的概念。当您致电prepare时,准备好的声明正在数据库中准备好。这意味着DB planner 为查询构建计划,因此可以使用不同的参数执行多次,而无需一次又一次地构建。要构建计划,计划员需要知道受影响的表,调用的函数,使用不同获取和连接策略的机会(索引扫描/嵌套循环/等)等。

因此,在您希望它运行时,您无法将表名“绑定”到预准备语句中,因为在您prepare语句时,DB需要表名。这就是您收到该消息的原因:数据库要求所有表名称出现在准备查询中。