我的php会话行为怪异

我的php会话行为怪异,php,session,Php,Session,看来我还没有掌握会话。 重新加载页面时,会话数据将无法访问包含的文件或存储 我有以下代码: page1.php <?php /* Template Name: Some template */ session_start(); $_SESSION['start'] = 'start'; print_r($_SESSION); if(some condition) include('include1.php'); else includ

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

我有以下代码:

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');
?>
我的问题是: 1为什么在第一次print_rafter重新加载时[include]没有在page1.php中输出? 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

尝试使用会话名称和会话id


在我看来,cookies没有被保存。检查浏览器中的cookies是否有PHPSESSID或类似内容。如果cookie从未被设置,很可能是因为您试图在发送头之后启动会话。启用警告将向您显示这种情况

只要您开始正常输出,PHP就会发送标题。因此,如果在第1页中有以下代码:

<?php
    echo "<html>";

    // Session starts here...
?>

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

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

您已初始化会话-会话\u开始

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

在第一个include中,您通过添加键测试向$\u会话添加了一个数组元素

输出第一个include时,它包括start和test

在第二个include中,您没有向$\u会话添加任何数组元素,这就是为什么它只输出start


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

您显示的内容应该有效。您使用的是文件路径来包含,而不是http://?@pekka-这应该不是问题,对吗?include可以很好地工作。@eykanal通过http://包含的脚本将在其自己的单独PHP进程中运行,该进程不共享初始脚本的会话数据。@Pekka我没有使用文件路径,我从未使用过该路径。有没有一种使用http://共享会话数据的方法?我刚刚在自己的服务器上尝试了这个方法,但是我无法使用您发布的代码复制这个问题,即在重新加载时在iftrue和iffalse之间切换。尝试添加行ini_set'display_errors',1;错误报告全部;查看是否缺少更基本的内容。这如何解决当前问题?会话变量应在用户的所有页面上可用,而不仅仅是当前页面。因此,当我加载include1.php时,设置了一个会话变量,该变量应该在include2.php中可用。@Steven,对不起,我现在遇到了问题。更新答案。@Kevin Peno-我正在呼叫get_header;课后你开始,所以它。我在不同的文件中有多个标记,如果标记位于代码之间,则标记前/后一定是空白。@Steven,如果是“发送邮件头后”问题,则打开“错误报告”E_ALL,这一点就很明显了;ini设置显示错误,true;。将其放在页面顶部,如果PHP尝试发送标题,您将看到一条警告late@Kevin佩诺,我想你看错了。会话\u开始在我调用get\u头之前。我刚刚发现,在包含其他文件的switch语句之后,我可以输出所有会话变量。但是如果我在page1.php顶部打印f,仍然无法输出所有会话变量。
Array ( [start] => start ) // From page 1
Array ( [start] => start [test] => Test text )  // From include 1
Array ( [start] => start ) // From include 2
  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
<?php
    echo "<html>";

    // Session starts here...
?>