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

时间:2015-05-27 10:50:53

标签: 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参数的绑定,并在语句中直接使用$table变量,那么脚本正在运行:

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

所以ID的绑定有效。为什么表的绑定不起作用?

返回消息是:

  

SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在''Osobe'WHERE附近使用正确的语法   第1行ID ='1'

2 个答案:

答案 0 :(得分:2)

你的问题是:“为什么表格没有约束力呢?”我想你已经发现绑定表和列名不起作用。

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

“准备”阶段确定需要访问哪些数据,执行路径将是什么(例如索引的使用)以及结果集的外观。如果查询引擎不知道正在访问哪些表或列,则它无法在编译阶段执行必要的工作。因此,准备语句需要表格和列。

在您的情况下,有一个简单的修复,即直接在SQL中嵌入表名。我注意到这并不令人满意,因为结果语句可能容易受到注入攻击。

答案 1 :(得分:1)

这是不可能的。你不能绑定表名