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 - 通过 php 输入处理上传时减少 PHP 中的内存消耗

php - 是否可以将消息推送到使用应用程序 ID 注册的所有设备?

php - 如何使用 PHP 删除回车符?

c# - SqlCommand INSERT INTO 从 datagridview 到 SQL DB 表

sql - SQLite中Where子句中有多个条件时如何使用 "Or"语句?

mysql - MySQL中如何重置表的自增列

javascript - 立即将差异和随机日期转换为秒

javascript - 无法使用 vue 和 laravel 后端发布记录

mysql - sql连接表,其中1列有逗号

mysql - 我无法在阔叶中使用 em.merge 存储实体