Php 致命错误:类';饼干';找不到

Php 致命错误:类';饼干';找不到,php,cookies,Php,Cookies,我还在看那些教程,遇到了另一个错误,花了几个小时看了看,我看不出我又错在哪里了。基本登录不需要选中复选框记住我,我已经查看了我的数据库结构和文件名/类型和路径,尝试了var_dump,在我的资源中查找了是否未找到cookie文件的任何指示,所有内容都变成空的 User.php <?php class User{ private $_db, $_data, $_

我还在看那些教程,遇到了另一个错误,花了几个小时看了看,我看不出我又错在哪里了。基本登录不需要选中复选框记住我,我已经查看了我的数据库结构和文件名/类型和路径,尝试了var_dump,在我的资源中查找了是否未找到cookie文件的任何指示,所有内容都变成空的

User.php

      <?php
        class User{
            private $_db,
                    $_data,
                    $_sessionName,
                    $_cookieName,
                    $_isLoggedIn;`enter code here`

            public function __construct($user = null){
                $this ->_db = DB::getInstance();

                $this->_sessionName = Config::get('session/session_name');
                $this->_cookieName = Config::get('remember/cookie_name');

            if(!$user){
                if(Session::exists($this->_sessionName)){
                    $user = Session::get($this->_sessionName);

                if($this->find($user)){
                    $this->_isLoggedIn = true;
                        }else{
                            //logout 
                        }
                    }
                } else{
                    $this->find($user);
                }
            }


            public function create($fields = array()){
                if(!$this->_db->insert('users', $fields)){
                    throw new Exception('There was a problem creating account');
                }
            }

            public function find($user = null){
                if($user){
                    $field = (is_numeric($user)) ? 'id' : 'username';
                    $data = $this->_db->get('users', array($field, '=', $user));

                    if($data->count()) {
                        $this->_data = $data->first();
                        return true;
                    }
                }
                return false;
            }

            public function login($username = null, $password = null, $remember){
                    $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('users_session', array('user_id', '=', $this->data()->id));

                            if(!$hashCheck->count()){
                                $this->_db->insert(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;
            }

            public function logout(){
                Session::delete($this->_sessionName);
            }

            public function data(){
                return $this->_data;
            }

            public function isLoggedIn(){
                return $this->_isLoggedIn;
            }

        }
Hash.php

<?php
class Hash{
    public static function make($string, $salt =''){
        return hash('sha256', $string . $salt);
    }

    public static function salt($length){
        return mcrypt_create_iv($length);
    }

    public static function unique(){
        return self::make(uniqid());
    }

}

您是否
在Users类中要求\u一次
cookie.php文件?根据您提供的代码,它不是必需的。在User.php文件中需要cookie.php。

我重新保存了该文件,复制了cookie.php文件,并重写了目录中的文件,无论出于何种原因,该文件都有效。

代码太多了。通常,您应该尝试提供一组仍然存在问题的代码。它还可以帮助您缩小原因范围,并可能帮助您自己找到问题。查看它,我可以想象使用
spl\u autoload\u register
注册的函数找不到您的
Cookie
类。您应该尝试在该函数中使用
getcwd
get\u include\u path
,以查看脚本实际查看的位置。我以前从未使用过这些函数,但这是它给我的答案,我将在问题中包括它,即使在中也找不到该类。该类位于cookie.php文件中。如果您确实
需要在php文件顶部添加一次(“cookie.php”)
,那么应该可以解决登录页面“core/init.php”的问题;这有spl_autoload_寄存器(函数($class){require_once'classes/'.$class..php';});需要_once“functions/sanitize.php”,因此,它会自动加载类(理论上)它只为其余的类工作,而不是出于任何原因加载这个cookie类。不过,我确实按照你的建议试过了,但没用。
       <?
        class Cookie{
            public static function exists($name){
                return(isset($_COOKIE[$name])) ? true : false;
            }

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

            public static function put($name, $value, $expiry){
                if(setcookie($name, $value, time() + $exiry, '/')){
                    return true;
                }
            return false;   
            }

            public static function delete($name){
                //delete
                self::put($name, '', time() - 1);
            }
        }
    <?php
require_once 'core/init.php';

if(Input::exists()){
    if(Token::check(Input::get('token'))){

        $validate = new Validate();
        $validation = $validate->check($_POST, array(
            'username' => array('required' => true),
            'password' => array('required' => true)
        ));

        if ($validation->passed()){
            //log user in
            $user = new User();

            $remember = (Input::get('remember') === 'on') ? true : false;
            $login = $user->login(Input::get('username'), Input::get('password'), $remember );

            if($login){
                Redirect::to('index.php');
            }else{
                echo'<p>Sorry invalid details</p>';
            }
        } else{
            foreach($validation->errors() as $error)
                echo $error, '<br />';
        }
    }
}

?>
<form action="" method="POST">
    <div class="field">
        <label for="username" id="username"> Username </label>
        <input type="text" name="username" id="username" autocomplete="off">
    </div>

    <div class="field">
        <label for="password" id="password"> Password </label>
        <input type="password" name="password" id="password" autocomplete="off">
    </div>

    <div class="field">
        <label for="remember">
            <input type="checkbox" name="remember" id="remember"> Remember me
        </label>
    </div>

    <input type="hidden" name="token" value="<?php echo Token::generate();?>">
    <input type="submit" value="Login">
</form> 

<a href ="index.php">Home</a>
      <?php
        class DB{
            private static $_instance = null;
            private $_pdo, 
                    $_query, 
                    $_error = false,
                    $_results, 
                    $_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'));
                    }catch(PDOException $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;
            }

            private 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 get($table,$where){
                return $this->action('SELECT *', $table, $where);
            }

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

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

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

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

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

            public function error(){
                return $this->_error;
            }

                public function update($table, $id, $fields)
            {
                $set = '';
                $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 $this->_results; 
            }
            public function first(){
                return $this->_results[0];
            }

            public function count(){
                return $this->_count;
            }
        }   
    // Works as of PHP 4.3.0
    echo get_include_path();

    // Works in all PHP versions
    echo ini_get('include_path');
    // current directory
    echo getcwd() . "\n";

    chdir('classes');

    // current directory
    echo getcwd() . "\n";

returns errors:

    ;C:\php\pear.;C:\php\pearC:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\my portable files\ooplogin C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\my portable files\ooplogin\classes 
    Warning: require_once(classes/Hash.php): failed to open stream: No such file or directory in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\my portable files\ooplogin\core\init.php on line 23

    Fatal error: require_once(): Failed opening required 'classes/Hash.php' (include_path='.;C:\php\pear') in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\my portable files\ooplogin\core\init.php on line 23
<?php
class Hash{
    public static function make($string, $salt =''){
        return hash('sha256', $string . $salt);
    }

    public static function salt($length){
        return mcrypt_create_iv($length);
    }

    public static function unique(){
        return self::make(uniqid());
    }

}