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