【问题标题】:My php $_SESSION is not saving我的 php $_SESSION 没有保存
【发布时间】:2017-11-20 11:20:21
【问题描述】:

我从 PHP 开始,所以我不知道出了什么问题。我正在尝试使用函数更新我的 $_SESSION var 中的一些值,但没有工作。 首先,我启动会话并为会话设置一个默认值,如果它在我的 header.php 中是“未定义的”:

  <?php
    session_start();
    if (!isset($_SESSION["locale"])) {
      $_SESSION["locale"] = 'pt_BR';
    }
  ?>

然后我有一些调用我的 PHP 函数的 ajax。

  $('#change_locale_br').click(function() {
    $.ajax({
      type: "POST",
      url: "i18n/i18n_functions.php",
      data: { action: "changelocale", new_locale: "pt_BR" },
      success: function() {
      }
    });
  });

在php文件之后,我有以下代码:

  <?php
    function changelocale($l) {
      $_SESSION["locale"] = $l;
    }

    if(isset($_POST['action']) && $_POST['action'] == 'changelocale'){
        $l = $_POST['new_locale'];
        changelocale($l);
    }
  ?>

因此,changelocale 函数使用不同的值(pt_BR、es 等)调用,但调用后它并没有真正改变 $_SESSION["locale"] 值。

我进行了大量研究,但此处或 PHP 文档页面中提出的建议均未奏效。有人知道在这种情况下可以做什么吗?

提前致谢。

【问题讨论】:

  • 您已编辑您的帖子。你试过session_start()吗?在turning error reporting on 之后您是否收到任何错误消息?
  • 是的,我在 header.php 中做了(包含在所有其他页面中)。而且我没有收到任何错误消息(即使在打开错误报告之后)。
  • print_r($_SESSION) 时会发生什么?尝试在设置之前/之后打印它,并确保您在帖子响应中看到更新的值(来自 javascript)。
  • 它显示了正确的值,如下所示:Array ( [locale] =&gt; es ) 我在页面中添加了一个 php echo 以显示此会话区域设置的当前值,但是当我刷新页面时,它显示默认值(即使响应显示不同的值)
  • 查看session_id() 函数。确保您的会话 cookie 已正确保存,并且页面之间的会话 ID 相同。 This post 可能会为会话错误提供一些帮助。

标签: php ajax session post


【解决方案1】:

这是解决方案:在我的 header.php 中设置会话的默认值之后,我立即调用了session_write_close();(用于确保会话数据将被“解锁”,因为 php 不允许并发写入) :

  <?php
    ini_set('session.cookie_domain', 'localhost');
    if(!isset($_SESSION)) session_start();

    if (!isset($_SESSION["locale"])) {
      $_SESSION["locale"] = 'pt_BR';
    }
    session_write_close();
  ?>

然后在我的 changelocale.php 中,我调用了session_start(),最后调用了session_write_close()。现在是这样的:

  <?php
    if(!isset($_SESSION)) session_start();

    function changelocale($new_locale) {
      $_SESSION["locale"] = $new_locale;
    }

    if(isset($_POST['action']) && $_POST['action'] == 'changelocale'){
        $l = $_POST['new_locale'];
        changelocale($l);
    }
    session_write_close();
  ?>

【讨论】:

    【解决方案2】:

    您需要在页面顶部包含session_start(),您打算设置或访问$_SESSION 信息。

    【讨论】:

    • 我已将它添加到我的 header.php 中。我必须将它包含在其他任何地方吗?
    • 如果 header.php 包含在您访问/设置$_SESSION 变量的每个页面上(在您实际使用$_SESSION 变量之前),那么您很好。
    • 是的。标题被包含在每一页中。我编辑了这个问题,以便您能看得更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2016-01-26
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多