2012-03-09 103 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刪除操作,並在刪除之前檢查了要刪除的行上的任何權限。否則,任何用戶都可以修改表單以刪除任何其他用戶的行(如果這適用於您的情況)。