我的php会话表现得很奇怪

时间:2011-05-05 14:58:32

标签: php session

看起来我还没有掌握会话。 对于包含的文件,将无法访问会话数据,或者在重新加载页面时存储会话数据。

我有以下代码:

page1.php中

<?php
/*
Template Name: Some template
*/

  session_start();  
  $_SESSION['start'] = 'start';
  print_r($_SESSION);

  if(some condition)      
    include('include1.php');
  else
    include('include2.php');
?>

include1.php

<?php
  /* Some comments here */

  $_SESSION['test'] = 'Test text';
  print_r($_SESSION);
?>

include2.php

<?php
  /* Some comments here */

  print_r($_SESSION);
?>

第1页首先包含include1.php我做的一些事情。然后我加载包含include2.php的page1。

print_r()的输出结果是:

Array ( [start] => start ) // From page 1
Array ( [start] => start [test] => Test text )  // From include 1
Array ( [start] => start ) // From include 2

我的问题是:
1)为什么在重新加载后第一个[include]中的page1.php中没有输出print_r()? 2)为什么在include2.php中输出'[include]

我只在第1页添加session_start(),因为包含了其他两个文件。我也尝试在两个包含文件中添加session_start(),但这也不起作用,因为它会创建新实例。

更新
我的“实际”包括代码:

  switch($action) {
    case 'a': include_once('include/include1.php'); break;
    case 'b': include_once('include/include2.php'); break;
    //default:  
  }
  print_r($_SESSION); // <- Here all registered session variables are outputed

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我觉得饼干没有被保存。检查浏览器中的PHPSESSID或类似内容的Cookie。如果该cookie永远不会被设置,很可能是因为您尝试在发送标题后开始会话。启用警告将显示情况就是这样。

只要您开始正常输出,就会通过PHP发送标头。因此,如果在page1中您有此代码:

<?php
    echo "<html>";

    // Session starts here...
?>

然后会话无法保存到客户端,并且每次用户加载页面时都不会启动任何内容。如果在PHP开始/结束标记之前或之后文件中有空格,则会出现类似的情况。

答案 2 :(得分:0)

您显示的代码按照预期的方式工作:

您初始化了会话 - session_start()

您在数组中创建了第一个元素 - start

在第一个include上,您通过添加键test

向$ _SESSION添加了一个数组元素

当您输出第一个包含时,它包含starttest

在第二个包含中,您没有向$ _SESSION添加任何数组元素,这就是它仅输出start

的原因

您声明的包含代码仅在第一页或第二页中调用,但不能同时在两者中调用。