所以这是我的设置。
在file1中我有一个class1。 在构造函数中,我创建了一个类变量,如
$this->session = $_SESSION['test'];
在构造函数中,我在$ this-> session中设置了一些默认值,如
$this->session['something']['somethingelse'] = 'test';
Class1需要(在函数中)file2并启动class2(在file2中)。调用函数并提供$ this->会话。然后我使用& $ session引用变量。
$ this-> session然后更改class2中的值,让我们说喜欢
$this->session['something']['somethingelse'] = 'test2';
当我返回class1时,我可以看到值已更改。 我现在调用storeSession函数,它基本上与开头相反。
$_SESSION['test'] = $this->session;
我var_dump $ this->会话和$ _SESSION,在file1中我可以看到值已被更改。
然后我通过调用我有
的另一个php文件结束session_start();
var_dump(session_id());
var_dump($_SESSION);
exit;
但这里结果不对! $ this-> session ['something'] ['somethingelse']的值是'test'而不是'test2'!如果我用var_dump($ _ SESSION)重新加载页面,那对于file1也是如此;在顶部,价值没有改变。我也调试了session_id,我肯定在所有文件中运行相同的会话!
现在这里有一些更奇怪的东西。就像我不能覆盖我在开头设置的默认值。它与多维数组有关吗?
我在file1中做的最后一件事是更改值。我做的第一件事是$ _SESSION上的var_dump。无论我尝试什么,多维数组中的值都不会改变(第一次设置时)!
我甚至尝试在file1的末尾vardump the $ this->会话值 - 确认它已经改变。取消设置$ _SESSION,然后尝试设置
$this->session['something']['somethingelse'] = 'test';
但它根本没有设定!这个地方很空。那么整个$ _SESSION都是空的。如果我清除会话cookie并运行该页面就是这种情况。
我感到困惑......我之前从未遇到会话处理的这些问题。有任何想法吗?它与会话中的多维数组有什么关系吗?
我觉得我已经尝试了一切。我也尝试过,在用正确的值更改会话后立即创建session_write_close()但结果是相同的。
我走近了一点。 我认为它与$ this-> session的引用有关。
在我设置会话之前,我在var_dump和echo $ this-> session ['seomthing']之前,这个值是正确的 - 来自class2的更改值。当我在$ _SESSION中插入此值时,我不会获得正确的值!我得到测试而不是test2,我刚被告知是它的价值。这里有一些完全错误的PHP。如果我用'lalala'这样的字符串设置$ _SESSION就会改变。如果我更改$ this-> session ['seomthing']之前它也可以正常工作!所以Session不是问题。我可以改变它。
$ this-> session ['seomthing'] ='sdfsdfs';
那么vardump和echo怎么能告诉我值是一回事但是当我在SESSION中插入它时它是另一个值!这就是为什么我这么困惑。 PHP告诉我两件不同的事情。
所以基本上我在第一类中有一个变量(测试)。我把它发送到第二级,我把它改成test2,而我有&在字体(参考)。然后我在第一级vardump并回应它,它说它现在是test2。我把它放入$ _SESSION然后它说值是测试...而不是test2 ... wtf?
所以我试着做一个我正在做的事情的一个非常简单的例子。当我这样做的时候一切正常......所以答案必须在代码中的某个地方......我正在关闭这个并进一步挖掘这个谜团。
class1.php
<?php
session_start();
class Class1 {
var $session;
public function __construct() {
$this->session = $_SESSION['something'];
$this->session['somethingelse'] = 'test';
$this->main();
}
private function main() {
var_dump($this->session);
require_once 'class2.php';
$Class2 = new Class2($this->session);
$Class2->main();
$this->storeSession();
}
private function storeSession() {
var_dump($this->session);
$_SESSION['something'] = $this->session;
var_dump($_SESSION);
echo 1;
}
}
new Class1();
?>
class2.php
<?php
session_start();
class class2 {
public $session;
function __construct(&$session) {
$this->session = &$session;
$this->main();
}
function main() {
$this->session['somethingelse'] = 'test2';
}
}
?>
session.php文件
<?php
session_start();
var_dump(session_id());
var_dump($_SESSION);
?>
/ RJ
答案 0 :(得分:1)
据我所知,在使用$ _SESSION之前,你应首先调用session_start()...这可以解释为什么你的整个$ _SESSION都是空的。
请记住:如果您在脚本中必须始终使用“session_start()” 想要使用$ _SESSION数组。 session_start()不仅会启动 用户的会话,但它继续当前会话。 session_start()是 用于获取用户的会话ID并将其与其文件关联, 因此,如果不这样做,则将文件中的变量加载到$ _SESSION中 使用session_start()$ _SESSION值将不可用
http://www.free2code.net/tutorials/view/php_sessions-11/page1.html
答案 1 :(得分:0)
在设置新值之前,您确定没有session_write_close()吗?
答案 2 :(得分:0)
我建议你扔掉所有奇怪的类和东西,并尝试一个完全空的PHP脚本。
e.g。 yoursite.com/test.php
只需输入基本的会话内容。 session_start()等。
设置一些会话变量。
的print_r($ _ SESSION,假); //打印到屏幕
然后,在重新加载页面之前,删除实际设置会话变量的任何代码,但保留print_r语句。
然后尝试加载像yoursite.com/test.php?anyrandomthing=whatever
这样的页面查看是否打印了相同的会话。如果您这样做,那么您至少确定您的服务器正在正确处理会话,并且您的问题出在您的代码中。