2012-05-30 41 views
0

可能重複:
PHP PDO: Can I bind an array to an IN() condition?用於「IN」語句的PHP PDO bindParam用於變量/字符串...?

好吧,這是真的困擾我。我如何在PHP的PDO中爲SQL「IN」語句綁定一個參數(它有多個值)?

這裏是基礎知識...

$allow = "'red', 'blue'"; 

SELECT * FROM colors WHERE type IN (:allow); 

$stmt->bindParam(':allow', $allow); 

當我插上$本身允許的,但試圖綁定,並使用時也能正常工作:讓它無法工作。有人知道爲什麼嗎?

注意:我確實有其他變量(不是字符串)正確設置PDO的工作,我只是沒有包括它,因爲它是不必要的。

任何幫助表示讚賞,謝謝。

+3

請參閱[PHP的PDO:我可以綁定到一個IN()條件的數組?)(http://stackoverflow.com/questions/920353/PHP-PDO-可以-I-結合 - 一個陣列到一個合狀態)。您必須單獨綁定每個值,否則數據庫將嘗試匹配字符串「'紅色','藍色'」,而不是兩個字符串「紅色」和「藍色」。 – deceze

+3

任何這些都是爲什麼那些聲稱參數化查詢是解決所有生活問題的解決方案悄悄溜進黑暗的原因...... –

回答

4

在評論中說了些什麼是正確的。這是我以前做過的一種方式。

基本上,您通過循環數組值並添加綁定名稱來創建sql字符串的IN部分。

$allow = array('red', 'blue'); 

$sql = sprintf(
    "Select * from colors where type in (%s)", 
    implode(
     ',', 
     array_map(
      function($v) { 
       static $x=0; 
       return ':allow_'.$x++; 
      }, 
      $allow 
     ) 
    ) 
); 

這導致Select * from colors where type in (:allow_0,:allow_1)

然後,只需環路$allow陣列和使用bindValue到每個變量綁定。

foreach($allow as $k => $v){ 
    $stmnt->bindValue('allow_'.$k, $v); 
} 

我意識到deceze鏈接到了一個類似的例子問題之前添加此。我在這裏留下這個,因爲它顯示瞭如何使用命名綁定變量而不是?

0

綁定函數將整個列表視爲一個字符串,而不是多個離散值。