【问题标题】:PHP PDO CRUD class Call to a member function rowCount() on a non-objectPHP PDO CRUD 类调用非对象上的成员函数 rowCount()
【发布时间】:2012-06-18 19:31:39
【问题描述】:

我刚刚开始使用 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);

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

【问题讨论】:

  • 如果您传递参数$id,您应该使用准备好的查询
  • 好的,我将 SQL 直接放入 phpmyadmin 并得到了我预期的结果,但是当直接在脚本中执行 var_dump 时它返回了一个 bool(false),所以我猜我的$rowCount 函数我就是不知道是什么。

标签: php pdo


【解决方案1】:

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

【讨论】:

  • 嗨 Rick,谢谢让我走上正轨,我在转储时得到了这个:bool(false)
  • 如果 $query 是 bool(false) 这意味着查询字符串在某种程度上是不正确的。您还应该 var_dump 查询字符串并确保它是正确的,并且还应该 var_dump $this->link 以确保它也是正确的。
【解决方案2】:

有几件事要检查:

来自PHP manual

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2016-02-09
    • 2015-04-29
    相关资源
    最近更新 更多