Answer the question
In order to leave comments, you need to log in
Can a SELECT query cause data to be deleted?
I wrote a php program that takes row numbers from a query string and removes them from a table.
Like this: mysite.com/delRows.php?q=4&row1=16&row2=11&row3=9&...
q is the number of rows to delete, followed by the indices of the rows to delete.
In this case four rows will be deleted at indexes 16, 11, 9 and 13
Everything works fine until I try to delete one row Like this
: mysite.com/delRows.php?q=1&row1=6
In this case the row should be deleted 6. And it works! But only for the first time.
If I change the index and send the request again, the program starts to give out some nonsense. It does not find the string (although it is definitely in the database). Moreover, the program, despite the fact that, in its opinion, the line does not exist, still deletes the line (!), although it has no way to do this (I have a trap there and the entire code block with the line deletion should be skipped if string does not exist). I understand that this sounds like nonsense.
I have already dislocated my whole brain, trying to figure out what the problem is. I am a novice programmer and, of course, I think first of all that I screwed up somewhere. I've been struggling with this problem for several days now. I can’t understand anything and now I’m already inclined to believe that this is a glitch on the SQL server itself.
And one more oddity. I can still delete lines one at a time if I copy the query string into a new browser tab each time. Then everything works well. But if I try to work in the same browser window - a single deletion does not work. But there are no problems with multiple deletion!
I can not understand anything. Help the fool, please.
Here is my code. I removed some functions from there that are not relevant.
<!DOCTYPE html>
<html>
<head>
<title>Удаление строк</title>
<meta charset="utf-8">
</head>
<body>
<?php
require_once 'L_connection.php'; // файл с данными для подключения к БД
// подключаемся к БД
$mysqli = new mysqli($host, $user, $password, $database);
if ($mysqli->connect_errno) {
echo "<span style='color:red;'>Ошибка при открытии БД:</span> ".$mysqli->connect_error;
exit; // завершаем программу
}
echo "Подключились к БД: ".$mysqli->host_info."<br>";
$TableName = 'Products'; // имя таблицы, с которой работаем
$nMin = 1; // номер, с которого начинается нумерация строк в строке запроса
$idMin = 2; // id в таблице не бывает меньше этого значения
// проверяем, есть ли в строке запроса простая row (без номера)
if (filter_input(INPUT_GET, 'row', FILTER_SANITIZE_NUMBER_INT)) {
/* Подготовка данных для удаления одной строки */
$nMax = $nMin; // чтобы цикл удалений сработал только один раз
$rowGet = 'row'; // формируем имя строки без номера
}
// если простого row нет, проверяем - указано ли в строке запроса количество строк для удаления
elseif ($qRow = filter_input(INPUT_GET, 'q', FILTER_SANITIZE_NUMBER_INT)) {
if ($qRow > 0) {
/* Подготовка данных для множественного удаления */
$nMax = $nMin + $qRow - 1; // вычисляем конечный индекс
$rowGet = "row".$nMin; // формируем имя строки с номером
}
else {
// неверно указано количество строк в строке запроса
echo "<span style='color:red;'>Неверно указано количество строк в строке запроса: $qRow! Программа остановлена.</span><br>";
closeDB(); // закрываем соединение с БД, печатаем содержимое таблицы и завершаем программу
}
}
else {
// неверный формат строки ввода
echo "<span style='color:red;'>Неверный формат ввода в строке запроса! Программа остановлена.</span><br>";
closeDB(); // закрываем соединение с БД, печатаем содержимое таблицы и завершаем программу
}
// считываем из строки запроса id строк для удаления и удаляем их поочередно
$i = $nMin;
while ($i <= $nMax)
{
// считываем id строки для удаления
$idDel = filter_input(INPUT_GET, "$rowGet", FILTER_SANITIZE_NUMBER_INT);
// проверяем, не является ли индекс удаляемой строки меньше минимального индекса, допустимого для таблицы
if ($idDel < $idMin) {
echo "<span style='color:red;'>Индекс строки для удаления указан неправильно! idDel = '$idDel' меньше idMin = $idMin. Прорамма остановлена.</span>".$mysqli->connect_error."<br>";
closeDB(); // закрываем соединение с БД, печатаем содержимое таблицы и завершаем программу
}
// подсчитываем количество строк в таблице ДО удаления
$rowQbefore = countRows();
// удаляем строку с указанным id
delRow($idDel);
// подсчитываем количество строк ПОСЛЕ удаления
$rowQafter = countRows();
// печатаем информацию об изменении количестве строк в таблице
echo "<span style='color:blue;'>Количество строк в таблице ДО удаления/ПОСЛЕ удаления: $rowQbefore/$rowQafter</span><br><br>";
$i++;
$rowGet = "row".$i; // формируем новое имя строки с номером
}
closeDB(); // закрываем соединение с БД, выводим на экран содержимое таблицы и завершаем программу
/* Функция удаления строки из таблицы */
function delRow($delId)
{
global $mysqli;
global $TableName;
$rows = -1; // для кода ошибки
// проверяем, существует ли строка с таким id в таблице
$query ="SELECT id FROM $TableName WHERE id = $delId LIMIT 1";
// для этого осуществляем запрос SELECT
if ( ( $result = $mysqli->query($query) ) ) {
echo "<span style='color:blue;'>Запрос $query выполнен успешно.</span><br>";
$rows = $result->num_rows; // количество строк
$result->close(); // очищаем результирующий набор
}
else {
echo "<span style='color:red;'>Ошибка при выполнении запроса $query при попытке удаления строки.</span> ".$mysqli->connect_error."<br>";
closeDB(); // закрываем соединение с БД, печатаем содержимое таблицы и завершаем программу
}
// если строка существует, то ответ на запрос должен быть 1, а если не существует - 0
switch ($rows) {
case 0:
// строка с таким id не существует
echo "<span style='color:red;'>Строки с id = $delId нет в таблице $TableName!</span> ".$mysqli->connect_error."<br>";
break;
case 1:
// строка с таким id существует
echo "<span style='color:blue;'>Строка с id = $delId существует в таблице $TableName.</span><br>";
// формируем запрос на удаление
$query = "DELETE FROM $TableName WHERE id = $delId LIMIT 1";
// осуществляем запрос DELETE
if (($delResult = $mysqli->query($query))) {
echo "<span style='color:blue;'>Запрос $query выполнен успешно.</span><br>";
echo "<span style='color:blue;'>Cтрока с id = $delId удалена из таблицы $TableName.</span><br>";
unset($delResult); // очищаем результирующий набор
}
else {
echo "<span style='color:red;'>Ошибка при осуществлении запроса $query.</span> ".$mysqli->connect_error."<br>";
closeDB(); // закрываем соединение с БД, печатаем содержимое таблицы и завершаем программу
}
break;
default:
if ($rows = -1) {
echo "<span style='color:red;'>Получен код ошибки -1! Запрос $query не удался. Программа остановлена.</span> ".$mysqli->connect_error."<br>";
}
else {
echo "<span style='color:red;'>Невероятная ошибка при попытке удаления строки. Количество строк в ответе на запрос $query = $rows.</span><br>";
}
closeDB(); // закрываем соединение с БД, печатаем содержимое таблицы и завершаем программу
}
}
</body>
</html>
Answer the question
In order to leave comments, you need to log in
I am inclined to believe that this is a glitch on the SQL server itself.
Can a SELECT query in MySql in PHP cause data to be deleted?
This is how you delete something from the database.
// приступим
$query ="SELECT id FROM $TableName WHERE id = $delId LIMIT 1";
// так так
$rows = $result->num_rows;
// оооооп
switch ($rows)
// интересно что же дальше
case 1:
// парам пам пам
$query = "DELETE FROM $TableName WHERE id = $delId LIMIT 1";
$mysqli->query("DELETE FROM table WHERE id IN (2, 4, 56, 654, 89569)")
I'm not a MySQL expert, but usually a transaction ends with a commit command.
Check where you explicitly complete (commit the transaction) or you must have auto-commit enabled in the connection properties. Although auto-commit is a bad option if you're deleting a lot of lines.
If the script is on the server, sql inject lovers can delete this data for you
I think the problem here is just not in sql and most likely not in the above php code. You need to dig towards the browser cache / web server (apache, nginx). Why writes errors, but at the same time deletes? Well, for example, the code is simply executed 2 times. In the first deleted, in the second - gave an error. This can also explain the behavior when copying to a new tab.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question