【问题标题】:Mysql DELETE query strange behaviourMysql DELETE 查询异常行为
【发布时间】:2012-03-26 23:13:57
【问题描述】:

我已经使用表中的 MySQL 数据填充了一个 html 表单。

我在该表中包含了一个表单,如果提交该表单,应该会从 MySQL 表中删除该行数据。

这是创建用我的表中的 MySQL 数据填充表的代码。(错过了数据库连接代码和其他我认为不相关的代码)。

 while($row_data=mysql_fetch_array($table_data)){
    echo "<tr>";
    echo "<td>" . $row_data['ID'] . "</td>";
    echo "<td>" . $row_data['Site'] . "</td>";
    echo "<td>" . $row_data['Date'] . "</td>";
    echo "<td>" . $row_data['Target_Site'] . "</td>";
    echo "<td>" . $row_data['Target_Contact_Email'] . "</td>";
    echo "<td>" . $row_data['Target_Contact_Name'] . "</td>";
    echo "<td>" . $row_data['Link_Type'] . "</td>";
    echo "<td>" . $row_data['Link_Acquired'] . "</td>";
    echo "<td>" . $row_data['Notes'] . "</td>";
    echo "<td>" . $row_data['Link_URL'] . "</td>";
    echo "<td></td>";
    echo "<td><form action='delete.php' method='post'><input type='hidden' name='delete_id' value=" .  $row_data['ID'] . "><input type='submit' value='&#x2713;' name='delete' style='background:none;' /></form></td>";
    echo "</tr>";
    }

正如您在该代码中看到的那样,最后有一个表格数据,它是一个表单,如果单击它意味着删除该给定行。从表格中可以看出,动作是delete.php。

这是delete.php的代码(遗漏了数据库连接代码)

$ID = $_POST['delete_id'];
$Delete = $_POST['delete'];



if(isset($Delete)){ 

mysql_query("DELETE FROM link_building WHERE 'ID'=" . $ID);

header("location:link_building.php?success2=1");
}else{
header("location:link_building.php?fail2=1");
}

现在,它有点工作,但只删除 ID 为 0 的数据行。例如,每当我尝试删除 ID 为 2 的数据行时,它说它成功删除了数据,但没有实际上删除它。但是,当我在 id 为 0 的行上单击删除时,它会删除所有数据,而不仅仅是该行。

【问题讨论】:

  • 尝试在变量(字符串)中构建查询并输出它,并注释掉 mysql_query 和重定向。并尝试手动运行这个输出的查询(phpmyadmin),这可能会告诉你出了什么问题
  • @Ryan - 你在哪里读到你必须引用列名?如果有教程或其他东西可以教人们这样做,我真的很感兴趣。
  • 我真的不记得说实话了。令人惊讶的是,这么小的事情如何产生巨大的影响
  • 嗯,它只是告诉你这不是一件小事。对于有经验的用户来说,这意味着它是一串数据。对于没有经验的人来说,这是一件小事,几乎没有任何意义。这些天我看到很多问题都围绕着同样的问题 - 使用单引号来引用列名而不是 ` 字符,所以我想知道是否有教程教人们使用单引号。
  • 提示:使用HEREDOCs 使该html blob 更易于阅读并消除重复的回声。

标签: php html mysql forms html-table


【解决方案1】:

您的问题是您用单引号引用了'ID'。与任何字符串相比,整数 0 在 MySQL 中等同于 TRUE,而引用的 'ID' 是字符串文字而不是列名,因此当您传入 ID=0 时会发生删除,但在所有其他情况下都会失败。

删除ID中的引号:

mysql_query("DELETE FROM link_building WHERE ID=" . $ID);
//------------------------------------------^^^^

此外,您的代码容易受到 SQL 注入的影响。请务必正确过滤$ID 的值。

if (isset($_POST['delete_id']) && !ctype_digit($_POST['delete_id'])) {
   // Non-integer value! error! bail out!
}
else {
   $ID = $_POST['delete_id'];
   // Do your query...
}

请注意,上面的代码与您的原始代码不同,它会在继续执行其余操作之前检查$_POST['delete_id'] 的存在及其有效性。在您的原始文件中,您设置了 $ID$Delete 的值,而不检查它们是否存在。实际上没有必要检查$Delete,因为您只有另一个表单输入。

最后一点:我们在这篇文章中看不到任何身份验证代码,但请确保如果您从表单输入中接受 SQL 删除,则在删除之前检查正在删除的行的任何权限。否则,任何用户都可以修改表单以删除任何其他用户的行(如果这适用于您的情况)。

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多