PHP中SQLite表的占位符
我有一个我想使用的查询,我想用于其他select查询。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 * 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决定对每件事进行单独的查询。不要注射!