0

ADOdbを使用しています。何らかの理由で$db、「書き込み」機能で実際のデータがインポートされません。

この関数は、$dbの実際の値をインポートすることを目的としています。代わりに、空の値を に代入しています$db:

<?php
// load ADODB class
include(DIR_WS_CLASSES . "adodb5/adodb.inc.php");

$db = NewADOConnection(DB_TYPE);
$db->Connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);


class SessionManager {
    var $life_time;

    function SessionManager(){
        global $db;
        // Read the maxlifetime setting from PHP
        $this->life_time = get_cfg_var("session.gc_maxlifetime");

        // Register this object as the session handler
        session_set_save_handler(array(&$this, "open"), 
                                array(&$this, "close"), 
                                array(&$this, "read"), 
                                array(&$this, "write"), 
                                array(&$this, "destroy"), 
                                array(&$this, "gc"));
    }

    function open($save_path, $session_name){
        global $sess_save_path;
        global $db;

        $sess_save_path = $save_path;

        return true;
    }

    function close(){
        global $db;
        return true;
    }

    function read($id){
        global $db;
        // Set empty result
        $data = '';

        // Fetch session data from the selected database
        $time = time();
        $newid = $db->qstr($id, get_magic_quotes_gpc());

        $sql = "SELECT session_data 
                FROM sessions 
                WHERE session_id = $newid 
                AND expires > $time";

        $rs = $db->Execute($sql) or die($db->ErrorMsg());
        $a = $rs->RecordCount();

        if($a > 0){
            $data = $rs->fields['session_data'];
        }

        return $data;
    }

    function write($id, $data){
        global $db;
        // Build query                
        $time = time() + $this->life_time;
        $newid = $db->qstr($id, get_magic_quotes_gpc());
        $newdata = $db->qstr($data, get_magic_quotes_gpc());
        $sql = "REPLACE sessions
                (session_id, session_data, expires) 
                VALUES($newid, $newdata, $time)";

        $rs = $db->Execute($sql) or die($db->ErrorMsg());

        return TRUE;
    }

    function destroy($id){
        global $db;
        // Build query
        $newid = $db->qstr($id, get_magic_quotes_gpc());
        $sql = "DELETE FROM sessions 
                WHERE session_id = $newid";

        $db->Execute($sql) or die($db->ErrorMsg());

        return TRUE;
    }

    function gc(){
    // Garbage Collection
        global $db;
        // Build DELETE query.  Delete all records that passed expiration time
        $sql = "DELETE FROM sessions 
                WHERE expires < UNIX_TIMESTAMP()";

        $db->Execute($sql) or die($db->ErrorMsg());

        // Always return TRUE
        return true;
    }
}


// initialize session
$sess = new SessionManager();
session_start();
?>

$db「書き込み」機能で実際にインポートされないのはなぜですか?

どうすれば問題を解決できますか?

4

7 に答える 7

6

コメントに従わなかった人のために編集されました;)

「PHP 5.0.5 の時点で、書き込みおよびクローズ ハンドラはオブジェクトの破棄後に呼び出されるため、オブジェクトを使用したり、例外をスローしたりすることはできません。ただし、オブジェクト デストラクタはセッションを使用できます。デストラクタから session_write_close() を呼び出して、このチキンを解決し、卵問題」

したがって、アイデアは次のようなデストラクタを持つことです。

function __destruct() {
    session_write_close();
}

オブジェクトを書き込みおよびクローズ ハンドラで使用できるようにします。

次に、安全のために、グローバルな $db デストラクタが SessionHandler の前に呼び出される可能性が非常に高いため、write & close で $db を再インスタンス化します。

于 2009-09-21T07:12:42.703 に答える
0

$db上記のコードのどこにも初期化されていないようです。

$db = new ADO("myserver,mydb,user,password")コードのどこかに呼び出しが表示されると思います。

于 2009-09-21T07:35:28.660 に答える
0

次の2つのことを試してください。

  1. 割当

    $GLOBALS['db']=...;
    

    それ以外の

    $db=...;
    

    グローバルスクリプトで。次に、関数でそれをとして参照します$db=$GLOBALS['db'];

    理由$db:グローバルではない場所に割り当てている可能性があります。

  2. あなたのクラスの私有財産としてそれを作ってください。ゲッターを提供しますが、セッターは提供しません。代わりに、コンストラクターから設定してください。

于 2009-09-21T07:45:35.613 に答える
0

私は問題が何であるかを確信しています。このファイルがグローバル スコープに含まれている場合、コードが正常に動作することを確認してください。しかし、これを考慮してください:

$a=1;
function displaya()
{
    global $a;
    var_dump($a);
}

このファイルを実行するとint(1)、出力として表示されます。

しかし、別のファイルを考えてみましょう:

function abc()
{
include("above-stated-file.php");
displaya();
}

abc();

が表示されるようになりNULLました。

その理由は、2 番目のファイルにあります。最初のファイルは、グローバル コンテキストではなく、ローカル コンテキストに含まれていました。global $aそれが機能しない理由です。

次のように変更します。

$GLOBALS['a']=....;

そしてあなたがそれを使うとき:$a=$GLOBALS['a'];

于 2009-09-21T07:54:20.057 に答える
0

グローバルとして割り当てないか$db、空の値を割り当てます。

于 2009-09-21T06:53:56.887 に答える
0

私は PHP の専門家ではありませんが、上書きしている可能性があります。前後に $db のエコーを試す

グローバル $db;

そして: $db に何かを割り当ててもよろしいですか (関数内の値を見る前に)?

于 2009-09-21T06:57:43.417 に答える
0

関数の外側と内側の $db で var_dump を試してください。

于 2009-09-21T07:09:03.877 に答える