Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

php Illegal offset type in isset or empty

Writer Emily Wong

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> <div > <a></a> <a></a> <div> <div> <form action="" method="post"> <div> <h1>Log in</h1> <p> <label for="username" >Username </label> <input name="username" required="required" type="text" placeholder="Username" autocomplete="off"> </p> <p> <label for="password">Password </label> <input name="password" required="required" type="password" placeholder="Password"> </p> <p> <input type="checkbox" name="loginkeeping" value="loginkeeping"> <label for="loginkeeping">Keep me logged in</label> </p> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <p> <input type="submit" value="Login"> </p> <p> Not a member yet ? <a href="#toregister">Join us</a> </p> </form> </div> </div> <div> <form action="" method="post"> <h1> Sign up </h1> <p> <label for="username">Username</label> <input value="<?php echo escape(Input::get('username')); ?>" name="username" required="required" type="text" placeholder="Username" autocomplete="off"> </p> <p> <label for="password">Your password </label> <input name="password" required="required" type="password" placeholder="Password"> </p> <p> <label for="password_again">Please confirm your password </label> <input name="password_again" required="required" type="password" placeholder="Password again"> </p> <p> <label for="name" >Name</label> <input 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> <input type="submit" value="Sign up"> </p> <p> Already a member ? <a href="#tologin"> 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; }
}
4

5 Answers

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().

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.

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!

It simply means the type of the variable (int, bool, array,..) you are passing does not aligns with expected parameter type in empty or isset.

You have not typed the $name variable and that`s should be problem.

Try this which will check also $name variable:

return !empty($name) && is_string($name) && isset($_SESSION[$name]) ? true : false;

Just play with some situations or implement typing into you code.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy