嗯,我仍然经历这些教程时遇到了另一个错误,花了几个小时看着它,我无法再看到我出错的地方。基本登录工作没有选中复选框记住我,我已经查看了我的数据库结构和文件名/类型和路径,尝试了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;
}
}
的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());
}
}
答案 0 :(得分:0)
您在Users类中有require_once
cookie.php文件吗?从您提供的代码中,它不是必需的。在User.php文件中需要cookie.php。
答案 1 :(得分:0)
我重新保存了文件,我复制了cookie.php文件并覆盖了目录中的文件,无论出于何种原因它都有效。