MySQL PDO计数函数返回错误的多个WHERE条件

时间:2013-05-07 03:05:29

标签: php mysql pdo

只要我在WHERE子句中只指定一个项目,此函数就可以正常工作。如果有多个,则总是返回0.

这是功能:

function count_rows($table, $where=array()){
    $sql = "SELECT COUNT(*) FROM `$table`";
    if(!empty($where)){
        $sql .= " WHERE (";
        foreach($where as $key=>$value){
            $sql .="`". $key . "`=:w_" . $key . " AND ";
        }
        $sql = substr($sql, 0, -4);
        $sql .= ") ";
    }
    $stmt = $this->conn->prepare($sql);
    foreach($where as $key=>$value){
        $stmt->bindParam(":w_".$key, $value);
    }
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute();
    $this->stmt = $stmt; 
    return $this->stmt->fetchColumn();

}

例如,以下内容返回list_id设置为$ list_id的行数:

$email_count = count_rows("emails", array("list_id"=>$list_id));

然而,在WHERE子句中使用两个条件会导致它返回0,无论如何:

$optout_count = count_rows("emails", array("list_id"=>$list_id, "optout"=>"1"));

我试过围绕WHERE子句使用和不使用括号,我使用的调试函数正确地显示了查询。我也尝试在数组中的值周围加引号。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

PDOStatement::bindParam 引用绑定到变量。与PDOStatement::bindValue()不同,变量绑定为引用,并且仅在调用PDOStatement::execute()时进行评估。

<小时/> 的 解决方案:

只需更改

$stmt->bindParam(":w_".$key, $value);

$stmt->bindValue(":w_".$key, $value);