1

所以这是我的设置。

在 file1 中,我有一个 class1。在构造函数中,我创建了一个类变量,例如

$this->session = $_SESSION['test'];

在构造函数中,我在 $this->session 中设置了一些默认值,例如

$this->session['something']['somethingelse'] = 'test';

Class1 需要(在函数中)file2 并启动 class2(在 file2 中)。调用一个函数并给出一个 $this->session。然后我使用 &$session 引用变量。

$this->session 然后更改 class2 中的值让我们说喜欢

$this->session['something']['somethingelse'] = 'test2';

当我返回到 class1 时,我可以看到值已更改。我现在调用一个 storeSession 函数,该函数基本上与开始相反。

$_SESSION['test'] = $this->session;

我对 $this->session 和 $_SESSION 都进行了 var_dump,在 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 末尾转储 $this->session 值 - 确认它已更改。取消设置 $_SESSION 然后尝试设置

$this->session['something']['somethingelse'] = 'test';

但是它根本没有设置!这个地方简直是空的。那么整个 $_SESSION 是空的。如果我清除会话 cookie 并运行页面,就会出现这种情况。

我很困惑......我以前从未遇到过这些会话处理问题。有任何想法吗?它与会话中的多维数组有关吗?

我觉得我已经尝试了一切。我也试过在我用正确的值更改会话后立即创建一个 session_write_close() 但结果是一样的。


编辑

我离得更近了一点。我认为这与 $this->session 的引用有关。

就在我设置会话之前,我 var_dump 和 echo $this->session['seomthing'] 这表示值是正确的 - 来自 class2 的更改值。当我在 $_SESSION 中插入这个值时,我没有得到正确的值!!!我得到 test 而不是 test2 我刚刚被告知是它的价值。PHP 这里有一些完全错误的地方。如果我用像'lalala'这样的字符串设置$_SESSION,它会改变。如果我在 $this->session['seomthing'] 之前更改它也可以工作!所以会话不是问题。我可以改变它。

$this->session['seomthing'] = 'sdfsdfs';

那么 vardump 和 echo 如何告诉我该值是一回事,但是当我将其插入 SESSION 时,它又是另一个值!这就是为什么我如此困惑。PHP 告诉我两件事。

所以基本上我在第一类中有一个变量(测试)。我将它发送到第二类,在那里我将它更改为 test2,而我有 & 字体(参考)。然后我在第一堂 vardump 中回显它,它说它现在是 test2。我把它放入 $_SESSION 然后它说值是 test... 而不是 test2... wtf?


编辑2

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

类1.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();
?>

类2.php

<?php
session_start();

class class2 {

    public $session;

    function __construct(&$session) {
        $this->session = &$session;
        $this->main();
    }

    function main() {
        $this->session['somethingelse'] = 'test2';      
    }
}
?>

会话.php

<?php
session_start();

var_dump(session_id());
var_dump($_SESSION);
?>

/RJ

4

3 回答 3

1

据我所知,您应该先调用 session_start(),然后再使用 $_SESSION... 这可以解释为什么您的整个 $_SESSION 都是空的。

请记住:如果要使用 $_SESSION 数组,则必须始终在脚本中使用“session_start()”。session_start() 不仅启动用户会话,而且继续当前会话。session_start() 用于获取用户的会话 ID 并将其与他们的文件相关联,从而将文件中的变量加载到 $_SESSION 中,如果不使用 session_start(),则 $_SESSION 值将不可用

http://www.free2code.net/tutorials/view/php_sessions-11/page1.html

于 2012-08-10T08:27:55.080 回答
0

我建议你扔掉所有奇怪的类和东西,并尝试一个完全空的 php 脚本。

例如 yoursite.com/test.php

只需放入基本的会话内容即可。session_start() 等

设置一些会话变量。

print_r($_SESSION,false); //打印到屏幕

然后,在重新加载页面之前,删除实际设置会话变量的任何代码,但保留 print_r 语句。

然后尝试加载页面,例如 yoursite.com/test.php?anyrandomthing=whatever

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

于 2013-05-22T02:20:50.963 回答
0

您确定在设置新值之前没有 session_write_close() 吗?

于 2012-08-10T09:10:14.383 回答