#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-инъекций, но это ответ на другой вопрос.)
Ответ №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)