我能想到幾個解決方案。
一種解決方案可能是創建一個臨時表。對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