繁体   English   中英

第一次未设置PHP会话

[英]PHP session not set the first time

我有一个奇怪的问题。 访客第一次来到该站点,我设置的是会话,它不会停留。 第二次以及以后的所有时间,我都会尝试设置一些固定的东西。 初步尝试后,我可以销毁该会话并设置一些东西,并且它会粘住。 它只是最初尝试保存某些东西而失败。 我正在尝试使用$_SESSION['uid'] = $row["Id"];将某些内容保存到会话中 我知道$row["Id"]是有效的并保存数据(我已将其回显)。

我没有使用标准会话。 我将会话保存到数据库中。 我的课程在下面。 我有什么想念或做错的事情来解释这种行为吗?

更新

好吧,我自己测试了会话类,它似乎正在工作:-/但是,当我在较大的应用程序中使用它时,虽然会调用__destruct ,但是_write不会被调用。 知道为什么会这样吗?

<?php

include_once('db.php');

class PDOSession
{
    protected $pdo;
    protected $table = 'SessionData';

    public function __construct()
    {
        // Get a database connection
        $db = new PDOConnectionFactory();
        $this->pdo = $db->getConnection(true);

        // Start session
        session_set_save_handler(array($this, '_open'),
                                 array($this, '_close'),
                                 array($this, '_read'),
                                 array($this, '_write'),
                                 array($this, '_destroy'),
                                 array($this, '_gc'));
        session_start();
    }

    public function __destruct()
    {
        session_write_close();
    }

    protected function fetchSession($id)
    {
        $stmt = $this->pdo->prepare('SELECT id, data FROM '.$this->table.' WHERE id = :id AND unixtime > :unixtime');
        $stmt->execute(array(':id' => $id, ':unixtime' => (time() - (int)ini_get('session.gc_maxlifetime'))));
        $sessions = $stmt->fetchAll();

        return empty($sessions) ? false : $sessions[0];
    }

    public function _open($savePath, $sessionName)
    {
        return true;
    }

    public function _close()
    {
        return true;
    }

    public function _read($id)
    {
        $session = $this->fetchSession($id);
        return ($session === false) ? false : $session['data'];
    }

    public function _write($id, $sessionData)
    {
        $session = $this->fetchSession($id);
        if($session === false) {
            $stmt = $this->pdo->prepare('INSERT INTO '.$this->table.' (id, data, unixtime) VALUES (:id, :data, :time)');
        } else {
            $stmt = $this->pdo->prepare('UPDATE '.$this->table.' SET data = :data, unixtime = :time WHERE id = :id');
        }
        $stmt->execute(array(
                        ':id' => $id,
                        ':data' => $sessionData,
                        ':time' => time()
                        ));
    }

    public function _destroy($id)
    {
        $stmt = $this->pdo->prepare('DELETE FROM '.$this->table.' WHERE id = :id');
        $stmt->execute(array(':id' => $id));
    }

    public function _gc($maxlifetime)
    {
        $stmt = $this->pdo->prepare('DELETE FROM '.$this->table.' WHERE unixtime < :time');
        $stmt->execute(array(':time' => (time() - (int) $maxlifetime)));
    }
}
$newPDOSessionStartHere = new PDOSession();

我猜我有点白痴。 我正在调用session_destroy()而不是session_unset()来清除身份验证脚本顶部的内容。 这堂课很好。

我认为您应该在定义课程后开始一个会话。 不在里面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM