2011-08-12 144 views
11

我的代碼:綁定參數WHERE IN子句與PDO

$myArray = implode($myArray, ','); 
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)'); 
$sth->bindParam(':ids', $myArray); 
$sth->execute(); 
$result = $sth->fetch(); 
echo $sth->rowCount(); 

始終顯示爲1的數,但是當我跳過參數化和剛纔添加的變量本身在它的地方,我得到一個準確計數。這裏發生了什麼?

回答

12

您不能像這樣綁定IN子句的參數。在$ myArray的字符串將只算一個值,就像如果你這樣做:

SELECT foo FROM bar WHERE ids IN ('1,2,3') 

即使有三個逗號分隔值,數據庫中讀取它們作爲唯一一個字符串值。

您需要手動將IN列表插入到舊式的查詢方式中。

'SELECT foo FROM bar WHERE ids IN (' . $myArray .')' 

很遺憾沒有其他辦法。最起碼到現在。

+7

認真?準備好的陳述不能處理?這是多麼的蹩腳:/ – hoppa

+0

要注意sql注入。 – Dani

+5

@hoppa:他們可以像這樣處理它:'id IN(:id1,:id2,:id3 ...)',你得到了模式。你最好用老式的方法。 – Maerlyn

6

我知道這個問題是舊的,但這個工作對我來說:

$arrayOfValues = array(1,2,3,4,5); 
$questionMarks = join(",", array_pad(array(), count($arrayOfValues), "?")); 
$stmt = $dbh->prepare("update some_table set end_date = today where value_no in ($questionMarks)"); 
$stmt->execute($arrayOfValues); 
0

你爲什麼不使用此解決方案?

https://stackoverflow.com/a/39353278/1834212

它解析其是對綁定佔位符和它的元素的值的數組,在你只需要供給陣列的IN的情況下,然後將其將解析陣列和修改字符串爲您使用動態生成的綁定名稱,然後饋送數組的這些值