Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP会话-附加类实例_Php_Class_Session - Fatal编程技术网

PHP会话-附加类实例

PHP会话-附加类实例,php,class,session,Php,Class,Session,对于一个小型personnal项目,我需要将一个类实例附加到PHP会话中。 为此,我编写了以下代码,但它并没有像我预期的那样工作。例如,当我调用方法login并刷新页面时,我的类中没有修改任何内容。我是说,就像每次都被重置一样 我的问题是:如何使用PHP会话在页面之间共享核心实例 <?php class Core { /* Database */ private $db = null; /* User activity */ private $l

对于一个小型personnal项目,我需要将一个类实例附加到PHP会话中。 为此,我编写了以下代码,但它并没有像我预期的那样工作。例如,当我调用方法
login
并刷新页面时,我的类中没有修改任何内容。我是说,就像每次都被重置一样

我的问题是:如何使用PHP会话在页面之间共享核心实例

    <?php

class Core
{
    /* Database */
    private $db = null;

    /* User activity */
    private $loggedin = false;
    private $userid = 0;
    private $username = null;
    private $password = null;
    private $lastActivity = null;

    /* Constructor */
    public function __construct()
    {
        $this->connect();
    }

    /* Serialize */
    public function __sleep()
    {
        return array('loggedin', 'userid', 'username', 'password', 'lastActivity');
    }

    /* Unserialize */
    public function __wakeup()
    {
        $this->connect();
    }

    /* Connect to database */
    private function connect()
    {
        global $DB_HOSTNAME, $DB_BASENAME, $DB_USERNAME, $DB_PASSWORD;

        try
        {
            $this->db = $db = new PDO('mysql:host='.$DB_HOSTNAME.';dbname='.$DB_BASENAME.';charset=utf8', $DB_USERNAME, $DB_PASSWORD);
            $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch (Exception $e)
        {
            die('Erreur : ' . $e->getMessage());
        }
    }

    /* Get database */
    public function getDb()
    {
        return $this->db;
    }

    /* Create a new login session */
    public function login($userid, $username, $password)
    {
        $this->loggedin = true;
        $this->userid = intval($userid);
        $this->username = $username;
        $this->password = $password;
        $this->lastActivity = time();
    }

    /* Close the login session */
    public function logout()
    {
        $this->loggedin = false;
        $this->userid = 0;
        $this->username = null;
        $this->password = null;
    }

    /* Check if the session is running or not */
    public function isConnected()
    {
        if ($this->loggedin)
        {
            if ($this->lastActivity + 3600 < time())
            {
                $this->logout();
                return false;
            }
            elseif (isset($this->password))
            {
                $db = $this->db;
                $query = $db->prepare('SELECT id FROM ptc_users WHERE id=:userid AND password=:password LIMIT 1;');
                $query->bindParam(':userid', $this->userid, PDO::PARAM_INT);
                $query->bindParam(':password', $this->password, PDO::PARAM_STR);
                $query->execute();

                if ($query->rowCount() == 1)
                {
                    $this->lastActivity = time();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        return false;
    }

    /* Return the current user id */
    public function getUid()
    {
        return $this->userid;
    }

    /* Return the current username */
    public function getUsername()
    {
        return $this->username;
    }

    /* Return the hash signature of the password */
    public function hash($input)
    {
        return sha1('minad8rBxu' .$input. 'MigdVKXUCf');
    }

    /* Return the user's ip */
    public function getIp()
    {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR'];
        else return $_SERVER['REMOTE_ADDR'];
    }
}

// Create a new core session if not started before
if (!isset($_SESSION)) session_start();
if (!isset($_SESSION['core']))
{
    $core = new Core();
    $_SESSION['core'] = serialize($core);
}
else
{
    $core = unserialize($_SESSION['core']);
}

?>

实例化或自动加载核心类,以便在整个应用程序中使用它。不需要会话..或只需将类名保存到会话

    $_SESSION['instance'] = json_encode(array('username', 'timestamp', 'userid','password'));

$object = json_decode($_SESSION['instance']);

echo var_dump($object);

只需将用户名、时间戳、用户ID和密码保存到会话

    $_SESSION['instance'] = json_encode(array('username', 'timestamp', 'userid','password'));

$object = json_decode($_SESSION['instance']);

echo var_dump($object);

我不明白你的意思。你能解释一下吗?老兄,我从没听说有人把这个实例保存到会话中。他们所做的只是使用spl_自动加载功能。我需要在每个页面上传递用户名、时间戳、用户ID和密码,以检查用户是否已连接。这就是为什么我需要将实例存储到会话中。这不是我第一次看到这种情况。如果你用谷歌搜索它,很多人都在这样做。只需将用户名、时间戳、用户名和密码保存到会话中即可$_会话['instance']=json_编码(数组('username','timestamp','userid','password');