会话密钥的存储值然后取消设置?

时间:2017-12-08 23:53:45

标签: php session

我试图模仿本机PHP中的flash消息的行为,以便一次性显示错误消息。

显示登录页面:

public function showLoginAndRegistrationPage()
{
    $session = new Session();

    $data['errors']['login']['account'] = $session->getFormErrorFlashData('login', 'account');

    $this->viewPresenter->display('basic', 'customer/login-registration', $data, 'Login/Register');
}

验证登录详细信息:

public function processLogin()
{
    // Some code
    $session        = new Session();

    if($this->formInputFilter->isValid()) {

    // Some code

        if(true) {
    // Some code
        } else {
            $errors = array(
                'account' => 'Account does not exist.'
            );
            $session->setFormErrorFlashData('login', $errors);

            header('Location: /login');
        }
    } else {
            header('Location: /login');
    }
}

用于设置错误消息:

public function setFormErrorFlashData($form, $errors = array())
{
    foreach($errors As $field => $message) {
        $_SESSION['errors']["{$form}"]["{$field}"] = $message;
    }
}

用于获取存储在会话中的错误消息:

public function getFormErrorFlashData($form, $field)
{
    if(isset($_SESSION['errors']["{$form}"]["{$field}"])) {
        $message = $_SESSION['errors']["{$form}"]["{$field}"];

        unset($_SESSION['errors']["{$form}"]["{$field}"]);

        return $message;
    }
}

基本上对于无效的尝试,在重定向之后,它现在应该显示“帐户不存在”消息,然后当用户刷新页面时,它应该不再存在。

当我注释 unset()中的getFormErrorFlashData()行,$_SESSION包含错误时,会发生什么情况,但当然正如预期的那样,它们确实会持续存在无数页翻新后。

但当 未注明时,我会得到一个NULL。即使尝试在其中存储该会话密钥的值,$message似乎也未设置。

我有一个包含session_start()行的引导程序文件,每个页面都加载了它,所以我怀疑这是什么原因?

更新

index.php(引导程序文件)

<?php

session_start();
date_default_timezone_set('Asia/Taipei');

require_once 'core/Autoloader.php';

use core\Autoloader As Autoloader;
use core\Router As Router;
use core\Dispatcher As Dispatcher;

spl_autoload_register('core\Autoloader::loadClass');
$request_uri    = trim($_SERVER['REQUEST_URI']);
$router         = new Router();
$route          = $router->handleRequest($request_uri);

if (!$route) {    
    require_once ('./views/errors/404.php');
} else {
    $dispatcher     = new Dispatcher($route);

    $isDispatched   = $dispatcher->dispatch();
    if (!$isDispatched) {
        echo '<div>' .$route['class'] .'/' . $route['action'] . ' not found </div>';
        require_once ('./views/errors/404.php');
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了罪魁祸首。

当我跟踪请求日志时,showLoginAndRegistrationPage()被调用了两次,因为我没有意识到我在html文件中附加了一个.js文件并带有submit个事件被解雇的处理程序,因此双页请求。

我删除了该文件,现在它正在运行。

感谢您的帮助!