Удаление нескольких строк в MySQL из строки

#php #mysql #arrays #string #sql-delete

#php #mysql #массивы #строка #sql-удалить

Вопрос:

Я знаю, что об этом спрашивали несколько раз, но я просмотрел довольно много сообщений SO и не смог найти ничего, что могло бы мне помочь.

У меня есть функция javascript, которая будет добавлять значения к элементу, чтобы он отображался как таковой:

 value="1,3,5,16"
 

Однако значения могут быть совершенно разными в зависимости от того, что выберет пользователь. Затем это значение отправляется в php-файл для выполнения функции удаления MySQL из базы данных.

Каждое значение на самом деле является идентификационным номером записи в базе данных, которую необходимо будет удалить.

Я не могу заставить инструкцию MySQL распознавать несколько идентификационных номеров. Он распознает только один (первый).

HTML:

 <form method='post' action='delete_ids.php'>
   <input type='hidden' value="1,2,4,8,12,16" id='myvalues' name='myvalues'/>
   <button type='submit' id='submitBtn'>Submit</button>
</form>
 

PHP:

 <?php

   require("config.php");  // THIS IS MY DATABASE CONNECTION
   $x = $_POST['myvalues'];

   $result = "DELETE FROM `image_upload2` WHERE id IN ('$x')";
   $statement = $db->prepare($result);
   $count = $statement->execute();

?>
 

Он отлично работает, если есть только ОДНО значение, но когда есть несколько значений (запятые между ними), он удалит только первую запись, а не остальные. В приведенном выше примере будет удален только ‘id’ = 1.

Комментарии:

1. Поскольку это список идентификаторов, вам, конечно, не нужны одинарные кавычки $x , хотя я предполагаю, что в вашем примере ни одна строка вообще не будет удалена, поскольку ни у одного из них нет идентификатора '1,2,4,8,12,16' .

2. @GolezTrol <— Победитель! Спасибо

3. PS: имейте в виду, что кто-то может опубликовать другое значение, которое, возможно, подвергает вашу базу данных опасности (SQL-инъекция).

4. Вы уязвимы для атак с использованием SQL-инъекций . Наслаждайтесь использованием вашего сервера pwn3d.

5. Использование $x = (int)$_POST['myvalues']; может помочь, но использование подготовленных операторов или PDO с подготовленными операторами поможет. Также проверка с is_numeric() помощью является еще одним удобным вариантом.

Ответ №1:

Одинарные кавычки вокруг $x превращают это в строковый литерал (в контексте инструкции SQL, отправляемой в базу данных). Например, рассмотрим:

 DELETE FROM foo WHERE bar IN ('fee,fi,fo,fum');
 

База данных не заботится обо всех этих запятых в строковом литерале; база данных видит это как одну строку, один элемент внутри скобок. Эти символы-запятые являются просто частью строки.

Я думаю, что вы хотите, чтобы запятая интерпретировалась как часть синтаксиса SQL. Вероятно, вам нужен запрос вида:

 DELETE FROM `image_upload2` WHERE id IN (1,2,4,8,12,16);
 

—или—

 DELETE FROM `image_upload2` WHERE id IN ('1','2','4','8','12','16');
 

В этих примерах символы запятой рассматриваются как часть синтаксиса SQL, разделяющая литералы.


(И я лишь кратко упомяну здесь, что ваш текущий код уязвим для SQL-инъекций, но это ответ на другой вопрос.)

XKCD Эксплойты Mom

Ответ №2:

Это потому, что ваш идентификатор находится внутри символов ‘. У вас должны быть идентификаторы один за другим.

.. ГДЕ идентификатор В (‘1’, ‘2’, ‘3’, …);

Или просто удалите символ «.

Ответ №3:

Это потому, что вы хотите, чтобы ваш оператор sql выглядел так: УДАЛИТЬ ИЗ ‘image_upload2’, ГДЕ идентификатор в (‘1′,’2′,’4′,’8′,’12’,’16’)

Но у вас получается так: УДАЛИТЬ ИЗ ‘image_upload2’, ГДЕ идентификатор в (‘1,2,4,8,12,16’)

Итак, ваш sql-запрос считает, что ваш список представляет собой один элемент. Либо добавляйте кавычки, когда вы извлекаете значение из POST, либо когда вы добавляете элементы к значению ввода.

Ответ №4:

Я сам не эксперт по PHP, но, похоже, проблема в одинарных кавычках в вашей строке SQL. Похоже, что это станет:

 DELETE FROM `image_upload2` WHERE id IN ('1,2,4,8,12,16')
 

Когда это должно быть:

 DELETE FROM `image_upload2` WHERE id IN (1,2,4,8,12,16)