Mysql DELETE查询奇怪的行为

时间:2012-03-09 13:53:32

标签: php html mysql forms html-table

我已经用表中的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的行上单击delete时,它会删除所有数据而不是该行。

1 个答案:

答案 0 :(得分:6)

您的问题是您使用单引号引用了'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删除,则在删除之前检查要删除的行的任何权限。否则,任何用户都可以修改表单以删除任何其他用户的行(如果这适用于您的情况)。