Je peux penser à quelques solutions.
Une solution pourrait être de créer une table temporaire. Faites une insertion dans le tableau pour chaque paramètre que vous auriez dans la clause in. Effectuez ensuite une simple jointure sur votre table temporaire.
Une autre méthode pourrait être de faire quelque chose comme ça.
$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$parmcount=count($parms); // = 4
$inclause=implode(',',array_fill(0,$parmcount,'?')); // = ?,?,?,?
$sql='SELECT age, name FROM people WHERE id IN (%s)';
$preparesql=sprintf($sql,$inclause); // = example statement used in the question
$st=$dbh->prepare($preparesql);
$st->execute($parms);
Je soupçonne, mais je n'ai aucune preuve, que la première solution pourrait être meilleure pour les grandes listes, et la seconde fonctionnerait pour les petites listes.
Pour faire plaisir à @orrd voici une version laconique.
$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$st=$dbh->prepare(sprintf('SELECT age, name FROM people WHERE id IN (%s)',
implode(',',array_fill(0,count($parms),'?'))));
$st->execute($parms);