我有一个想要使用的查询,我想重新用于其他选择查询 是否可以使用这样的选择查询:
SELECT * FROM ? WHERE id = ?;
然后绑定像这样的值:
$stmt->bindValue(1, $table, PDO::PARAM_STR);
$stmt->bindValue(2, $id, PDO::PARAM_INT);
问题是,当我这样做时,我从PDOException
获得此$database->errorInfo()
HY000 1附近“?”语法错误。
我尝试取出表占位符,它确实有效。是可以按照我的方式进行,还是需要单独的功能?
答案 0 :(得分:2)
简短回答:否。
答案很长:
请参阅PDO::prepare手册。有一个声明:This must be a valid SQL statement for the target database server.
这意味着您的数据库后端必须支持您使用的预准备语句语法。
据我所知,mysql和任何其他数据库都不允许在FROM
子句中出现绑定变量。其原因在于准备陈述的概念。当您致电prepare
时,准备好的声明正在数据库中准备好。这意味着DB planner 为查询构建计划,因此可以使用不同的参数执行多次,而无需一次又一次地构建。要构建计划,计划员需要知道受影响的表,调用的函数,使用不同获取和连接策略的机会(索引扫描/嵌套循环/等)等。
因此,在您希望它运行时,您无法将表名“绑定”到预准备语句中,因为在您prepare
语句时,DB需要表名。这就是您收到该消息的原因:数据库要求所有表名称出现在准备查询中。