Как использовать PHP массив с оператором sql IN?
у меня есть и массив с двумя значениями, и я хочу использовать его с оператором sql IN в запросе select.
вот структура моей таблицы
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)
но он не возвращает результаты.
12 ответов
необходимо преобразовать массив в строку, разделенную запятыми:
$condition = implode(', ', $arr);
и, кроме того, вы можете сначала избежать значений (если вы не уверены в вводе):
$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
$arr-это массив php, на sql server вам нужно отправить строку, которая будет проанализирована вам нужно, чтобы превратить Ваш массив в список, как 1, 2 и т. д..
для этого вы можете использовать функцию http://php.net/implode
поэтому перед запуском запроса попробуйте
$arr = implode ( ', ', $arr);
вам нужно взорвать свой массив с помощью', ' comma
$imploded_arr = implode(',', $arr);
SELECT * from table Where comp_id IN ($imploded_arr)
вы смешиваете PHP и SQL-для IN
оператор SQL, вам нужен такой формат, как:
SELECT * from table WHERE comp_id IN (1,2)
Итак, чтобы получить это в PHP, вам нужно сделать что-то вроде:
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"
имейте в виду, что это работает только если массив состоит из целых чисел. Вы должны избежать каждого элемента, если они являются строками.
вы можете только передать строку mysql как запрос, поэтому попробуйте это
mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
вам нужно фактически преобразовать ваш $arr
в строку. Самый простой способ с тем, что вы делаете, - использовать implode()
$query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';
прямо сейчас, если вы echo
ваш запрос, вы увидите, что вместо массива находясь в IN
заявление, это будет просто слово "массив"
необходимо преобразовать массив в строку для использования в запросе:
$list = implode(',', $arr);
тогда его можно использовать в предложении IN:
SELECT * from table Where comp_id IN ($list)
все люди здесь предлагают то же самое, но я получил предупреждение в WordPress из-за простой ошибки. вам нужно добавить запятые в вашу взорванную строку. чтобы быть точным что-то вроде этого.
$query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";
надеюсь, это поможет кому-то вроде меня. :)
согласно ответу @barryhunter, который работает только на массиве, содержащем только целое число:
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";
Я сделал некоторые настройки, чтобы заставить его работать для массива строк:
$sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
в нескольких предыдущих ответах есть некоторые риски SQL-инъекции. Это может быть хорошо, если вы полностью уверены $arr
дезинфицируется (и останется таким). Но если вы не совсем уверены, вы можете уменьшить такой риск, используя $stmt->bindValue
. Вот один из способов сделать это:
# PHP
$in_list = array();
for ($i = 0; $i < count($arr); $i++) {
$key = 'in_param_' . i;
$in_list[':' . $key] = array('id' => $arr[$i], 'param' => $key);
}
$keys = implode(', ', array_keys($in_list));
// Your SQL ...
$sql = "SELECT * FROM table where id IN ($keys)";
foreach ($in_list as $item) {
$stmt->bindValue($item['param'], $item['id'], PDO::PARAM_INT);
}
$stmt = $this->getConnection()->prepare($sql)->execute();