BindParam()无法正常工作

时间:2016-08-29 10:41:39

标签: php pdo bindparam

在我的DB类中,我有一个方法query(),它将SQL语句和参数作为参数,并在数据库中运行它们。

    // the parameters are the sql statement and the values, returns the the current object
    // the result set object can be accessed by using the results() method

    public function query($sql, $params = array()) {

        $this->_error = false;  // initially the error is set to false

        if($this->_query = $this->_pdo->prepare($sql)) {

            // if the parameters are set, bind it with the statement
            if(count($params)) {
                foreach($params as $param => $value) {
                    $this->_query->bindParam($param, $value);
                }
            }

            // if the query is successfully executed save the resultset object to the $_results property
            // and store the total row count in $_count
            if($this->_query->execute()) {
                $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                $this->_count = $this->_query->rowCount();
            } else {
                $this->_error = true;
            }
        }

        return $this;

    }

这就是我调用方法的方法

$db->query("SELECT * FROM users WHERE username = :username AND id = :id ", array(':username' => 'sayantan94', ':id' => 1));

但是当我print_r()结果集时,我得到一个空数组。但如果我这样做

$db->query("SELECT * FROM users WHERE username = :username", array(':username' => 'sayantan94'));

或者

$db->query("SELECT * FROM users WHERE id = :id ", array(':id' => 1));

我得到了正确的结果。我的代码出了什么问题??

2 个答案:

答案 0 :(得分:2)

除了在其他答案中所说的内容之外,您的大部分代码都是无用的或有害的。实际上,您只需要这几行

public function query($sql, $params = array())
{
    $query = $this->_pdo->prepare($sql);
    $query->execute($params);
    return $query; 
}

它将完成你的功能所做的一切,但没有那么多的代码,没有令人讨厌的副作用。想象一下,您将在循环中运行嵌套查询。在第二次查询执行后,什么成为你的$ this-> _results变量?在这样的函数中,不应该有与特定查询相关的类变量。

此外,

  • 无需手动检查准备结果 - PDO将自行抛出异常
  • 不需要_error变量,因为它非常无用,而PDO自身的异常更有用且信息更丰富
  • 无需在循环中绑定 - execute()可以一次绑定所有参数
  • 无需测试$params数组 - execute()也会接受空数组。
  • 无需返回fetchAll() restult - 您可以随时将其链接起来$data = $db->query($sql, $params)->fetchAll();
  • 不需要rowCount() - 您可以随时只计算从fetchAll()返回的数组

答案 1 :(得分:1)

你的foreach是假的,$ value的价值,因为bindParam需要& $变量,做一个参考,试试这个:

if(count($params)) {
   foreach($params as $param => &$value) {
       $this->_query->bindParam($param, $value);
   }
}

http://php.net/manual/en/pdostatement.bindparam.php