【问题标题】:laravel session returning null inspite of setting itlaravel 会话返回 null 尽管设置它
【发布时间】:2012-11-25 12:03:18
【问题描述】:

只是原生php中的一个简单函数

protected function some_function(){
    session_start();
    if(!isset($_SESSION['a']))
    {
        $_SESSION['a'] = 'some value';
        return true;
    } else {
        return $_SESSION['a'];
    }
 }

在第一次运行时,它将按预期返回 bool(true) 和 "some value"

对 laravel 会话应用同样的,

protected function some_function(){ 
    $a = Session::get('abc');
    if(is_null($a)){
        Session::put('abc', 'some value');
        //return Session::get('abc');
        return true;
    } else {
        return $a;
    }
 }

按照逻辑,在第一次运行时,$a 将是 null。然后将"some value" 放入abc 键中并按预期返回bool(true)。

但是在随后的访问中,Session::get('abc')每次都返回 null。因此每次尝试都返回 bool(true)。

我认为可能是会话没有正确写入,所以我在设置后立即检查了获取键值。

通过注释掉上面代码中的行,它返回我在Session::put('abc') 中输入的任何值。 所以写入数据没有错误。

问题这里试图检索值总是返回null,尽管我在第一个请求之后设置了。

我错过了什么吗?


编辑

使用数据库作为驱动程序,会话不会保存在数据库中。没有错误输出。文档中描述的会话表模式的数据库实现是正确的。

【问题讨论】:

  • 您是否正确设置了会话配置?例如,是否设置了应用程序密钥? laravel.com/docs/session/config
  • @nerdklers 我现在正在使用file 驱动程序。应用程序密钥已设置。
  • 你还有这个问题吗,因为我也有类似的问题
  • @mattl 不。我无法解决它,不得不创建自己的库。但是最新版本没有它并且工作得很好。需要考虑的一件事。在会话中放置一些东西时,不要过早退出。假设如果我在会话中放入一些东西并调用dd(),它将无法保存。如果您确实需要保存,则需要在输入值之后但在退出之前手动调用Session::save()。让我知道是否难以理解。
  • 我还发现使用带有Session::get() 方法的默认响应已经取代了其他正在起作用的 put 方法的情况。

标签: php session laravel


【解决方案1】:

在通过许多论坛解决相同的问题后,我通过将会话驱动程序设置为数据库来解决它。

    'driver' => 'database',

并在数据库中创建表

 CREATE TABLE `sessions` (
  `id` varchar(40) NOT NULL,
  `last_activity` int(10) NOT NULL,
  `data` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【讨论】:

    【解决方案2】:

    试试这个 sn-p。未经测试,但很确定它可以工作。

    if(Session::has('abc'))
    {
        return Session::get('abc');
    } else {
        Session::put('abc', 'some value');
        return true;        
    }
    

    【讨论】:

    • 是的。这将作为Session::has 每次都返回false 作为密钥工作。但这意味着,每次我需要检索它时,我都必须写入该值。违背了会话的目的。不是吗?
    • Session::has('abc') 应该返回 true,如果存储了该键的值(因此使用存储的 session-var)。
    • 正是我在实现它时期望返回的。但在实践中,它返回错误。因此密钥获得默认的null。为了简单起见,没有机会在其他地方破坏它,因为它是唯一使用会话的函数。
    • 我将 sn-p 简化了一些。这应该可以正常工作,否则 laravel 会话配置有问题。还要确保“某些值”字符串不为空。
    • 是的。有用。但这里的问题是,session::has 即使设置了它也会返回 false。会话应该编写一次,然后通过调用它来检索它。在调用它之前不要每次都写。它现在的行为类似于局部变量,而不是会话变量。
    猜你喜欢
    • 2019-06-08
    • 2017-07-03
    • 2017-01-12
    • 2021-10-22
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多