2015-01-02 143 views
-1

那麼我仍然會遇到那些教程遇到了另一個錯誤,花了幾個小時看它,我看不到我又要出錯了。沒有選擇複選框的基本登錄工作記住我,我已經看過我的數據庫結構和文件名/類型和路徑,試圖var_dump,在我的資源中查看任何跡象,如果沒有發現cookie文件,空白。致命錯誤:找不到類'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; 
      } 

     } 

的init.php

<?php 
    session_start(); 

    $GLOBALS['config'] = array(
     'mysql' => array(
      'host' => '127.0.0.1', 
      'username' => 'root', 
      'password' => '', 
      'db' => 'oopdatabase' 
     ), 
     'remember' => array(
      'cookie_name' => 'hash', 
      'cookie_expiry'=> 604800 
     ), 
     'session' => array(
      'session_name' => 'user', 
      'token_name' => 'token' 

     ) 
    ); 

spl_autoload_register(function($class){ 
    require_once 'classes/' . $class. '.php'; 
}); 

require_once 'functions/sanitize.php'; 

cookie.php

 <? 
     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); 
      } 
     } 

的login.php

<?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> 

db.php中

 <?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; 
      } 
     } 

get_include_path()和GETCWD

// 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 

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()); 
    } 

} 
+1

這是很多代碼。一般來說,您應該嘗試提供一個[簡短,自包含,正確的示例](http://sscce.org)的代碼,仍然有您的問題。它還可以幫助您縮小原因並可幫助您自己找到問題。 – zneak

+0

看着它,我會想象用'spl_autoload_register'註冊的函數找不到你的'Cookie'類。您應該嘗試在該函數中使用'getcwd'和'get_include_path'來查看腳本實際查看的位置。 – zneak

+0

我以前從來沒有使用過這些函數,但是這是它給我的答案,我將包含問題 –

回答

0

你有沒有require_once在用戶類cookie.php文件?從您提供的代碼中,它不是必需的。在你的User.php文件中需要cookie.php。

+0

即使使用它也找不到該類。 –

+0

該類位於cookie.php文件中。如果你在你的PHP文件的頂部使用'require_once(「cookie.php」)',那麼應該可以解決問題 –

+0

登錄頁面'core/init.php';這有spl_autoload_register(函數($ class){0}} {0}}}}}; require_once'classes /'。$ class。'.php'; }); require_once'functions/sanitize.php'; ,所以它自動加載類(在理論上)它的工作,其餘的根本不是這個cookie類不管出於什麼原因。我按照你的建議嘗試了,但沒有奏效。 –

0

我重新保存了文件,我複製了cookie.php文件並覆蓋了目錄中的文件,無論出於何種原因它都有效。

相關問題