Была такая же проблема, и в дополнение к ответу @sled 7 лет назад, есть возможность без шага call_user_func_array(array($stmt, 'bind_param'), $ids);
, а только один раз вызвать bind_params:
$ids = array(1,5,18,25);
// creates a string containing ?,?,?
$bindClause = implode(',', array_fill(0, count($ids), '?'));
//create a string for the bind param just containing the right amount of iii
$bindString = str_repeat('i', count($ids));
$stmt = $mysqli->prepare('SELECT * FROM somewhere WHERE `id` IN (' . $bindClause . ') ORDER BY `name`;');
$stmt->bind_params($bindString, ...$ids);
$stmt->execute();