我有一个用于从MySQL数据库中删除记录的小PHP脚本,它返回SQLSTATE[42000]。

include("connectDB.php");

$recordID = $_POST["ID"];
$table = $_POST["table"];
$URL = $_POST["URL"];

$deleteRecordQuery = "DELETE FROM :table WHERE ID=:ID";
$deleteRecord = $conn->prepare($deleteRecordQuery);
$deleteRecord->bindParam(':table',$table);
$deleteRecord->bindParam(':ID',$recordID);
$deleteRecord->execute();

header("Location: ".$URL);

如果我注释掉:table参数的绑定,并在语句中直接使用$table变量,脚本就可以工作了:
$deleteRecordQuery = "DELETE FROM $table WHERE ID=:ID";

所以ID的绑定是有效的。为什么桌子的装订不好?
返回消息是:
SQLSTATE[42000]:语法错误或访问冲突:1064
SQL语法错误;请查看与
在“Osobe”附近使用正确语法的MySQL服务器版本,其中
第1行的ID=1“

最佳答案

你的问题是:“为什么装订桌子不起作用?”我想您已经知道绑定表和列名不起作用了。
我认为这是最容易理解的SELECT语句,而不是DELETE语句。处理SQL语句基本上分为两个阶段。第一阶段是“准备”(或“编译”阶段)。第二个阶段是“执行”阶段。绑定变量的值不适用于“准备”阶段,仅适用于“执行”阶段。
“准备”阶段确定需要访问哪些数据、执行路径(例如索引的使用)以及结果集的外观。如果查询引擎不知道正在访问哪些表或列,则它无法在编译阶段执行必要的工作。因此,准备语句需要表和列。
在您的例子中,有一个简单的修复方法,就是将表名直接嵌入到SQL中。我确实注意到,这并不令人满意,因为结果语句可能很容易受到注入攻击。

关于php - 删除记录将返回SQLSTATE [42000]错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30480342/

10-12 20:54