php Illegal offset type in isset or empty

匿名 (未验证) 提交于 2019-12-03 00:50:01

问题:

I have this code that was working initially, but does not work after I restarted my computer.

The error I am getting is:

Warning: Illegal offset type in isset or empty in D:\xampp\htdocs\cookieboylive\classes\Session.php on line 4

There's 3 files on my site - Index, Login, Register. Index page checks if users is logged in, but I don't think it has anything to do with the problem.

Here's the current code:

The main register/login.php page

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('Y-m-d 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> 

Session.php

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

User.php

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

回答1:

I tried most of the solutions suggested above. In actual fact the answer is not in the spelling but is in the fact that, as was pointed out above, the $name variable in the exists function is actually an array.

public static function exists($name) { return (isset($_SESSION[$name])) ? true : false; }

The simple fix is to append [0] to [$name] so it becomes [$name][0] which returns the value associated with it and the one you want to see. Works for me. Why it worked in the video, I can't figure out; may be a configuration thing.



回答2:

I recognize the context you are dealing with, a tutorial PHP login/registration project from Skillfeed. In fact I had the very same error that led me to a google search on the same error - I ended on this stackoverflow thread by You.

I couldn't find the answers very helpful but I looked through the classes of my project and I found the source of my problem in another class than your 3 classes shown in here.

That is in 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;        } 

The problem was a simple misspelling , notice the get() function with its string parameter 'sesson/token_name', it should have been 'session/token_name'. Once I fixed this it worked for me!



回答3:

I'm getting Fatal error: DEBUG: array ...

That means $name is an array, which is obviously an illegal string offset. $_SESSION[array()] does not work. Make sure you're passing the right value to Session::exists().



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!