OOP类__PHP_Incomplete_Class的对象

时间:2014-01-16 07:38:45

标签: php mysql oop

你好我有这个代码用于登录并在PHP OOP中注册

<?php
class DB {
    public static $instance = null;

    private     $_pdo = null,
                $_query = null,
                $_error = false,
                $_results = null,
                $_count = 0;

    private function __construct() {
        try {
            $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'), array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
            //$this->query('SET NAMES utf8');

        } catch(PDOExeption $e) {
            die($e->getMessage());
        }

    }

    public static function getInstance() {
        if(!isset(self::$instance)) {
            self::$instance = new DB();
        }
        return self::$instance;
    }

    public function query($sql, $params = array()) {

        $this->_error = false;

        if($this->_query = $this->_pdo->prepare($sql)) {
            $x = 1;
            if(count($params)) {
                foreach($params as $param) {
                    $this->_query->bindValue($x, $param);
                    $x++;
                }
            }

            if($this->_query->execute()) {
                $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                $this->_count = $this->_query->rowCount();
            } else {
                $this->_error = true;
            }
        }

        return $this;
    }

    public function get($table, $where) {
        return $this->action('SELECT *', $table, $where);
    }

    public function delete($table, $where) {
        return $this->action('DELETE', $table, $where);
    }

    public function action($action, $table, $where = array()) {
        if(count($where) === 3) {
            $operators = array('=', '>', '<', '>=', '<=');

            $field      = $where[0];
            $operator   = $where[1];
            $value      = $where[2];

            if(in_array($operator, $operators)) {
                $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";

                if(!$this->query($sql, array($value))->error()) {
                    return $this;
                }

            }

            return false;
        }
    }

    public function insert($table, $fields = array()) {
        $keys   = array_keys($fields);
        $values = null;
        $x      = 1;

        foreach($fields as $value) {
             $values .= "?";
            if($x < count($fields)) {
                 $values .= ', ';
            }
            $x++;
        }

        $sql = "INSERT INTO {$table} (`" . implode('`, `', $keys) . "`) VALUES ({$values})";

        if(!$this->query($sql, $fields)->error()) {
            return true;
        }

        return false;
    }

    public function update($table, $id, $fields = array()) {
        $set    = null;
        $x      = 1;

        foreach($fields as $name => $value) {
            $set .= "{$name} = ?";
            if($x < count($fields)) {
                $set .= ', ';
            }
            $x++;
        }

        $sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";

        if(!$this->query($sql, $fields)->error()) {
            return true;
        }

        return false;
    }

    public function results() {
        // Return result object
        return $this->_results;
    }

    public function first() {
        return $this->_results[0];
    }

    public function count() {
        // Return count
        return $this->_count;
    }

    public function error() {
        return $this->_error;
    }
    public function lastInsertId(){
        return $this->_pdo->lastInsertId();
    }
    public function __sleep(){
        return array();
    }
}

并且我在会话中保存用户登录数据,一切正常在localhost中工作,但在我的网络服务器中我遇到问题$this->_query->bindValue($x, $param);

  

捕获致命错误:类__PHP_Incomplete_Class的对象无法转换为字符串

我知道我的会话有问题,但我找不到问题,这是我的会话课

<?php
class Session {
    public static function exists($name) {
        return (isset($_SESSION[$name])) ? true : false;
    }

    public static function get($name) {
        return $_SESSION[$name];
    }

    public static function put($name, $value) {
        return $_SESSION[$name] = $value;
    }

    public static function delete($name) {
        if(self::exists($name)) {
            unset($_SESSION[$name]);
        }
    }

    public static function flash($name, $string = null) {
        if(self::exists($name)) {
            $session = self::get($name);
            self::delete($name);
            return $session;
        } else if ($string) {
            self::put($name, $string);
        }
    }
}

请告诉我,如果你能解决这个错误,我非常感谢你 这是我存储会话的代码

public function login($username = null, $password = null, $remember = false) {

        if(!$username && !$password && $this->exists()) {
            Session::put($this->_sessionName, $this->data()->id);
        } else {
            $user = $this->find($username);

            if($user) {
                if($this->data()->password === Hash::make($password, $this->data()->salt)) {
                    Session::put($this->_sessionName, $this->data()->id);

                    if($remember) {
                        $hash = Hash::unique();
                        $hashCheck = $this->_db->get(Config::get('mysql/tbl_user_sessions'), array('user_id', '=', $this->data()->id));

                        if(!$hashCheck->count()) {
                            $this->_db->insert(Config::get('mysql/tbl_user_sessions'), array(
                                'user_id' => $this->data()->id,
                                'hash' => $hash
                            ));
                        } else {
                            $hash = $hashCheck->first()->hash;
                        }

                        Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));
                    }

                    return true;
                }
            }
        }

        return false;
    }

我只是做了session['user']

的var_dump
array(1) { 
    ["user"]=> &object(__PHP_Incomplete_Class)#1 (6) { 
        ["__PHP_Incomplete_Class_Name"]=> string(4) "User" 
        ["_db":"User":private]=> object(__PHP_Incomplete_Class)#2 (1) { 
            ["__PHP_Incomplete_Class_Name"]=> string(2) "DB" 
        } 
        ["_sessionName":"User":private]=> string(4) "user" 
        ["_cookieName":"User":private]=> string(4) "hash" 
        ["_data":"User":private]=> object(stdClass)#3 (7) { 
            ["id"]=> string(3) "144" 
            ["username"]=> string(5) "admin" 
            ["password"]=> string(64) "0611affa6664e471b939cd3197b49e0c3b47d146fc12a472c4275dbd85a7cd67" 
            ["salt"]=> string(32) "458a0dbfbd9bdca381e50b8d753329ea" 
            ["name"]=> string(12) "Artur Papyan" 
            ["joined"]=> string(19) "2013-11-29 07:41:54" 
            ["group"]=> string(1) "1" 
        } 
        ["_isLoggedIn":"User":private]=> bool(true) 
    } 
}

1 个答案:

答案 0 :(得分:0)

看起来好像是在尝试将结果输出到字符串,但是当类返回一个对象时,它无法做到。

另外,参考DB.php第38行是一个红色的鲱鱼,因为它向被调用的函数显示错误信息。

$ this-&gt; _query-&gt; bindValue($ x,$ param);

而是查看代码调用类的位置,以及如何尝试在代码中绑定变量,而不是实际调用DB.php文件。