未在第2页上设置会话数据

时间:2018-08-01 10:32:11

标签: php session

我已经创建了用于处理会话的此类:

# app/src/sessionHandler.php

<?php
    namespace src;

    class sessionHandler
    {
        protected $_session;

        public function __construct()
        {
            session_start();
            $this->_session = $_SESSION;
        }

        public function getSession()
        {
            return $this->_session;
        }

        public function getSessionVar($key)
        {
            return $this->_session[$key];
        }

        public function setSessionVar($key, $value)
        {
            try {
                $this->_session[$key] = $value;
            } catch (\Exception $e) {
                require_once $_SERVER['DOCUMENT_ROOT']. '/app/src/errHandler.php';

                $errHandler = new errHandler(5, $e->getMessage());
                $errHandler->logErr();
            }
        }

        public function unsetSessionVar($key)
        {
            unset($this->_session[$key]);
        }

        public function destroySession()
        {
            session_destroy();
        }
    }

我在这里可以使用page1.php:

# app/build/page1.php

<?php
    require_once $_SERVER['DOCUMENT_ROOT']. '/conf/env.php';
    require_once DOC_ROOT. '/conf/loader/class.php';

    $varHandler = new \src\varHandler;

    $sessionHandler = new \src\sessionHandler;
    $sessionHandler->setSessionVar('foo', 'bar');

    $foo = $sessionHandler->getSessionVar('foo');
    $varHandler->dumpVarR($foo);

此输出:

  

倾销:foo
  酒吧

符合预期。在page2.php上,我尝试相同的操作(没有设置):

# app/src/build/page2.php

<?php
    require_once $_SERVER['DOCUMENT_ROOT']. '/conf/env.php';
    require_once DOC_ROOT. '/conf/loader/class.php';

    $sessionHandler = new \src\sessionHandler;

    $session = $sessionHandler->getSession();
    $foo = $sessionHandler->getSessionVar('foo');

    $varHandler = new \src\varHandler;

    $varHandler->dumpVarR($foo);
    $varHandler->dumpVarR($session);

输出:

  

注意:未定义的索引:第21行的/var/www/foundations/app/src/sessionHandler.php中的foo

     

倾销:foo

     

倾销:_GET
  数组
  (
  )

我不明白为什么会出错-不能是/var/lib/php/session权限错误,因为page1.php可以将会话值设置得很好。 Page2似乎无法链接到同一会话。这样做:

$sessionHandler->setSessionVar('foo2', 'bar2');
$foo2 = $sessionHandler->getSessionVar('foo2');

$varHandler->dumpVarR($foo2);

在page2上工作,我可以看到bar2设置为foo2。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

答案与我的课堂有关,尤其是这一行:

$this->_session = $_SESSION;

如果我理解正确,那么它在__construct中所做的并不是我所期望的。每次启动会话时,它将$this->_session重新声明为新的$_SESSION-覆盖每个页面上的数据。

我通过将班级更改为:

<?php
    namespace src;

    class sessionHandler
    {
        protected $_sessionId;

        public function __construct()
        {
            if (!isset($_SESSION)) {
                $this->init();
            }
        }

        public function init()
        {
            session_start();
            $this->_sessionId = session_id();
        }

        public function getSessionVar($key)
        {
            return (isset($_SESSION[$key]) ? $_SESSION[$key] : 'no data found in session for key: '. $key);
        }

        public function setSessionVar($key, $value)
        {
            try {
                $_SESSION[$key] = $value;
            } catch (\Exception $e) {
                require_once $_SERVER['DOCUMENT_ROOT']. '/app/src/errHandler.php';

                $errHandler = new errHandler(5, $e->getMessage());
                $errHandler->logErr();
            }
        }

        public function unsetSessionVar($key)
        {
            if (isset($_SESSION[$key])) {
                unset($_SESSION[$key]);
            } else {
                return false;
            }

            return true;
        }

        public function destroySession()
        {
            try {
                session_destroy();
            } catch (\Exception $e) {
                require_once $_SERVER['DOCUMENT_ROOT']. '/app/src/errHandler.php';

                $errHandler = new errHandler(5, $e->getMessage());
                $errHandler->logErr();
            }
        }
    }

,因此它使用已经存在的$_SESSION数据。现在page2可以看到page1上声明的内容。