PHP会话表现得很奇怪,不会改变价值

时间:2012-08-10 08:19:56

标签: php session reference

所以这是我的设置。

在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?


EDIT2

所以我试着做一个我正在做的事情的一个非常简单的例子。当我这样做的时候一切正常......所以答案必须在代码中的某个地方......我正在关闭这个并进一步挖掘这个谜团。

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

3 个答案:

答案 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

这样的页面

查看是否打印了相同的会话。如果您这样做,那么您至少确定您的服务器正在正确处理会话,并且您的问题出在您的代码中。