2010-04-21 58 views
1

进出口使用像这样使用的PDOPDO和SQL陈述

$states = "'SC','SD'"; 
$sql = "select * from mytable where states in (:states)"; 
$params = array(':states'=>$states); 

,我用我的功能搜索续集

$result = $this->selectArrayAssoc($sql, $params); 

在我的selectArrayAssoc功能如下

public function selectArrayAssoc($sql, $params = array()) 
{ 
    try { 
    $sth = $this->db->prepare($sql); 
    $sth->execute($params); 
    $result = $sth->setFetchMode(PDO::FETCH_ASSOC); 
    return $sth->fetchAll(); 
    } catch(PDOException $e) { 
    print $e->getMessage(); 
    //Log this to a file later when in production 
    exit; 
    } 
} 

它并不需要引用的变量,我认为它在这种情况下会抑制如何处理这个问题。

+2

看到http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition – 2010-04-21 08:25:02

回答

3

当使用预先准备好的语句占位符(参数绑定)时,每个占位符的出现都只包含一个变量。

你正试图通过几个。发生了什么基本上是你的参数被转义了:你的:状态被替换为''''''','''''''\'SC \','SD \''内部,而不是只用原始'SC','SD'即可。

+0

让我怎么正是这里通过我的价值观,我从一个数组中解压出来,并在这里得到它们('sc','sd')。我尝试了各种引用方法,一切似乎都失败了。 – Sai 2010-04-21 08:37:05

+0

你不想引用他们。给定'$ states =''SC','SD'“;'和'$ sql =”select * from mytable where(:states)“;'中的状态,您需要'my sql =”select * from mytable ('SC','SD')“;”中的状态。看一看** Tom Haigh **与你联系的问题。 – pinkgothic 2010-04-21 08:43:28

+0

从其他问题中得到了答案,谢谢pinkgothic – Sai 2010-04-21 08:45:00

2

pinkgothic是绝对正确的。但是我认为你遇到了这个问题,你有一系列'状态'并且想要使用这个数组。您必须为查询中的每个值准备占位符。

$states = array('SC','SD'); 
$phArray = array(); 
$valArray = array(); 

foreach($ids AS $key=>$value){ 
    array_push($phArray, ':PH' . $key); 
    $valArray[':PH' . $key] = $value; 
} 

$sql = 'select * from mytable where states in (' . implode(',', $phArray) . ')'; 
$params = array($valArray); 
$result = $this->selectArrayAssoc($sql, $params);