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

标签 php mysql sql pdo

我有一个小的 PHP 脚本,用于从 MySQL 数据库中删除一条记录,它返回 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/

相关文章:

php - 如何用 eloquent "with"选择特定的列

php - Amazon EC2 - 建立数据库连接时出错 - mysql 已死但子系统已锁定

sql - 影响查询结果的括号

php - 即使扩展加载正常,redis 也会抛出错误

php - 我尝试使用 Android 应用程序的 php Web 服务从 mysql 数据库检索 blob(图像),但 blob 列仍然为空

mysql - 执行游标pymysql时加载%s变量时出错

SQL Server : SUM() of multiple rows including where clauses

sql - 甲骨文漏洞? SELECT 不返回重复项,SELECT 中的 INSERT 有重复的行

php - 为什么显示错误处理包 mysql-server-8.0 (--configure)?

MySQL 选择 GROUP BY 命令