Ответ 1
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";
У меня есть и массив с двумя значениями, и я хочу использовать его с оператором 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)
Но он не возвращает результаты.
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";
вам нужно преобразовать массив в строку, разделенную запятыми:
$condition = implode(', ', $arr);
Кроме того, вы можете сначала избежать значений (если вы не уверены в этом):
$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
$ arr - это массив php, на сервер sql вам нужно отправить строку, которая будет проанализирована, вам нужно превратить ваш массив в список типа 1, 2 и т.д.
Для этого вы можете использовать функцию http://php.net/implode
поэтому перед запуском запроса попробуйте
$arr = implode ( ', ', $arr);
Вам нужно взорвать массив с помощью ',' comma
$imploded_arr = implode(',', $arr);
SELECT * from table Where comp_id IN ($imploded_arr)
вы можете передать строку в mysql как запрос, поэтому попробуйте
mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
Вы смешиваете PHP и SQL - для оператора SQL IN
вам нужен формат:
SELECT * from table WHERE comp_id IN (1,2)
Итак, чтобы получить это в PHP, вам нужно сделать что-то вроде:
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"
Имейте в виду, что это работает только в том случае, если массив содержит целые числа. Вы должны избегать каждого элемента, если они являются строками.
Вам нужно что-то вроде:
$sql = "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();
Если ваш массив из целых чисел:
$searchStringVar = implode(",",$nameIntAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";
Если ваш массив из строк:
$searchStringVar = implode("','",$nameStringAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";