【问题标题】:php ajax control session variables disappearingphp ajax控制会话变量消失
【发布时间】:2014-12-01 20:12:12
【问题描述】:

我有一个用户登录并设置了一些会话变量的页面:

$_SESSION['username'] = "Bob Smith";
$_SESSION['company'] = "acme Co";
$_SESSION['someData'] = "yes";

到目前为止一切顺利。

现在用户位于landing.php,我在左侧有一系列链接供用户导航。

<li class='menu' id='createUser'>Create New user</li>
<li class='menu' id='modUser'>Modify User</li>
<li class='menu' id='reports'>Reports</li>
<li class='menu' id='api'>API Management</li>
<li class='menu' id='logout'>Logout</li>

和用于导航的 jquery:

$('.menu,.menu2').click(function(){
    var action = $(this).attr('id');
    $.ajax({
        type: "POST",  
        url: "admin.php",
        data: "action="+action,
        success: function(result){
            $('#modData').html(result);
     }
});

admin.php 返回包含 var 操作的 php 页面。因此 modUser.php 或 reports.php 等返回不同的表单和数据。

现在。奇怪的事情我想不通。当我点击任何链接时。我的会话变量仍然设置。当我再次单击任何链接(注销除外)时,所有会话变量数据都消失了。除了 logout.php 之外,我在任何地方都没有 session_destroy

print_r($_SESSION) 在任何这些页面上仅第一次显示变量....第二次单击我得到结果

 Array()

我可能在每个页面上都有 session_start()。

我知道这是一个远景,您可能需要更多信息,但是这里有什么我遗漏的固有错误导致会话数据被删除。

admin.php

<?php
session_start();
if ($_POST['action'] == "reports")
{
    include('reports.php');
}
if ($_POST['action'] == "logout");{
    include('logout.php');
}
if ($_POST['action'] == "api"){
    include('apiMgmt.php');
}

?>

【问题讨论】:

  • 检查每个页面上的session_id()。如果值发生变化,那么您将丢失会话 cookie 并获得新/空会话。会话不太可能被破坏,只是被放弃了。通常这是 cookie 设置问题。
  • 域始终保持不变?至少尝试了两种浏览器
  • 似乎您的问题可能在某个地方的 admin.php 中。也许你应该把那个贴出来。
  • 会话 ID 保持不变。现在将 admin.php 信息添加到问题中。
  • “当我再次点击任何链接(注销除外)时,所有会话变量数据都消失了。”你写对了吗?听起来您在注销位中混淆了逻辑...所以它总是注销而不是仅注销?

标签: php jquery ajax session


【解决方案1】:

您可能面临的问题之一是 admin.php 的包含部分。虽然您希望 session_start() 几乎总是在每个新文件的开头,但包含部分只是将代码附加到着陆 php 文件,在一个“大”文件中启动多个会话。

解决此问题的一种方法是在每个“子”php 文件中,将会话开始写为 -

if (session_status() == PHP_SESSION_NONE) {
  session_start();
}

这适用于 PHP 5.4 及更高版本。对于早期版本,请使用

if (session_id() == '') {
  session_start();
}

【讨论】:

  • 嗯,你的回答不正确,但它确实让我找到了解决方案,所以你得到了加分。
  • 添加了我自己的答案,在 admin.php 中的第二个 if 语句 if ($_POST['action'] == "logout");有一个错误的分号....所以它每次都在触发。
【解决方案2】:
  <?php
  session_start();
  if ($_POST['action'] == "reports")
  {
include('reports.php');
  }
  if ($_POST['action'] == "logout");{    <------
include('logout.php');
  }
  if ($_POST['action'] == "api"){
include('apiMgmt.php');
  }

删除注销中的分号 if 语句解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 2012-09-02
    • 2019-04-30
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    相关资源
    最近更新 更多