PHP / MYSQL按ID删除行

时间:2014-07-27 08:52:41

标签: php mysql

我有一个表单,要求用户输入他们想要从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法定剂量被解雇?

1 个答案:

答案 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驱动程序中使用)可以解决此问题。