2014-12-02 86 views
0

我試圖從數據庫中獲取的查詢,但是,我有bindParam(:name)值不被束縛的問題,當我回聲$sqlprint_r($stmtTwo)WHERE條款規定WHERE :name,而不是從字符串$wherefinal與PDO bindParam /值

我的代碼是:

$sql= "SELECT Species.Species_ID 
    FROM Species 
    JOIN ( 
     SELECT Species.Species_ID, COUNT(*) AS mynum 
     FROM Species_Opt LEFT JOIN Species ON (Species.Species_ID = Species_Opt.SO_Species_ID) 
     WHERE :name 
     GROUP BY SO_Species_ID HAVING mynum = 6 
     ) AS mytable ON Species.Species_ID = mytable.Species_ID"; 
$stmtTwo = $pdo->prepare($sql); 
$stmtTwo->bindParam(':name', $wherefinal); 
$stmtTwo->execute(); 

$wherefinal SQL語句之前被定義,被定義爲:

$where = ""; 
foreach ($_POST as $k => $v){ 
    $where .= "(Species_Opt.SO_Option_ID = $v) OR "; 
}; 
$wherefinal = substr($where, 0, strrpos($where, " OR ")); 

而且迴盪的時候,$wherefinal顯示:

(Species_Opt.SO_Option_ID = 4) OR (Species_Opt.SO_Option_ID = 12) OR (Species_Opt.SO_Option_ID = 17) OR (Species_Opt.SO_Option_ID = 20) OR (Species_Opt.SO_Option_ID = 21) OR (Species_Opt.SO_Option_ID = 32) 

$v來自單選按鈕的值m是通過不同的SQL語句和smarty生成的表單。

+1

簡單,你不能綁定列'WHERE:name' – 2014-12-02 02:37:55

+0

@ Fred-ii-,我相信O P至少知道它不起作用,這就是爲什麼他問,而你的重複鏈接無助於解決他的問題。這個鏈接應該是一個更好的建議:http://stackoverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition,因爲他的問題可以縮短到'Species_Opt.SO_Option_ID IN (?,?,?,....)' – invisal 2014-12-02 02:46:34

+0

@invisal我已重新打開它,但是如果其他人關閉了[基於您的鏈接](http://stackoverflow.com/q/920353/)的問題,另一個重複,它會超出我的控制。 – 2014-12-02 02:48:38

回答

0

第一件事首先,你需要建立你的佔位符部分

$placeholder = str_repeat('?,', count($_POST) - 1) . '?'; 

然後用它來構建一個完整的SQL查詢

$sql= "SELECT Species.Species_ID 
     FROM Species 
     JOIN ( 
      SELECT Species.Species_ID, COUNT(*) AS mynum 
      FROM Species_Opt LEFT JOIN Species ON 
       (Species.Species_ID = Species_Opt.SO_Species_ID) 
      WHERE Species_Opt.SO_Option_ID IN ({$placeholder}) 
     GROUP BY SO_Species_ID HAVING mynum = 6 
     ) AS mytable ON Species.Species_ID = mytable.Species_ID"; 

之後,你可以將值綁定到每個佔位符

$sh = $pdo->prepare($sql); 

$i = 1; 
foreach($_POST as $value) { 
    $sh->bindValue($i, $value); $i++; 
} 
$sh->execute(); 
+0

非常感謝 – user2861154 2014-12-02 04:56:28