1

これが私のセットアップです。

file1 には class1 があります。コンストラクターで、次のようなクラス変数を作成します

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

コンストラクターで、 $this->session のようにいくつかのデフォルト値を設定しました

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

Class1 は (関数内で) file2 を必要とし、(file2 内にある) class2 を開始します。関数を呼び出し、$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 値を vardump してみました - 変更されていることを確認しました。$_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 を使用して、値が 1 つのものであることを教えてくれますが、それを SESSION に挿入すると、それは別の値になります! これが私がとても混乱した理由です。PHPは2つの異なることを教えてくれます。

基本的に、クラス1に変数(テスト)があります。これをクラス 2 に送信し、フォント (参照) に & がある間に test2 に変更します。次に、クラス 1 の vardump でそれをエコーすると、現在は test2 であると表示されます。私はそれを $_SESSION に入れましたが、値は test... であり、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

4

3 に答える 3

1

私の知る限り、$ _ SESSIONを使用する前に、まずsession_start()を呼び出す必要があります...これで、$_SESSION全体が空になる理由が説明できます。

注意:$ _ SESSION配列を使用する場合は、スクリプトで常に「session_start()」を使用する必要があります。session_start()は、ユーザーのセッションを開始するだけでなく、現在のセッションを継続します。session_start()は、ユーザーのセッションIDを取得してファイルに関連付けるために使用されます。したがって、session_start()を使用しない場合、$_SESSION値は使用できなくなります。

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

于 2012-08-10T08:27:55.080 に答える
0

新しい値を設定する前に session_write_close() を持っていませんか?

于 2012-08-10T09:10:14.383 に答える
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 に答える