2012-10-12 74 views
1

我有以下代碼在PHP中查詢基於客戶端發送的數組的數據庫。php pdo綁定多個值問題

$limit = $_POST['limit']; 
$userArray = json_decode($_POST['arr'], true); 
$queryPlaceholders= implode(',', array_fill(0,count($userArray), '?')); 
$stmt = $db->prepare("SELECT * FROM tableA 
          WHERE tableA.id IN (".$queryPlaceholders.") 
          LIMIT ?"); 
foreach($userArray as $k => $val){ 
    $stmt->bindParam(($k+1), $val); 
} 
$stmt->bindValue(count($userArray) + 1, (int)trim($limit), PDO::PARAM_INT); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
echo $result; 

此代碼似乎有錯誤。如果我發送包含值11 & 17的陣列,查詢似乎只能用值17運行,而不是兩個11和17

如果我print_r($userArray)我得到Array ( [0] => 11 [1] => 17 )

,所以我知道PHP有正確的陣列。但是,運行此查詢與上面的代碼,並運行下面的查詢產生不同的答案:

SELECT * FROM tableA 
WHERE tableA.id IN (11,17) 
LIMIT 10 

當運行上面的代碼,這似乎INFACT運行此查詢?

SELECT * FROM tableA 
WHERE tableA.id IN (17) 
LIMIT 10 

我也放在語句在foreach循環,告訴我該陣列的兩個要素(11 & 17)被綁定到$語句

回答

3

的問題是,你正在使用bindParam()

將PHP變量綁定到用於準備語句的SQL語句中的相應命名或問號佔位符。與PDOStatement::bindValue()不同,該變量被綁定爲參考,並且僅在調用PDOStatement::execute()時才被評估。

由於$val是在foreach循環的每次迭代改變,它最終是當最後執行查詢爲每個佔位符是相同的。