我已经用表中的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='✓' 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时,它会删除所有数据而不是该行。
答案 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删除,则在删除之前检查要删除的行的任何权限。否则,任何用户都可以修改表单以删除任何其他用户的行(如果这适用于您的情况)。