0

我刚刚开始使用 PDO 来摆脱 mysqli 但遇到了问题。我正在学习教程,我想从数据库中返回一个数组,但出现以下错误:

致命错误:在第 27 行的 C:\xampp\htdocs\phptuts\crud\core\managedb.class.php 中的非对象上调用成员函数 rowCount()

这是我的 managedb.php 类:

<?php

class ManageDatabase
{

    public $link;

    function __construct()
    {
        include_once('database.class.php');
        $conn = new database;
        $this->link = $conn->connect();
        return $this->link;
    }

    function getData($table_name, $id=null)
    {
        if(isset($id))
    {
        $query = $this->link->query("SELECT * FROM $table_name WHERE id = '$id' ORDER BY id ASC");
    }
    else
    {
        $query = $this->link->query("SELECT * FROM $table_name ORDER BY id ASC");
    }

    $rowCount = $query->rowCount();
    if($rowCount >= 1)
    {
        $result = $query->fetchAll();
    }
    else
    {
        $result = 0;
    }
    return $result;
}

}

然后我只是使用以下代码来尝试获得响应:

<?php

include_once('../core/managedb.class.php');
$init = new ManageDatabase;

$table_name = 'users';
$data = $init->getData($table_name);

print_r($data);

这是我收到错误的时候,有什么想法吗?

4

2 回答 2

1

我想var_dump($query)在这$rowCount = $query->rowCount();条线之前看看它实际上是什么,因为它显然不是一个对象。我猜它要么是 NULL 要么是空的,因为整体$this-link->query(<sql statement>);没有返回你所期望的

于 2012-06-18T19:55:31.703 回答
0

有几件事要检查:

PHP 手册

PDO::query() 返回一个 PDOStatement 对象,如果失败则返回 FALSE。

您需要测试查询是否成功,如果不成功,为什么。您可以使用 PDO 的errorInfo功能检查错误:

if ($query == false) 
{
    print_r($this->link->errorInfo());
    exit();
}

另一件需要注意的是,rowCount()在 PDO 中,从 INSERT / UPDATE / DELETE 类型的语句中返回受影响的行。对于 SELECT,您可能会获得行数,也可能不会。该手册建议使用单独的查询来查找行数,但在您的实例中,如果您从 fetchAll() 得到任何返回,则测试可能会更容易:

$result = $query->fetchAll();
if (!empty($result)) 
{
    return $result;
} 
else 
{
    return 0;
}
于 2012-06-19T05:29:22.307 回答