PHP Global değişken oturum işleyicisi ithal olmamak

7 Cevap php

Ben veritabanına bağlanmak ve veritabanı bağlantısı başvurmak için benim işlevleri içinde değişken $ db kullanıyorum için ADODB kullanıyorum.

Nedense, gerçek $ db 'yazma' fonksiyonu ithal almıyor:

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

The function is intended to import the $db's actual value. Instead, it's assigning an empty value to $db. Any idea what is wrong with the above code?

7 Cevap

YORUMLAR TAKİP YOKTU EDENLER İÇİN EDITED ;)

"PHP itibariyle yazma 5.0.5 ve kapat eylemcileri nesne imha sonra denir ve bu nedenle nesneleri kullanmak veya istisnalar olabilir. Ancak nesne yıkıcılar oturumları kullanabilir. Bu tavuk çözmek için yıkıcı session_write_close () çağırmak mümkündür ve yumurta sorun "

Yani fikir böyle bir yıkıcı sahip olmaktır:

function __destruct() {
    session_write_close();
}

Nesneler write kullanılabilir ve böylece kapat eylemcileri.

Daha sonra, güvenlik için, yeniden-instantiate $ write db & global $ db yıkıcı çok iyi SessionHandler kimse önce denebilir yakın çünkü.

Ya $db, küresel ya da bunu boş bir değer atamak atamak yok.

Ben bir PHP uzmanı değilim ama belki bunu üzerine yazıyorsanız. Öncesi ve sonrası $ db bir yankı deneyin

global $ db;

Ve: Eğer (işlev içinde onun değerine bakmadan önce) $ db şey atanan emin misin?

Dışında ve işlev içinde $ db var_dump sahipsiniz.

I am pretty sure what is the problem. See your code will work fine when this file was included in global scope. But consider this:

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

Bu dosyayı çalıştırdığınızda size int(1) çıkış olarak görürsünüz.

Ama başka bir dosya düşünün:

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

abc();

Şimdi gösterecek NULL.

Nedeni, ikinci dosyada olmasıdır. İlk dosya yerel bir bağlamda değil, küresel bir yer oldu. Thats neden global $a çalışmaz.

Bunu değiştirin:

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

ve bunu kullandığınızda: $a=$GLOBALS['a'];

Bu 2 şey deneyin:

  1. Atamak

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

    yerine

    $db=...;
    

    global komut. Sonra $db=$GLOBALS['db']; olarak işlevi başvuru.

    Reason: Bu $db küresel değil, bazı yerde atama bir ihtimal.

  2. Kendi sınıfının özel mülkiyet olarak bunu yapmak. Bir alıcı değil, setter sağlayın. Bunun yerine yapıcınızdan ayarlayın.

Sen başlatma işlemini $db yerde yukarıdaki kodu gibi görünmüyor.

I would expect to see a $db = new ADO("myserver,mydb,user,password") call somewhere in the code.