- MySQL PHP – SELECT WHERE ()?
- mysql — сравнение с массивом (IN, NOT IN)
- Передача массива в запрос с использованием предложения WHERE
- 20 ответов
- Передача массива в запрос с помощью предложения WHERE
- Ответ 1
- Объяснение:
- Используйте IN() оператор SQL, чтобы проверить, существует ли значение в данном списке.
- Использование IN() оператора со строками.
- Ответ 2
- Ответ 3
MySQL PHP – SELECT WHERE ()?
Как вы можете видеть, у меня есть массив разных значений, но я хочу написать инструкцию MYSQL, которая проверяет, равен ли id любому из значений в массиве. Например, если строка имеет id 1, она вернет эту строку, то же самое для 4, 5 и 7. Длина массива может варьироваться в зависимости от характера программы, так что это проблема. Могу я просто сделать:
Или есть лучший способ?
Если бы я был неясен, пожалуйста, обратитесь за дополнительной информацией.
$sql = 'SELECT * FROM `table` WHERE `id` IN (' . implode(',', array_map('intval', $array)) . ')';
Вы ищете инструкцию IN() . Это будет проверяться, если заданное поле содержит любое из 1 или более значений.
SELECT * FROM `Table` WHERE `id` IN (1, 2, 3)
Вы можете использовать простой цикл для преобразования переменной $array в правильный формат. Не забудьте вспомнить SQL-инъекцию, если значения вашего массива поступают из передней части.
Просто используйте синтаксис ID IN () :
$sql = "SELECT FROM `table` WHERE `ID` IN (".implode(',',$array).")";
Вы можете написать свой запрос следующим образом:
select * from table where id in (1, 4, 6, 7)
Вы можете добавить столько значений, сколько вам нужно.
Вы можете SELECT WHERE id IN (item1, item2. ) . Просто запустите свой PHP-массив, чтобы построить массив для запроса.
Вы хотите использовать оператор IN :
$sql = ‘SELECT FROM WHERE id IN (‘ . implode(«,», $array) . ‘)’;
В MySQL может быть предел, сколько значений вы можете использовать в списке с оператором IN .
mysql — сравнение с массивом (IN, NOT IN)
При запросе к базе mysql иногда возникает необходимость сравнения со списком:
$query = "SELECT * FROM table WHERE name IN ('book', 'painting, 'drawing')"; $result = mysqli_query($connect,$query); while($r = mysqli_fetch_array($result)). >
В условии указывается, что необходимо выбрать все элементы таблицы table, в столбце name содержащие значение списка ‘book’, ‘painting, ‘drawing’.
Если у Вас вместо списка имеется массив который может содержать большое кол-во элементов, то запрос mysql можно изменить на следующий:
$query = "SELECT * FROM table WHERE name IN (".implode(',', $arr).")"; $result = mysqli_query($connect,$query); while($r = mysqli_fetch_array($result)). >
В условии указывается, что необходимо выбрать все элементы таблицы table, в столбце name содержащие значение массива $arr.
В случае если Вам наоборот выбрать все элементы кроме указанных в массиве, то используйте следующий пример:
$query = "SELECT * FROM table WHERE name NOT IN (".implode(',', $arr).")"; $result = mysqli_query($connect,$query); while($r = mysqli_fetch_array($result)). >
В условии указывается, что необходимо выбрать все элементы таблицы table в столбце name, кроме элементов указанных в массиве $arr.
implode — Объединяет элементы массива в строку
Подключение к базе данных mysql в php7
Функция mysqli_connect принимает три параметра: адрес сервера (хост), имя пользователя, пароль пользователя. $connect = mysqli_connect(«localhost», «user», «pass», «database»)or die (‘Нет связи с Базой Данных’); mysqli_query($connect, «SET NAMES utf8»); mysqli_connect — функция устанавливает соединение с сервером базы данных Пример запроса: $query = «SELECT * FROM tab»; $result = mysqli_query($connect,$query);
RSS лента на PHP
Перед написанием RSS ленты на PHP, необходимо ознакомиться с ее структурой. Ниже предоставлена структура RSS ленты у версии формата RSS 2.0. Ссылка на сайт ленты (ваш сайт)
Создаем файл sitemap.xml
какие страницы вашего сайта нужно индексировать; как часто обновляется информация на страницах; индексирование каких страниц наиболее важно. Файл Sitemap учитывается при индексировании сайта роботом, однако поисковые системы не гарантируют, что все URL, указанные в файле, будут добавлены в поисковый индекс. IF (isset($_POST[‘submit’])) < $sitemap = '../sitemap.xml'; $action = fopen($sitemap, 'w'); # Если файла нет, создаём его. Если файл есть, заменяем его на новый.
wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e) — отправка GET запроса с сохранением в базу данных
На базе wi-fi модуля NodeMcu v3 с чипом ESP8266 (ESP-12e) можно сделать (для примера) термометр на цифровом датчике 18B20, информация об температуре при помощи GET запроса будет отправятся в базу данных MySQL. Следующий скетч позволяет отправлять GET запросы на указанную страницу, в моем случае это test.php. #include #include #include #include OneWire oneWire(14);// D5 вход датчика.
Простая статистика кол-ва посещений страницы
Статистика просмотров страниц будет работать на связке MySQL + PHP. Так как скрипт php очень простой, то он будет считать все посещения страницы. В таблице базы данных необходимо создать дополнительное поле stat INT(10). require «connect.php»; $result = mysql_query («SELECT * FROM blog WHERE id=».$_GET[«id»]); while($r = mysql_fetch_array($result))< $stat =.
Передача массива в запрос с использованием предложения WHERE
Учитывая массив идентификаторов $galleries = array(1,2,5) , я хочу иметь SQL-запрос, который использует значения массива в своем предложении WHERE, например:
SELECT * FROM galleries WHERE values of array $galleries. eg. (1 || 2 || 5) */
Есть ли аналогичное решение для проблемы, как SELECT * FROM TABLE, ГДЕ ИМЯ НРАВИТСЯ (‘ABC%’ или ‘ABD%’ ИЛИ ..)
20 ответов
ОСТОРОЖНО! Этот ответ содержит серьезную уязвимость SQL injection. НЕ используйте примеры кода, представленные здесь, без необходимости очистки любого внешнего входа.
$ids = join("','",$galleries); $sql = "SELECT * FROM galleries WHERE id IN ('$ids')";
Идентификаторы все еще являются списком в кавычках, поэтому он выглядит, например, как «WHERE id IN (‘1,2,3,4’)». Вам нужно указывать каждый идентификатор по отдельности, или же расставлять кавычки внутри скобок.
Я просто добавляю предупреждение, что $galleries должен проверяться перед этим утверждением! Подготовленные операторы не могут обрабатывать массивы AFAIK, поэтому, если вы привыкли связывать переменные, вы можете легко сделать возможным внедрение SQL здесь.
для новичков в PHP, таких как я, может кто-нибудь объяснить или указать мне на ресурс, чтобы объяснить, почему это подвержено инъекции и как это должно быть сделано правильно, чтобы предотвратить это? Что, если список идентификаторов генерируется из запроса непосредственно перед выполнением следующего запроса, это все еще опасно?
Вы должны прочитать о внедрении SQL. В этом нет ничего плохого, все зависит от того, что содержат исходные данные, в этом примере мы не имеем представления о том, что содержит $ galleries, который затем превращается в $ ids. Если $ galleries содержит пользовательский ввод, такой как кавычки и т. Д., То потенциально опасно брать $ galleries и просто отбрасывать его в $ ids, а затем использовать его в SQL-запросе.
@ ministe2003 Представьте, что $galleries имеет следующее значение: array(‘1); SELECT password FROM users;/*’) . Если вы не очистите это, запрос будет читать SELECT * FROM galleries WHERE id IN (1); SELECT password FROM users;/*) . Измените имена таблиц и столбцов на те, которые есть в вашей базе данных, и попробуйте этот запрос, проверьте результаты. В качестве результата вы найдете список паролей, а не список галерей. В зависимости от того, как выводятся данные или что скрипт делает с массивом непредвиденных данных, это может привести к выводу в публичное представление . ой.
@ ministe2003 Итак, допустим, вы не собирались выводить данные, а подали их в другой запрос. Что ж, если мой введенный запрос не выбирал пароли, а DROP TABLE users; ой снова. Я, возможно, не получил никаких данных, но я просто довольно троллил на вашем сайте, а?
@ ministe2003 На этой странице есть несколько хороших ответов; псевдонимы Леви Моррисона и Ваш здравый смысл, чтобы назвать несколько. Используя параметры, или даже зацикливать массив и вручную очищать каждый элемент.
Спасибо, я собираюсь начать переписывать мой код с PDO и подготовленными утверждениями. Еще один вопрос: если вы выполняете запрос без параметров, вам все равно нужно подготовить и выполнить его таким же образом? Предположительно, нет риска внедрения запроса типа «SELECT * from MYTABLE».
На заданный вопрос это совершенно правильный и безопасный ответ. Кто бы ни жаловался, это небезопасно — как насчет сделки, когда я настроил этот конкретный код с $galleries как указано в вопросе, и вы используете его, используя вышеупомянутую «уязвимость SQL-инъекций». Если вы не можете — вы платите мне 200 долларов США. Как насчет этого?
Передача массива в запрос с помощью предложения WHERE
У меня есть массив идентификаторов, $galleries = array(1,2,5) , и я хочу создать SQL-запрос, который использует значения массива в своем предложении WHERE, например:
SELECT *
FROM galleries
WHERE значения из массива $galleries. eg. (1 || 2 || 5) */
Как я могу сгенерировать эту строку запроса для использования с MySQL?
Ответ 1
Использование PDO:
$in = join(‘,’, array_fill(0, count($ids), ‘?’));
$select =
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
$statement = $pdo->prepare($select);
$statement->execute($ids);
Использование MySQLi:
$in = join(‘,’, array_fill(0, count($ids), ‘?’));
$select =
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
$statement = $mysqli->prepare($select);
$statement->bind_param(str_repeat(‘i’, count($ids)), . $ids);
$statement->execute();
$result = $statement->get_result();
Объяснение:
Используйте IN() оператор SQL, чтобы проверить, существует ли значение в данном списке.
В целом это выглядит так:
expr IN (value. )
Мы можем создать выражение, которое будет помещено внутрь нашего массива. Обратите внимание, что внутри скобок должно быть хотя бы одно значение, иначе MySQL вернет ошибку; это равносильно тому, чтобы в нашем входном массиве было хотя бы одно значение. Чтобы предотвратить атаки с использованием SQL-инъекций, сначала сгенерируйте « ?» для каждого элемента ввода, чтобы создать параметризованный запрос. Здесь я предполагаю, что массив, содержащий ваши идентификаторы, называется $ids :
$in = join(‘,’, array_fill(0, count($ids), ‘?’));
$select =
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
Учитывая, что входной массив из трех элементов $select будет выглядеть так:
SELECT *
FROM galleries
WHERE id IN (?, ?, ?)
Снова обратите внимание, что « ?» для каждого элемента во входном массиве есть. Затем мы будем использовать PDO или MySQLi для подготовки и выполнения запроса, как указано выше.
Использование IN() оператора со строками.
Из-за связанных параметров легко переключаться между строками и целыми числами. Для PDO никаких изменений не требуется; для MySQLi измените str_repeat(‘i’, на, str_repeat(‘s’, если вам нужно проверять строки.
Ответ 2
Для MySQLi с функцией escape:
$ids = array_map(function($a) use($mysqli)
return is_string($a) ? «‘».$mysqli->real_escape_string($a).»‘» : $a;
>, $ids);
$ids = join(‘,’, $ids);
$result = $mysqli->query(«SELECT * FROM galleries WHERE id IN ($ids)»);
Для PDO с подготовленным выражением:
$qmarks = implode(‘,’, array_fill(0, count($ids), ‘?’));
$sth = $dbh->prepare(«SELECT * FROM galleries WHERE id IN ($qmarks)»);
$sth->execute($ids);
Ответ 3
Мы должны позаботиться об уязвимостях SQL-инъекций и null состоянии . Для числового массива используйте соответствующее преобразование типа, а именно intval, floatval или doubleval для каждого элемента. Для строковых типов, mysqli_real_escape_string(), которые при желании также могут применяться к числовым значениям. MySQL допускает числа, а также варианты даты в виде строки .
Чтобы соответствующим образом избежать значений перед переходом к запросу, создайте функцию, подобную этой:
function escape($string)
// Предполагается, что $db — это идентификатор ссылки, возвращенный mysqli_connect() или mysqli_init()
return mysqli_real_escape_string($db, $string);
>
Такая функция, скорее всего, уже будет доступна вам в вашем приложении или, может быть, вы уже ее создали.
Очистите массив строк, например:
$values = array_map(‘escape’, $gallaries);
Числовой массив можно обезопасить, используя intval, floatval или doubleval :
$values = array_map(‘intval’, $gallaries);
Затем, наконец, создайте where запроса:
$where = count($values) ? «`id` = ‘» . implode(«‘ OR `id` = ‘», $values) . «‘» : 0;
или же
$where = count($values) ? «`id` IN (‘» . implode(«‘, ‘», $values) . «‘)» : 0;
Поскольку массив также иногда может быть пустым, $galleries = array(); поэтому необходимо быть уверенным в наличие значений, так как IN() не допускает пустой список. Можно также использовать OR вместо этого, но проблема остается.
И добавляем в финальный запрос:
$query = ‘SELECT * FROM `galleries` WHERE ‘ . $where;
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.