看起来我还没有掌握会话。 对于包含的文件,将无法访问会话数据,或者在重新加载页面时存储会话数据。
我有以下代码:
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
答案 0 :(得分:0)
尝试使用session_name和session_id
答案 1 :(得分:0)
我觉得饼干没有被保存。检查浏览器中的PHPSESSID
或类似内容的Cookie。如果该cookie永远不会被设置,很可能是因为您尝试在发送标题后开始会话。启用警告将显示情况就是这样。
只要您开始正常输出,就会通过PHP发送标头。因此,如果在page1
中您有此代码:
<?php
echo "<html>";
// Session starts here...
?>
然后会话无法保存到客户端,并且每次用户加载页面时都不会启动任何内容。如果在PHP开始/结束标记之前或之后文件中有空格,则会出现类似的情况。
答案 2 :(得分:0)
您显示的代码按照预期的方式工作:
您初始化了会话 - session_start()
您在数组中创建了第一个元素 - start
在第一个include上,您通过添加键test
当您输出第一个包含时,它包含start
和test
在第二个包含中,您没有向$ _SESSION添加任何数组元素,这就是它仅输出start
您声明的包含代码仅在第一页或第二页中调用,但不能同时在两者中调用。