php pdo保存查询数据

时间:2011-10-01 09:24:14

标签: php mysql sql pdo

: Call to a member function rowCount() on a non-object in C:\wamp\www\prjy\classes\user.php on line 34

第29-32行

$this->sth = $this->dbh->prepare("SELECT id, userlevel FROM users WHERE username = ? AND password = ?");
$this->sth->bindParam(1, $username);
$this->sth->bindParam(2, $password);
$this->data = $this->sth->execute();

第34行

if ($this->data->rowCount() > 0)

我想将结果对象保存在另一个变量中,所以我可以执行另一个查询,并根据结果,返回正确的结果...不能将结果保存,(execute())在变量中喜欢上面?我怎么解决呢?

5 个答案:

答案 0 :(得分:1)

PDOStatement::rowCount()返回由相应PDOStatement对象执行的最后一个 DELETE,INSERT或UPDATE 语句影响的行数。

对于大多数数据库,PDOStatement::rowCount()不会返回受影响的行数 通过SELECT声明。相反,
 使用PDO::query()发出SELECT COUNT(*)语句,其语句与预期的SELECT语句相同,
然后使用PDOStatement::fetchColumn()检索将返回的行数。

<强> Reference

答案 1 :(得分:1)

如何使用:

count($this->data)

行数?

答案 2 :(得分:1)

Matt is correct; PDOStatement::execute()返回一个布尔值。

diEcho is partially correct关于PDOStatement::rowCount();文档也说:

  

如果关联的PDOStatement执行的最后一条SQL语句是   一个SELECT语句,一些数据库可能会返回行数   由该声明返回。但是,不保证这种行为   适用于所有数据库,不应依赖于便携式数据库   应用

看到你正在使用MySQL,这个工作,但请记住,这可能因此无法移植到其他RDBMS

如果不考虑可移植性,PDOStatement::rowCount()就是您所需要的,因此您需要使用它:

if ($this->sth->rowCount() > 0)

但是,您需要保存多个PDOStatement个对象。所以我建议做类似以下的事情:

$stmt1 = $this->dbh->prepare( /* first select statement */ );
$stmt1->bindParam(1, $username);
$stmt1->bindParam(2, $password);

$stmt2 = $this->dbh->prepare( /* second select statement */ );
$stmt2->bindParam(1, $username);
$stmt2->bindParam(2, $password);

if( $stmt1->execute() && $stmt2->execute() )
{
    if( $stmt1->rowCount() > 0 )
    {
        $result = $stmt1->fetchAll();
    }
    else if( $stmt2->rowCount() > 0 )
    {
        $result = $stmt2->fetchAll();
    }
}

或类似性质的东西,取决于您希望其中任何一个陈述的结果的标准。

PS:请注意,为了使其正常工作,您必须激活buffered queries for MySQL in PDO(如果尚未激活):

$db = new PDO(
          'dsn connection string',
          'username',
          'password',
          array( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true )
      );

答案 3 :(得分:0)

在调用rowCount()之前,您必须执行另一个测试:

$this->sth = $this->dbh->prepare("SELECT id, userlevel FROM users WHERE username = ? AND password = ?");
$this->sth->bindParam(1, $username);
$this->sth->bindParam(2, $password);
if($this->data = $this->sth->execute()) {
   if ($this->data->rowCount() > 0) {
      // do something here ..
   }
}

答案 4 :(得分:0)

您没有测试错误。如果出现错误,PDOStatement::execute()会返回false。你应该测试一下!

if (!$this->data = $this->sth->execute()) { echo "ERROR!"; print_r($this->sth->errorInfo()); die(); }

或类似的东西。这可能是原因。