Я использую PHP, MySQL и PDO.
$ids = '1,2,3';
У меня есть такой запрос, который работает:
SELECT *
FROM table
WHERE id IN($ids)
Это возвращает 3 строки, как ожидалось
Если я использую:
SELECT *
FROM table
WHERE id IN(:ids)
$stmt = $this->db->prepare($q);
$params = array('ids' => $ids);
$stmt->execute($params);
Он возвращает только 1 строку.
Как я могу привязать идентификаторы?
Согласно https://phpdelusions.net/pdo, я должен использовать:
$arr = [1,2,3];
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in)";
но как я могу поместить свои идентификаторы 1,2,3, которые хранятся в $ ids в $ arr = [1,2,3], потому что если я напишу
$arr = [$ids]
он в основном пишет
$arr = ['1,2,3']
вместо
$arr = [1,2,3]
Я понял:
$ids = '1,2,3';
Разверните строку $ ids в массив:
$ids_array = explode(',', $ids);
Это дает:
$ids_array[] = 1;
$ids_array[] = 2;
$ids_array[] = 3;
Создайте строку вопросительных знаков с разделителями-запятыми. Количество вопросительных знаков соответствует количеству значений массива
$in = str_repeat('?,', count($ids_array) - 1) . '?';
Это создает строку, которая выглядит так:
?,?,?
Поместите эту строку в sql
$q = "SELECT *
FROM table
WHERE id IN($in) ";
$stmt = $this->db->prepare($q);
Выполните запрос, передав массив как параметр
$stmt->execute($ids_array);