2012-08-29 73 views
1

結合逗號分隔的ID列表我準備發言時,我只能得到一個返回行,而我預計3爲什麼PDO在這裏只返回一行?

<?php 

$dbh = new PDO("mysql:host=127.0.0.1;dbname=database", "user", "password"); 
$stmt = $dbh->prepare('SELECT * FROM Person WHERE PersonID IN (:p)'); 
$stmt->bindValue(":p", "3,4,5"); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

?> 

<pre> 
<?php print_r($result); ?> 
</pre> 

如果我改變了語句來

SELECT * FROM Person WHERE PersonID IN (3,4,5) 

我回來3如預期的那樣,我很困惑!

+0

hav你在'bindValue()' – diEcho

+0

這個參數中嘗試了'PDO :: PARAM_STR',這並沒有工作 – johowie

回答

3

因爲bind基本上會將其用引號括起來,並將其視爲單個值。然後,MySQL將其轉換回一個整數,以便它仍然找到第一個項目的匹配項。

需要在做(:P1,:P2,:P3)和綁定值中的每個單獨

+0

嗯,ids的數量是變化的,所以我應該創建一個循環來動態地創建所有這些佔位符。或者還有更好的方法 – johowie

2

這應該工作,它動態地構建,你應該在語句中使用的佔位符:

$idList = array(3, 4, 5); 
$argList = join(',', array_fill(0, count($idList), '?')); 

$stmt = $dbh->prepare("SELECT * FROM Person WHERE PersonID IN ($argList)"); 
$stmt->execute($idList); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
+0

不是'PDO'在某些時候比'mysql_ *'查詢複雜而混亂嗎? – diEcho

+1

@diEcho可爭議是的,但是這個「複雜性」確實伴隨着防止sql注入的好處:) –

+0

在類似的註釋上,'Chris'在類似問題上的答案看起來不錯:[PHP的PDO:我可以綁定一個數組到一個IN()condition?](http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition) – johowie

相關問題