致命错误:在非对象PDO上调用成员函数count()

时间:2014-11-20 02:02:04

标签: php

我犯了新的错误,在Windows中启动我的项目并将其迁移到Ubuntu。这一举动被强加给我,导致了很多意想不到的后果。它产生了许多致命的错误。

我知道只需执行var_dump就不会使对象为空。在var_dump里面,方法就在那里。所以我的问题是:为什么这在Windows环境中完美无缺,而不是在Linux环境中?我查看了代码并修复了我认为的所有大写问题。

生成错误的代码是:

public function find($user = null) {
    if ($user) {
        $field = (is_numeric($user)) ? 'id' : 'username';
        $data = $this->_db->get('user', array($field, '=', $user));
        var_dump($data);
        if ($data->count()) {
            $this->_data = $data->first();
            return true;
        }
    }

内容

object(DB)#3 (6) { ["_pdo":"DB":private]=> object(PDO)#4 (0) { } ["_query":"DB":private]=> object(PDOStatement)#5 (1) { ["queryString"]=> string(31) "SELECT * FROM user WHERE id = ?" } ["_error":"DB":private]=> bool(false) ["_result":"DB":private]=> array(1) { [0]=> object(stdClass)#6 (8) { ["id"]=> string(2) "39" ["username"]=> string(8) "test1234" ["password"]=> string(64) "d1dcebd95402062c466eeb1e2b5e6c3b217a0fe160bc3baac86bafc9613494e9" ["salt"]=> string(32) ".JMs.ˆ~ìdÿ)7Ð §FKS¨Ê×$'å¹Yˆc¥" ["name"]=> string(0) "" ["joined"]=> string(10) "2014-11-20" ["disabled"]=> string(1) "0" ["email"]=> string(18) "jt125845@gmail.com" } } ["_count":"DB":private]=> int(1) ["error"]=> bool(false) } 

        return false;
    }

同样,这是我的第一个项目。

1 个答案:

答案 0 :(得分:0)

我会先将结果转换为数组,然后调用标准count

public function find($user = null) {
    if ($user) {
        $field = (is_numeric($user)) ? 'id' : 'username';

        $result = $this->_db->get('user', array($field, '=', $user));
        $data = $result->result_array();
        var_dump($data);
        if (count($data) > 0) {
            $this->_data = $data[0];
            return true;
        }
}

关于问题的原因:版本之间可能存在差异。你切换操作系统不是问题,它有利于学习。

编辑:

显然我以前的想法是不够的,至少在它应该工作的环境中是这样。我现在没有可能测试它,所以我的新想法也可能是错的。我会分享它,希望最好:

public function find($user = null) {
    if ($user) {
        $field = (is_numeric($user)) ? 'id' : 'username';

        $statement = $this->_db->prepare("select * from user where ".$field." = :userValue");
        $statement->execute(array(':userValue' => $user));
        if ($data = $statement->fetch()) {
            $this->_data = $data;
            return true;
        }
    }