2014-12-02 80 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