: 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())在变量中喜欢上面?我怎么解决呢?
答案 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(); }
或类似的东西。这可能是原因。