Название RSS ленты

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-массив, чтобы построить массив для запроса.

Читайте также:  Get return type 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. Ссылка на сайт ленты (ваш сайт) Краткое описание ленты (3-4 предложения) .

Создаем файл 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;

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

Оцените статью