会话设置在一个地方但在另一个地方没有设置的奇怪问题

时间:2014-12-28 20:21:48

标签: php session-variables

我有两个用于更新帐户,前端和后端的php页面。

前端(重要部分):

<?php
  session_cache_limiter('none');
  session_start(); //session gets started

  include_once 'includes/db_connection.php';
  include_once 'includes/signin.php'; //file that deals with login and creates the session variables
  include_once 'includes/updateaccount_process.php'; //back end file
?>

后端(重要部分):

<?php
  include_once 'db_connection.php';
  include_once 'signin.php';
?>

如果我将session_start()添加到后端文件,我会收到通知,说明会话已经开始。如果我不添加session_start(),则由于对会话变量的依赖性,php脚本的其余部分无法正常执行。

如果我添加if(!isset($_SESSION)) { session_start(); },它的效果非常好,我没有注意到,但我不明白为什么。

希望有人可以提供帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

虽然PHP可以生成前端内容,但PHP驻留在后端,即你有两个服务器端文件。如果您的第一个PHP文件启动会话,只要您的代码没有销毁或以其他方式禁用该会话,只要您的浏览器保持打开状态,该会话就应该存在。当您转到另一个PHP页面时,如果您运行此代码:

(!isset($_SESSION)) { session_start()

它会检查是否有必要开始一个新的会话。如果会话不再存在,则会创建一个新会话。如果会话仍然有效,运行session_start()而不检查先前设置的会话将导致出现此错误消息:

  

注意:会话已经开始

这个额外的session_start()然后应该恢复当前会话。

可能还有其他原因导致会话出现问题。如果您使用的是PHP5.4或更高版本,则可以调用session_status(),其返回值可以指示会话是已被禁用还是不存在。它还可以确认当前是否有一个活动(请参阅Manual)。

顺便提一下,设计session_status()的核心贡献者主要关心的是为用户提供一种检查当前是否存在活动会话的方法。 (见bug report。)

在您指定为&#34;后端&#34;的页面上,我建议按如下方式重做代码:

<?php
     if (!isset($_SESSION)) || (session_status() !== PHP_SESSION_ACTIVE) ) {
             session_start();
     }
     include_once('signin.php');
     include_once('db_connection.php');

您可以考虑移动include_once("signin.php")并将其放在if条件块中,作为session_start()之后的语句,只要包含的文件只创建会话变量并且之前的代码不会将它们取消设置。

最后一点,您可能希望使用include()而不是include_once(),如果您的事实的两个页面仅包含每个文件一次。 Include_once()比include()慢。只有当您的脚本具有导致尝试在脚本中多次包含该文件的代码时,才应使用include_once(请参阅here)。