我有一个小的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
参数的绑定,并在语句中直接使用$table
变量,那么脚本正在运行:
$deleteRecordQuery = "DELETE FROM $table WHERE ID=:ID";
所以ID的绑定有效。为什么表的绑定不起作用?
返回消息是:
SQLSTATE [42000]:语法错误或访问冲突:1064您有 SQL语法错误;查看与您的手册相对应的手册 MySQL服务器版本,用于在''Osobe'WHERE附近使用正确的语法 第1行ID ='1'
答案 0 :(得分:2)
你的问题是:“为什么表格没有约束力呢?”我想你已经发现绑定表和列名不起作用。
我认为从SELECT
语句而不是DELETE
语句来理解这是最容易理解的。处理SQL语句基本上分两个阶段进行。第一阶段是“准备”(或“编译”阶段)。第二个是“执行”阶段。绑定变量的值不适用于“准备”阶段,仅适用于“执行”阶段。
“准备”阶段确定需要访问哪些数据,执行路径将是什么(例如索引的使用)以及结果集的外观。如果查询引擎不知道正在访问哪些表或列,则它无法在编译阶段执行必要的工作。因此,准备语句需要表格和列。
在您的情况下,有一个简单的修复,即直接在SQL中嵌入表名。我注意到这并不令人满意,因为结果语句可能容易受到注入攻击。
答案 1 :(得分:1)
这是不可能的。你不能绑定表名