首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql DELETE查询奇怪的行为

Mysql DELETE查询奇怪的行为
EN

Stack Overflow用户
提问于 2012-03-09 21:53:32
回答 1查看 742关注 0票数 0

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

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

这是用我的表中的MySQL数据填充该表的代码(遗漏了db连接代码和其他我认为不相关的代码)。

代码语言:javascript
复制
 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的代码(缺少数据库连接代码)

代码语言:javascript
复制
$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的行上单击delete时,它会删除所有数据,而不仅仅是该行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-09 21:57:12

您的问题是您用单引号引用了'ID'。在MySQL中,整数0与any字符串的比较结果为TRUE,并且带引号的'ID'是字符串文字而不是列名,因此在传入ID=0时会删除,但在任何其他情况下都会失败。

ID中删除引号

代码语言:javascript
复制
mysql_query("DELETE FROM link_building WHERE ID=" . $ID);
//------------------------------------------^^^^

此外,您的代码容易受到SQL注入的攻击。请确保正确过滤$ID的值。

代码语言:javascript
复制
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删除,请确保在删除行之前检查要删除的行的所有权限。否则,任何用户都可以修改表单以删除任何其他用户的行(如果这适用于您的情况)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9635143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档