Php Mysql删除查询异常行为

Php Mysql删除查询异常行为,php,html,mysql,forms,html-table,Php,Html,Mysql,Forms,Html Table,我用表中的MySQL数据填充了一个html表单 我在该表中包含了一个表单,如果提交该表单,将从MySQL表中删除该行数据 这是用我的表中的MySQL数据创建并填充表的代码(遗漏了db连接代码和其他我认为不相关的代码) 现在,它可以正常工作,但只删除ID为0的数据行。例如,每当我尝试删除ID为2的一行数据时,它都会说它成功地删除了数据,但实际上并没有删除它。但当我在id为0的行上单击delete时,它会删除所有数据,而不仅仅是该行 你的问题是你用单引号引用了'ID'。与any字符串相比,整数0在M

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

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

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


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

你的问题是你用单引号引用了
'ID'
。与any字符串相比,整数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...
}
请注意,上述代码与原始代码的不同之处在于,它会在继续执行其余操作之前检查
$\u POST['delete\u id']
的存在及其有效性。在原始版本中,您可以设置
$ID
$Delete
的值,而不检查它们是否存在。实际上没有必要检查
$Delete
,因为您只有另一个表单输入


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

您的问题是您用单引号引用了
'ID'
。与any字符串相比,整数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...
}
请注意,上述代码与原始代码的不同之处在于,它会在继续执行其余操作之前检查
$\u POST['delete\u id']
的存在及其有效性。在原始版本中,您可以设置
$ID
$Delete
的值,而不检查它们是否存在。实际上没有必要检查
$Delete
,因为您只有另一个表单输入


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

尝试在变量(字符串)中构建查询并输出它,并注释掉mysql\u查询和重定向。然后尝试手动运行这个输出的查询(phpmyadmin),这可能会告诉您是什么wrong@Ryan-您在哪里读到必须引用列名?我真的很感兴趣,如果有一个教程或什么东西教人们这样做。我真的不记得诚实。令人惊讶的是,这样一件小事能带来巨大的不同。好吧,它只是告诉你这不是一件小事。对于有经验的用户来说,这意味着它是一个数据字符串。对于没有经验的人来说,这是一件小事,几乎毫无意义。最近我看到很多问题围绕着同一个问题——使用单引号来引用列名而不是“字符”,所以我想知道是否有教程教人们使用单引号。提示:使用s可以使html blob更易于阅读并消除重复的回显。试着在变量中构建查询(字符串)并输出它,注释掉mysql_查询和重定向。然后尝试手动运行这个输出的查询(phpmyadmin),这可能会告诉你什么是wrong@Ryan-你从哪里读到你必须引用列名?我真的很感兴趣,是否有一个教程或什么东西可以教人们这样做。我真的不记得说实话了。这么小的事情能带来很大的不同真是太神奇了。好吧,它只是告诉你这不是一件小事。对于有经验的用户来说,这意味着它是一个数据字符串。对于没有经验的用户来说,这是一件小事,几乎没有意义。最近我看到很多问题都围绕着同一个问题——使用单引号来引用列名而不是“字符”,所以我想知道是否有教程教人们使用单引号。提示:我们使html blob更易于阅读并消除重复的回声。