我有一个小的 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/