【问题标题】:PHP Session behaves weird wont change valuePHP Session 行为怪异不会改变值
【发布时间】:2012-08-07 12:46:05
【问题描述】:

这是我的设置。

在 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中的多维数组有关系吗?

我觉得我已经尝试了一切。我也试过在我用正确的值更改会话后立即创建一个 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 然后它说价值是测试......而不是 test2...... wtf?


编辑2

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

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

【问题讨论】:

    标签: php session reference


    【解决方案1】:

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

    记住:你必须在你的脚本中使用“session_start()”,如果你 想要使用 $_SESSION 数组。 session_start() 不仅启动一个 用户的会话,但它会继续当前会话。 session_start() 是 用于获取用户的会话 ID 并将其与他们的文件相关联, 因此将文件中的变量加载到 $_SESSION 中,如果你不这样做 使用 session_start() $_SESSION 值将不可用

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

    【讨论】:

    • 我已经编写 PHP 9 年了,我知道 session_start() 的去向;) session_start() 在所有文档的顶部。
    • 这就像我无法在第一次设置会话时覆盖它!
    • 呵呵,抱歉 - 我不确定您是否在第一个文档中使用了 session_start ;)
    【解决方案2】:

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

    【讨论】:

    • 是的,我确定。请阅读编辑。我不认为这是一个会话问题,而是完全不同的问题。
    【解决方案3】:

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

    例如yoursite.com/test.php

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

    设置一些会话变量。

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

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

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

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

    【讨论】:

    • 嘿巴特。我实际上解决了这个问题。我现在知道为什么它没有关闭。我记得问题是在包含的样式表中发现的。有人留下了背景图片:url();这使得页面重新加载并执行了一些我一开始就无法跟踪的步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2011-10-23
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多