【问题标题】:single page application session_start error notification单页应用程序 session_start 错误通知
【发布时间】:2016-04-22 15:16:59
【问题描述】:

我有一个基于index.php 页面的单页面应用程序,我在其中启动会话并显示第一个内容。然后我根据点击的链接在不同的 div 中加载 Ajax 内容。

如果我想访问已加载页面中的$_SESSION 数组(例如,显示用户名),我还需要将session_start 放入通过Ajax 加载的页面中。 以这种方式一切正常,但是当我看到日志时,我看到每次通过 Ajax 加载其中一个页面时 php 都会抛出一个错误,说

“会话已经开始。忽略 session_start()”。

所以:一方面我需要放置 session_start 来访问会话数组,但另一方面 session_start 命令被忽略。

来自 index.php:

<?php
require '../session_handler.inc.php';
require 'global_functions.php';
session_start();
if(isset($_SESSION['id1'])){
    $actusr=$_SESSION['id1'];
}

一个示例 ajax 调用:

function loadContent(sourceUrl){
    $(".container").load(sourceUrl);
}

我需要在被调用页面顶部的php:

<?php 
require '../../session_handler.inc.php';
require '../global_functions.php';
session_start();

如果我删除 session_start(),$_SESSION 将不可用

我该如何解决这种情况?我可以在不启动会话的情况下从加载的页面访问会话数组吗?

【问题讨论】:

  • 尝试从 ajax 中删除它,因为它是您运行它的脚本的一部分。
  • @Fred-ii- 那么我将不再加载 $_Session 数组
  • 嗯...,奇怪。你能分享你的代码吗?看不出那会怎么破。您在同一个文件中的任何地方都没有 2 个session_start();,对吗?或者别的什么叫它两次?就像一个包含/要求等。某处的功能。
  • @Fred-ii- 不肯定!将添加一些示例代码
  • session_handler.inc.php 和/或global_functions.php 是否包含session_start(); 或任何其他文件调用它两次? @LelioFaieta 也检查你的控制台。

标签: php ajax session


【解决方案1】:

最好使用这一行而不是session_start()。 您可能有多个 session_start 并在这两者之间使用会话。

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

【讨论】:

  • @Fred-ii-,添加描述
  • 这并不能解决问题。它将运行 session_start
  • @LelioFaieta,您在第一行包含的 session_handler 文件中有什么?
  • 这是一个完全空的文件!
  • @LelioFaieta,您是否尝试过我的解决方案?如果是,请回显 session_id() 看看你得到了什么
【解决方案2】:

如果您在本地 WAMP 或 Xamp 环境中进行测试,我建议您清除缓存,关闭浏览器(不是单个选项卡)并运行您的应用。

试试这个 1:

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

或者

2:如果你有php>=5.4.0,最好用这个:

$status = session_status();
if($status == PHP_SESSION_NONE){
    //There is no active session
    session_start();

}else
if($status == PHP_SESSION_ACTIVE){
    //Destroy current and start new one
    session_destroy();
    session_start();
}

希望这会有所帮助..

【讨论】:

  • 我为这个应用运行了一个网络服务器。此解决方案不会解决问题。我需要以会话 _start 以外的任何其他方式将会话数组传递到新页面
【解决方案3】:

移动 session_start();到您的页面顶部

<?php
session_start();
require '../session_handler.inc.php';
require 'global_functions.php';
if(isset($_SESSION['id1'])){
    $actusr=$_SESSION['id1'];
}

session_handler.inc.php 或 global_functions.php 可能已经包含 session_start() 所以将 index.php 的 session_start() 移到顶部。另请注意,这应该是 index.php 中的第一条语句

或者在 index.php 的页面顶部插入下面的代码

<?php
session_start();
?>

并删除 index.php 中的另一个 session_start()

【讨论】:

  • Index.php 需要启动会话以检查用户是否已登录,所以我无法删除它
  • @LelioFaieta 不要删除它,只需将其移动到页面顶部,就在 之后
  • 你知道这不会改变什么吗?这不是“标头已发送”的问题。代码序列完全不影响结果(已测试)
  • @LelioFaieta 请尝试在您正在加载的 div 页面和 index.php 页面中执行相同的操作。不久前我遇到了类似的问题,这样做解决了我的问题。
  • 我的情况不是这样。
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2011-07-03
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多