我有一个表单,要求用户输入他们想要从DB中的考试表中删除的考试ID。
我遇到的问题是,即使用户输入了在DB中不匹配的id,脚本也会完全忽略条件而触发else块。
我可能已经实现了这个错误,但据我所知,我无法看到我错在哪里,但我怀疑在我的if语句中我做错了。
以下是我的表单,要求用户输入要删除的考试ID
<form method = "post" action = "examDeleted.php">
<h1 class = "title">Delete Exam</h1>
<div class = "formContent">
<labeL for = "id">ID</labeL>
<input type = text name = "id" class = "input">
<br><br>
<br><br><br>
<input type = "submit" value = "Delete">
</div>
</form>`
这将传递给包含sql查询的函数,以从表中删除记录
<?php
include('dbLogin.php');
$id = trim($_POST['id']);
if($id != "")
{
$delete = "DELETE FROM exams WHERE id = '$id'";
$results = mysql_query($delete);
if(!$results)
{
die ("Cannot delete data from the database! " + mysql_error());
echo '<br><br>';
echo '<a href="home.html">Return</a>';
}
else
{
echo"Exam: $id has been deleted";
}
}
else
{
echo "No data entered! " . mysql_error();
}
?>
正如你可以看到条件!$results
,对我来说它是说如果记录不存在则杀死查询,否则确认删除。是否有一个明显的原因,为什么内部if法定剂量被解雇?
答案 0 :(得分:1)
DELETE
语句也被视为成功。 (这就是SQL的工作原理;它不是特定于MySQL的。)
我想说你应该使用mysql_affected_rows找出已删除的行数,但正如其他人指出的那样,you shouldn't be using the mysql_ functions at all, anyway。
您的代码目前非常容易受到SQL注入攻击。如果有人要将以下ID发送到examDeleted.php(请记住,他们不必使用您的表单来执行此操作,因此可以绕过任何客户端检查):
' OR 1 = 1 OR id = '
...我认为它可能会删除表中的每个考试,因为你的SQL语句最终会被删除:
DELETE FROM exams WHERE id = '' OR 1 = 1 OR id = ' '
...这是一个有效的DELETE语句,其WHERE子句匹配所有行。
使用参数化查询(可在mysqli或PDO等非弃用的MySQL驱动程序中使用)可以解决此问题。