php php在isset或empty中非法偏移类型

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22298454/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 04:48:34  来源:igfitidea点击:

php Illegal offset type in isset or empty

phphtml

提问by user3383540

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

警告:第 4 行 D:\xampp\htdocs\cookieboylive\classes\Session.php 中的 isset 或空的偏移类型非法

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.

我的网站上有 3 个文件 - 索引、登录、注册。索引页面检查用户是否登录,但我认为这与问题无关。

Here's the current code:

这是当前的代码:

The main register/login.php page

主 register/login.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()) {
            $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;
    }
}

回答by KCT3937

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.

我尝试了上面建议的大多数解决方案。事实上,答案并不在于拼写,而是在于,正如上面所指出的,exists 函数中的 $name 变量实际上是一个数组。

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

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.

简单的解决方法是将 [0] 附加到 [$name] 使其成为 [$name][0] ,它返回与其关联的值以及您想要查看的值。为我工作。为什么它在视频中起作用,我想不通;可能是配置问题。

回答by deceze

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

我收到致命错误:调试:数组...

That means $nameis 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().

这意味着$name是一个数组,这显然是一个非法的字符串偏移量。$_SESSION[array()]不起作用。确保您将正确的值传递给Session::exists().

回答by Jan Hannibalsen

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.

我认识您正在处理的上下文,来自 Skillfeed 的教程 PHP 登录/注册项目。事实上,我遇到了同样的错误,导致我在同一错误上进行了谷歌搜索 - 我在 You 的这个 stackoverflow 线程上结束了。

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.

我找不到非常有帮助的答案,但我浏览了我的项目的课程,我在另一个课程中找到了我的问题的根源,而不是这里显示的 3 个课程。

That is in Token.php :

那是在 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!

问题是一个简单的拼写错误,注意 get() 函数及其字符串参数“sesson/token_name”,它应该是“session/token_name”。一旦我解决了这个问题,它就对我有用!