У меня есть этот код, который работал на начальном этапе, но не работает после перезагрузки компьютера.
Ошибка, которую я получаю:
Предупреждение. Недопустимый тип смещения в isset или пустой в D: \ xampp \ htdocs \ cookieboylive \ classes \ Session.php в строке 4
На моем сайте 3 файла – Индекс, Вход, Регистрация. На странице индекса проверяется, вошли ли пользователи, но я не думаю, что это имеет какое-либо отношение к проблеме.
Вот текущий код:
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()) { $user = new User(); $login = $user->login(Input::get('username'), Input::get('password')); if($login) { Redirect::to('index.php'); } else { echo '<p>Sorry, login failed.</p>'; } } else { foreach($validation->errors() as $error) { echo $error, '<br>'; } } } } if(Input::exists()) { if(Token::check(Input::get('token'))) { $validate = new Validate(); $validation = $validate->check($_POST, array( 'username' => array( 'required' => true, 'min' => 2, 'max' => 20, 'unique' => 'users' ), 'password' => array( 'required' => true, 'min' => 6 ), 'password_again' => array( 'required' => true, 'matches' => 'password' ), 'name' => array( 'required' => true, 'min' => 2, 'max' => 50 ) )); if($validation->passed()) { $user = new User(); $salt = Hash::salt(32); try { $user->create(array( 'username' => Input::get('username'), 'password' => Hash::make(Input::get('password'), $salt), 'salt' => $salt, 'name' => Input::get('name'), 'joined' => date('Ymd H:i:s'), 'group' => 1 )); Session::flash('home', 'Register SUCCESS'); Redirect::to('index.php'); } catch(Exception $e) { die($e->getMessage()); } } else { foreach($validation->errors() as $error) { echo $error, '<br>'; } } } } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" type="text/css" href="styles/register_login_styles.css"> <link rel="stylesheet" type="text/css" href="styles/animate-custom.css"> </head> <body> <div class="container"> <div id="container_demo" > <a class="hiddenanchor" id="toregister"></a> <a class="hiddenanchor" id="tologin"></a> <div id="wrapper"> <div id="login" class="animate form"> <form action="" method="post"> <div class="field"> <h1>Log in</h1> <p> <label for="username" class="uname" data-icon="u" >Username </label> <input id="username" name="username" required="required" type="text" placeholder="Username" autocomplete="off"> </p> <p> <label for="password" class="youpasswd" data-icon="p">Password </label> <input id="password" name="password" required="required" type="password" placeholder="Password"> </p> <p class="keeplogin"> <input type="checkbox" name="loginkeeping" id="loginkeeping" value="loginkeeping"> <label for="loginkeeping">Keep me logged in</label> </p> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <p class="login button"> <input type="submit" value="Login"> </p> <p class="change_link"> Not a member yet ? <a href="#toregister" class="to_register">Join us</a> </p> </form> </div> </div> <div id="register" class="animate form"> <form action="" method="post"> <h1> Sign up </h1> <p> <label for="username" class="uname" data-icon="u">Username</label> <input id="username" value="<?php echo escape(Input::get('username')); ?>" name="username" required="required" type="text" placeholder="Username" autocomplete="off"> </p> <p> <label for="password" class="youpasswd" data-icon="p">Your password </label> <input id="password" name="password" required="required" type="password" placeholder="Password"> </p> <p> <label for="password_again" class="youpasswd" data-icon="p">Please confirm your password </label> <input id="password_again" name="password_again" required="required" type="password" placeholder="Password again"> </p> <p> <label for="name" class="youmail" data-icon="n" >Name</label> <input id="name" name="name" value="<?php echo escape(Input::get('name')); ?>" required="required" type="text" placeholder="Name" autocomplete="off"> </p> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <p class="signin button"> <input type="submit" value="Sign up"> </p> <p class="change_link"> Already a member ? <a href="#tologin" class="to_register"> Go and log in </a> </p> </form> </div> </div> </div> </div> </body> </html>
<?php class Session { public static function exists($name) { return (isset($_SESSION[$name])) ? true : false; } public static function put($name, $value) { return $_SESSION[$name] = $value; } public static function get($name) { return $_SESSION[$name]; } public static function delete($name) { if(self::exists($name)) { unset($_SESSION[$name]); } } public static function flash($name, $string = '') { if(self::exists($name)) { $session = self::get($name); self::delete($name); return $session; } else { self::put($name, $string); } } }
с<?php class Session { public static function exists($name) { return (isset($_SESSION[$name])) ? true : false; } public static function put($name, $value) { return $_SESSION[$name] = $value; } public static function get($name) { return $_SESSION[$name]; } public static function delete($name) { if(self::exists($name)) { unset($_SESSION[$name]); } } public static function flash($name, $string = '') { if(self::exists($name)) { $session = self::get($name); self::delete($name); return $session; } else { self::put($name, $string); } } }
<?php class User { private $_db, $_data, $_sessionName, $_isLoggedIn; public function __construct($user = null) { $this->_db = DB::getInstance(); $this->_sessionName = Config::get('session/session_name'); if(!$user) { if(Session::exists($this->_sessionName)) { $user = Session::get($this->_sessionName); if($this->find($user)) { $this->_isLoggedIn = true; } else { // Pr0cess logout } } else { $this->find($user); } } } public function create($fields = array()) { if(!$this->_db->insert('users', $fields)) { throw new Exception('There was a problem creating an 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) { $user = $this->find($username); if($user) { if($this->data()->password === Hash::make($password, $this->data()->salt)) { Session::put($this->_sessionName, $this->data()->id); return true; } } return false; } public function data() { return $this->_data; } public function isLoggedIn() { return $this->_isLoggedIn; } }
Я попробовал большинство предложенных выше решений. На самом деле ответ не в орфографии, а в том, что, как было указано выше, переменная $ name в функции существования фактически представляет собой массив.
public static function exists($name) { return (isset($_SESSION[$name])) ? true : false; }
Простое исправление – добавить [0] в [$ name], чтобы оно стало [$ name] [0], которое возвращает связанное с ним значение и то, которое вы хотите видеть. Работает на меня. Почему он работал в видео, я не могу понять; может быть элементом конфигурации.
Я узнаю контекст, с которым вы имеете дело, учебный PHP-логин / регистрационный проект от Skillfeed. На самом деле у меня была такая же ошибка, которая привела меня к поиску google по той же ошибке – я закончил этот поток stackoverflow от You.
Я не мог найти ответы очень полезными, но я просмотрел классы моего проекта, и я нашел источник своей проблемы в другом классе, чем ваши 3 класса, показанные здесь.
То есть в Token.php:
public static function check($token){ $tokenName = Config::get('sesson/token_name'); if(Session::exists($tokenName) && $token === Session::get($tokenName)){ Session::delete($tokenName); return true; } return false; }
Проблема была простой орфографической ошибкой, обратите внимание на функцию get () со своим строковым параметром «sesson / token_name», это должно быть «session / token_name». Как только я исправил это, это сработало для меня!
Я получаю Неустранимая ошибка: DEBUG: массив …
Это означает, что $name
– это массив, который, очевидно, является незаконным смещением строки. $_SESSION[array()]
не работает. Убедитесь, что вы передаете правильное значение Session::exists()
.