2017-06-16 126 views
0

當重複如果我運行下面的代碼:PDO綁定PARAMS循環

$query = "select * from city where region = :region and country = :country"; 
    $stmt = db->prepare($query); 
    $region = '06'; 
    $country = 'ad'; 
    $params = array(":region" => $region, ":country" => $country); 
    foreach ($params as $key => $value) { 
     $stmt->bindParam($key, $value, PDO::PARAM_STR); 
    } 
    $stmt->execute(); 
    return $stmt->fetchAll(); 

我在查詢日誌中看到的是:

select * from city where region = 'ad' and country = 'ad' 

這是爲什麼? 需要注意的是,如果我只是參數綁定了一個又一個喜歡在這裏不會發生:

$stmt->bindParam(':region', $region, PDO::PARAM_STR); 
$stmt->bindParam(':country', $country, PDO::PARAM_STR); 
+2

因爲你覆蓋了語句,而不是添加到它。你可以'執行($ params)' –

+2

@JayBlanchard,它爲我工作,謝謝! – user2703790

+0

IIRC bindParam通過引用綁定,而不是通過值綁定,因此如果稍後更改變量值,則會自動執行查詢。 – Maerlyn

回答

3

在你最終覆蓋綁定,而不是添加到它的foreach()聲明。既然你有陣列,你可以執行:

$query = "select * from city where region = :region and country = :country"; 
$stmt = db->prepare($query); 
$region = '06'; 
$country = 'ad'; 
$params = array(":region" => $region, ":country" => $country); 
$stmt->execute($params); // put the array here 
return $stmt->fetchAll(); 
+0

看起來Jay的解決方案的替代方案是: 'foreach($ params as $ key =>&$ value)....' – user2703790