@1klass001

Как вывести информацию с БД массивом?

Есть две функции которые относятся к делу.

$db = Db::getInstance();
$sql = "SELECT * FROM `users` WHERE `ref` = ? ";
$stmt = $db->prepare($sql);
$stmt->execute([$id]);
$result = $stmt->fetchAll(PDO::FETCH_COLUMN);
return $result;


$id = user::$user['id'];
$my_ref = user::getInvite($id);
$db = Db::getInstance();
$query = $db->prepare('SELECT * FROM payments WHERE users_id = :ref ORDER BY id DESC');
$query->execute(['ref' => $my_ref[0]]);
return $query->fetchAll();


не как не могу добиться того чтобы в $query->execute(['ref' => $my_ref[0]]); данные массивом передались.
Конкретно нужно вставить список тех ID которые получили из первой функции.
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
@rPman
в $query->execute(['ref' => $my_ref[0]]); данные массивом передались.

к сожалению биндинг в pdo не умеет работать с массивами, каждый параметр должен быть конечным объектом (число., строка...)

так же чтобы условие в sql обрабатывало массив нужно использовать выражение
select ... from ... where id in (1,2,3,4,...)

поэтому чтобы решить указанную задачу нужно формировать sql запрос по старинке (без использования prepare и биндингов), естественно аккуратно к значениям, либо валидировать их что они являются числами, а если должны быть строки - то правильно экранировать

$sql='select ... from ... where id in ('.implode(',',$id_array).')'

Так же проверь что массив идентификаторов не пустой, так как иначе будет ошибка в sql

p.s. осторожно, количество значений в 'id in' лимитировано (кажется 1000), если инужно больше, то придется создавать временную таблицу, заливать в нее искомые идентификаторы и строить запрос с left join

Еще я встречал похожий метод но с использованием биндингов, когда sql запрос генерировался вида:
select ... from ... where id in (?,?,?,?,...)
с нужным количеством ? тогда передав массив напрямую в execute можно получить результат, лимит на количество ? еще меньше, это определяется драйвером базы данных.

p.p.s. и совсем сверху на засыпку методика, ее имеет смысл использовать когда со стороны клиента фильтруемых данных больше чем 1 поле (например 2 массива точнее таблица с несколькими колонками) и очень не хочется заполнять в базе временную таблицу с этими данными (это очень сильно роняет производительность) то можно сформировать внутри sql таблицу из константных данных:
select ... from ...,
(
  select ? as col1,? as col2
  union select ?,?
  union select ?,?
...  
) x where ...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
для этого надо SQL учить не по видео с юутубы, а по учебникам
открыть для себя джойн, и узнать, что все делается одним запросом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы