【问题标题】:Deleting a record returns SQLSTATE[42000] error删除记录返回 SQLSTATE[42000] 错误
【发布时间】:2015-05-27 10:50:53
【问题描述】:

我有一个用于从 MySQL 数据库中删除记录的 PHP 小脚本,它返回 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 ID='1'' 在第 1 行

【问题讨论】:

标签: php mysql sql pdo


【解决方案1】:

您的问题是:“为什么绑定表格不起作用?”我想你已经发现绑定表和列名不起作用了。

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

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

在您的情况下,有一个简单的解决方法,即直接在 SQL 中嵌入表名。我确实注意到这并不令人满意,因为生成的语句可能容易受到注入攻击。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多