2009-09-28 65 views
0

如果我只是去session_start()並嘗試標準會話增量測試,PHP會話默認使用我的配置。PHP會話save_handler用戶(mysql)不會保存

if (!isset($_SESSION['count'])) { 
    $_SESSION['count'] = 0; 
} else { 
    $_SESSION['count']++; 
} 

但是我想使用MySQL表進行會話存儲。我已經將我的sessions.php文件與所有函數放在一起,將它們從n00b這樣的書中直接複製出來,並且如果我將它們稱爲常規函數,但函數可以工作(影響數據庫),但使用標準測試以上不起作用。它僅爲頁面加載設置會話,並且數據庫中沒有更改。我在每個函數中放了一行記錄每個調用,並且日誌反映了函數被session_start()調用。

這裏是我的代碼如下所示:

session_module_name("user"); 
session_set_save_handler("session_open", "session_close", 
"session_read", "session_write", "session_remove", "session_gc"); 
session_start(); 

爲session_open等,是在我的職務名稱。我甚至用一個很好的例子嘗試了另一組函數,並得到了相同的結果。

任何想法爲什麼? session_register()也產生相同的結果。

編輯:這裏是實際的功能,我對長度表示歉意,但我記錄了一切。

function session_db(){ 
    return("my_db_name"); 
    } 
function session_table(){ 
    return("sessions_table"); 
    } 
function session_log($message){ 
    if($file = fopen($application["siteroot"] . 'log/session.txt', "a")){ 
     fwrite($file, date("Y-m-d H:i:s ") . $message . "\n"); 
     fclose($file); 
     } 
    } 
function session_open($path, $name){ 
    session_log("session_open"); 
    return(true); 
    } 
function session_close(){ 
    session_log("session_close"); 
    return(true); 
    } 
function session_read($id){ 
    session_log("session_read"); 
    if(!mysql_select_db(session_db())){ 
     session_log("session_read select database error: " . mysql_error()); 
     return(false); 
     } 
    $sql = "select * from " . session_table() . " where id='" . $id . "'"; 
    if(!$result = mysql_query($sql)){ 
     session_log("MySQL error: " . mysql_error() . " with SQL: " . $sql); 
     return(false); 
     } 
    if(mysql_num_rows($result)){ 
     session_log("MySQL query returned " . mysql_num_rows($result) . "rows."); 
     $row = mysql_fetch_assoc($result); 
     session_log("session_read returned " . $row["data"]); 
     return($row["data"]); 
     } 
    else{ 
     session_log("session_read found zero rows with SQL: " . $sql); 
     return(""); 
     } 
    } 
function session_write($id, $data){ 
    session_log("session_write"); 
    if(!mysql_select_db(session_db())){ 
     session_log("session_write select database error: " . mysql_error()); 
     return(false); 
     } 
    $sql = "update " . session_table() . " set data = '" . addslashes($data) . "', time=null"; 
    if(isset($PHP_AUTH_USER)){ 
     $sql .= ", user='" . addslashes($PHP_AUTH_USER) . "'"; 
     } 
    $sql .= " where id='" . $id . "'"; 
    if(!$result = mysql_query($sql)){ 
     session_log("session_write error " . mysql_error() . " with SQL: " . $sql); 
     return(false); 
     } 
    if(mysql_affected_rows()){ 
     session_log("session_write update affected " . mysql_affected_rows() . " rows with SQL: " . $sql); 
     return(true); 
     } 
    session_log("session_write updated zero rows with SQL: " .$sql); 
    $sql = "insert into " . session_table() . "(data,id) values('" . addslashes($data) . "','" . $id . "')"; 
    if(!$result = mysql_query($sql)){ 
     session_log("session_write error " . mysql_error() . "with SQL: " . $sql); 
     return(false); 
     } 
    else{ 
     session_log("mysql_write inserted with SQL: " . $sql); 
     return(true); 
     } 
    } 
function session_remove($id){ 
    session_log("session_remove"); 
    if(!mysql_select_db(session_db())){ 
     session_log("session_remove select database error: " . mysql_error()); 
     return(false); 
     } 
    $sql = "delete " . session_table() . " where id='" . $id . "'"; 
    if($result = mysql_query($sql)){ 
     session_log("MySQL query delete worked"); 
     return(true); 
     } 
    else{ 
     session_log("MySQL update error: " . mysql_error() . " with SQL: " . $sql); 
     return(false); 
     } 
    } 
function session_gc($life){ 
    session_log("session_gc"); 
    if(!mysql_select_db(session_db())){ 
     session_log("session_gc select database error: " . mysql_error()); 
     return(false); 
     } 
    $sql = "delete " . session_table() . " where time < '" . date("YmdHis", time() - $life) . "'"; 
    print("session_gc sql: " . $sql); 
    if($result = mysql_query($sql)){ 
     session_log("session_gc deleted " . mysql_affected_rows() . " rows."); 
     return(true); 
     } 
    else{ 
     session_log("session_gc error: " . mysql_error() . " with SQL: " . $sql); 
     return(false); 
     } 
    } 
+0

如何顯示您的sessions.php?沒有這些,很難想象可能會出現什麼問題。 –

+0

添加了sessions.php,(對不起,我只是試圖保持郵政的大小:-) – Aaron

回答

0

我不認爲你需要調用session_module_name,嘗試評論它,看看會發生什麼。

+0

看起來你是對的,我不需要調用它,我評論它,沒有任何改變。同樣的結果,會話持續1頁加載。 – Aaron

+0

嘗試記錄傳遞給session_write的參數,並確保id和會話數據是正確的。 – Neel

+0

好的打電話給Neel!我應該記錄下來!結果session_write甚至沒有被調用,這就是問題的一部分。 因此,如果session_start()調用session_open和session_read,爲什麼你認爲調用register_session甚至$ _SESSION =不會調用session_write? – Aaron

1

有一對夫婦的事情...

  1. 我們需要看到,至少是,實際的作用。

  2. 您可能想要註冊一個關閉功能,您的寫入可能被調用太晚而無法保存到數據庫。

    register_shutdown_function('session_write_close');

只是爲了澄清,上述原因是寫入和關閉功能通常在對象被銷燬後調用。此調用將確保這些是在對象銷燬之前完成的。