我能想到几个解决方案。
一种解决方案可能是创建一个临时表。对in子句中的每个参数执行插入操作。然后对临时表进行简单的连接。
另一种方法可能是做这样的事情。
$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);
我怀疑,但没有证据,第一解决方案可能较大的列表会更好,而后者将工作较小的列表。
使@orrd快乐在这里是一个简洁的版本。
$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);
我怀疑我会避免两者的你建议的解决方案。准备好的语句让您的代码更安全。如果你有一个小列表,你的第一个解决方案似乎非常低效和浪费。 – Zoredache 2008-11-29 09:40:03
我同意我认为这些想法可能会刺激别人的想法。 :) – smarthall 2008-11-29 12:17:58
对于SQL Server,请参阅[参数化SQL IN子句?](http://stackoverflow.com/q/337704/90527) – outis 2012-04-04 12:02:27