Как использовать массив php с оператором sql IN? - PullRequest
30 голосов
/ 08 марта 2012

У меня есть и массив с двумя значениями, и я хочу использовать его с оператором sql IN в запросе выбора.

Вот структура моего стола

id comp_id
1   2
2   3
3   1

У меня есть массив $arr, который имеет два значения Array ( [0] => 1 [1] => 2 )

Я хочу получить запись comp_id 1 и comp_id 2. Поэтому я написал следующий запрос.

SELECT * from table Where comp_id IN ($arr)

Но это не возвращает результаты.

Ответы [ 13 ]

60 голосов
/ 08 марта 2012

Поскольку у вас есть простые целые числа можно просто сделать ...

$sql = "SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")";

(поскольку это продолжает появляться, некоторая дополнительная информация ...)

При работе со строками (в частности, ненадежный ), можно выполнить

$sql = "SELECT * FROM table WHERE comp_id IN 
        ('".implode("','",array_map('mysql_real_escape_string', $arr))."')";

но не справляется со значениями типа NULL. И добавит кавычки вслепую вокруг числовых значений, что не работает, если используется строгий режим mysql. https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#idm140082377917056 ... т.е. ТОЛЬКО используйте это, если вы действительно работаете со строками (например, VARCHAR), а НЕ с числовыми столбцами.

Нужно для вызова чего-то вроде mysql_real_escape_string, чтобы любые кавычки в строках правильно обрабатывались! (а также предотвращение SQL-инъекций!)


... если вы хотите работать с номерами ненадежных , можете использовать intval или floatval

$sql = "SELECT * FROM table WHERE comp_id IN (".implode(",",array_map('intval', $arr)).")";

для дезинфекции ввода. (без кавычек вокруг ввода.

14 голосов
/ 08 марта 2012

вам нужно преобразовать массив в строку через запятую:

$condition = implode(', ', $arr);

И, кроме того, вам может потребоваться сначала экранировать значения (если вы не уверены в вводе):

$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
5 голосов
/ 08 марта 2012

Вам нужно взорвать ваш массив с помощью ',' запятой

$imploded_arr = implode(',', $arr);

SELECT * from table Where comp_id IN ($imploded_arr)
5 голосов
/ 08 марта 2012

$ arr - массив php, серверу sql необходимо отправить строку, которая будет проанализирована вам нужно превратить ваш массив в список вроде 1, 2 и т. д.

для этого вы можете использовать функцию http://php.net/implode

поэтому перед запуском запроса попробуйте

$arr = implode ( ', ', $arr);
4 голосов
/ 08 марта 2012

вы можете только передать строку в MySQL как запрос, поэтому попробуйте это

mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
3 голосов
/ 08 марта 2012

Вы смешиваете PHP и SQL - для оператора IN SQL вам нужен формат, например:

SELECT * from table WHERE comp_id IN (1,2)

Итак, чтобы получить это в PHP, вам нужно сделать что-то вроде:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"

Имейте в виду, что это работает, только если массив состоит из целых чисел.Вы должны экранировать каждый элемент, если они являются строками.

2 голосов
/ 05 июля 2018

Согласно ответу @barryhunter, который работает только с массивом, содержащим только целое число:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";

Я сделал несколько настроек для работы с массивом строк:

$sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
2 голосов
/ 16 августа 2017

Все люди здесь предлагают то же самое, но я получил предупреждение в WordPress из-за простой ошибки. Вам нужно добавить запятые к вашей взорванной строке. Если быть точным, что-то вроде этого.

$query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";

Надеясь, это поможет кому-то вроде меня.:)

2 голосов
/ 08 марта 2012

Вам необходимо преобразовать массив в строку для использования в запросе:

$list = implode(',', $arr);

Затем его можно использовать в предложении IN:

SELECT * from table Where comp_id IN ($list)
2 голосов
/ 08 марта 2012

Вам нужно конвертировать $arr в строку. Самый простой способ с тем, что вы делаете, это использовать implode()

$query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';

Прямо сейчас, если вы echo запросе, вы увидите, что вместо массива в выражении IN это будет просто слово "Array"

...