2012-03-09 106 views
0

我已经填充了表格中的MySQL数据的HTML表单。Mysql DELETE查询奇怪的行为

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

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

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"); 
} 

,它有点工作,但只能删除每当我尝试在具有0的ID数据行例如删除一行ID为2的数据,它表示它成功删除了数据,但实际上并没有删除它。但是,当我点击删除id为0的行时,它将删除所有数据而不是该行。

+0

尝试在变量(字符串)中构建查询并输出它,并注释掉mysql_query&redirect。并尝试手动运行这个输出的查询(phpmyadmin),这可能会告诉你什么是错的 – 2012-03-09 13:59:33

+0

@Ryan - 你在哪里读过你必须引用列名?我真的很感兴趣,如果有教程或教导人们这样做的东西。 – 2012-03-09 14:02:20

+0

我真的不记得说实话。它惊人的如此如此小的事情可以造成很大的差异 – RSM 2012-03-09 14:08:48

回答

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