簡體   English   中英

mysql DELETE查詢異常行為

[英]Mysql DELETE query strange behaviour

我已經用表中的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的行上單擊刪除時,它將刪除所有數據,而不僅僅是該行。

您的問題是您用單引號引起了'ID'引用。 在MySQL中,與任意字符串相比,整數0等於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刪除,則在刪除之前,請檢查要刪除的行的所有權限。 否則,任何用戶都可以修改表單以刪除其他任何用戶的行(如果這適用於您的情況)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM