2011-09-20 40 views
0

我有一個在循環中多次調用的頁面。我有一個版本,它在頁面加載時從MySQL提取數據,在頁面重複該過程之前將修改的數據推回給每個提交。其中一些數據僅對會話運行很重要,在會話結束時被拋棄在構造函數和析構函數中讀取會話變量的I/O

我玩的是一個類,它從構造函數中的會話變量中加載其變量,然後將最終值退出到析構函數中的相同會話變量。我有以下幾條內容。在首次調用構造函數時成功初始化變量,並通過析構函數的第一個實例傳出。但是,它們無法在第二次調用構造函數時加載。我錯過了什麼嗎?

在此先感謝

class counters 
{ 
    protected $qCounters; 

    function __construct() 
    { 
    $this->qCounters = $_SESSION['q']['counters']; 
    } 

    // process happen here to alter values 

    function __destruct() 
    { 
    $_SESSION['q']['counters'] = $this->qCounters; 
    } 
} 
+0

我以爲你在最好只在這裏建模會話,然後添加方法添加到特定的計數器領域,而不是試圖建模反擊自己。 – prodigitalson

+0

等一下。 。 。您正在循環中多次呼叫一個頁面。 。 ?聽起來。 。 。可怕。爲什麼,你爲什麼這樣做? –

+0

爲什麼那麼糟糕?在這種情況下,對於任何具有相同問題的人來說,它對於一個複雜問題 – giles

回答

0

這裏是我的[非常簡單]會話處理程序。注意db_query()是mysqli_query()的一個簡單包裝,並在內部處理所有連接細節。

function session_close() { 
    return true; 
} 

function session_die($id) { 
    db_query("DELETE FROM session WHERE ID='$id'"); 
    return true; 
} 

function session_gc($maxlifetime) { 
    return true; 
} 

function session_open($path,$name) { 
    return true; 
} 

function session_read($id) { 
    $dchk = db_query("SELECT data FROM session WHERE ID='$id'"); 
    if(db_numrows($dchk) == 1) { 
    if(!isset($_SESSION['row'])) { $_SESSION['row'] = 1; } 
    list($data) = db_rows($dchk); 
    return base64_decode($data); 
    } else { 
    return ""; 
    } 
    db_free($dchk); 
    return true; 
} 

function session_write($id,$data) { 
    global $visitor; 
    $data = base64_encode($data); 
    if(!isset($_SESSION['row'])) { 
    db_query("INSERT IGNORE INTO session (ID,data,accessed) VALUES('$id','$data',UNIX_TIMESTAMP(NOW()))"); 
    } else { 
    db_query("UPDATE session SET data='$data',accessed=UNIX_TIMESTAMP(NOW()) WHERE ID='$id'"); 
    } 
    return true; 
} 

參考