PHP中SQLite表的占位符

PHP中SQLite表的占位符,php,sqlite,pdo,Php,Sqlite,Pdo,我有一个我想使用的查询,我想用于其他select查询。 是否可以进行如下选择查询: SELECT * FROM ? WHERE id = ?; 然后像这样绑定值: $stmt->bindValue(1, $table, PDO::PARAM_STR); $stmt->bindValue(2, $id, PDO::PARAM_INT); 问题是当我这样做时,我从一个异常中得到了这个$database->errorInfo() HY000 1靠近“”的语法错误 我试着取出表格占位

我有一个我想使用的查询,我想用于其他select查询。
是否可以进行如下选择查询:

SELECT * FROM ? WHERE id = ?;
然后像这样绑定值:

$stmt->bindValue(1, $table, PDO::PARAM_STR);  
$stmt->bindValue(2, $id, PDO::PARAM_INT);
问题是当我这样做时,我从一个异常中得到了这个
$database->errorInfo()

HY000 1靠近“”的语法错误


我试着取出表格占位符,它确实有效。可以按我的方式做吗,或者我需要有单独的功能吗?

简短回答:


长答覆:

请参阅手册。有一条语句:
这必须是目标数据库服务器的有效SQL语句。
这意味着您的DB后端必须支持您使用的准备好的语句语法

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


因此,您不能在您希望运行的时候将表名绑定到prepared语句中,因为当您
prepare
语句时,DB需要表名。这就是您收到该消息的原因:DB要求所有的表名都出现在准备查询中。

为什么不能将它们设置为变量<代码>从$strTable中选择*,其中id=$iID我不认为这是在PHP中完成的方式…当然。顺便说一句,关于你问题的第一条评论。这几乎就是PHP的实现方式。它应该是
SELECT*FROM$strTable,其中id=?
。这实际上将转换为类似于
select*from表的内容,其中id=?
,这是一个有效的预处理语句。但是要确保
$strTable
不是从用户输入中获取的,因为从输入中获取它会使您的系统容易受到SQL注入的攻击。Yea决定对每件事进行单独的查询。不要注射!