в $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 ...