Mysql DELETE запрос странное поведение - PullRequest
0 голосов
/ 09 марта 2012

Я заполнил html-форму данными MySQL из таблицы.

Я включил в эту таблицу форму, которая при отправке должна удалить эту строку данных из таблицы 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");
}

Теперь он работает, но удаляет только те строки данных, которые имеют идентификатор 0.Каждый раз, когда я пытаюсь удалить строку данных с идентификатором 2, например, он говорит, что успешно удалил данные, но на самом деле не удаляет их.Но когда я нажимаю удалить в строке с идентификатором 0, он удаляет все данные, а не только эту строку.

1 Ответ

6 голосов
/ 09 марта 2012

Ваша проблема в том, что вы указали 'ID' с одинарными кавычками.Целое число 0 по сравнению с любой строкой соответствует значению TRUE в MySQL, а заключенный в кавычки '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 из формы ввода, что вы проверяете любые разрешения для строки, удаляемой перед ее удалением.В противном случае любой пользователь может изменить форму, чтобы удалить строки других пользователей (если это применимо к вашей ситуации).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...