gpt4 book ai didi

php - 删除记录返回 SQLSTATE[42000] 错误

转载 作者:行者123 更新时间:2023-11-29 01:55:25 26 4
gpt4 key购买 nike

我有这个用于从 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 参数的绑定(bind),并在语句中直接使用 $table 变量,脚本就会工作:

$deleteRecordQuery = "DELETE FROM $table WHERE ID=:ID";

因此 ID 的绑定(bind)有效。为什么表格的绑定(bind)不起作用?

返回信息是:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Osobe' WHERE ID='1'' at line 1

最佳答案

您的问题是:“为什么表格的绑定(bind)不起作用?”我想您已经发现绑定(bind)表名和列名不起作用。

我认为这是最容易理解的SELECT 语句,而不是DELETE 语句。处理 SQL 语句基本上分两个阶段进行。第一阶段是“准备”(或“编译”阶段)。第二个是“执行”阶段。绑定(bind)变量的值不适用于“准备”阶段,仅适用于“执行”阶段。

“准备”阶段决定了需要访问哪些数据、执行路径是什么(例如索引的使用)以及结果集的样子。如果查询引擎不知道正在访问哪些表或列,那么它就无法在编译阶段完成必要的工作。因此,准备报表需要表格和列。

对于您的情况,有一个简单的解决方法,就是将表名直接嵌入到 SQL 中。我确实注意到这并不令人满意,因为生成的语句可能容易受到注入(inject)攻击。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com