PHP会话save_handler用户(mysql)将无法保存

时间:2009-09-28 17:46:25

标签: php mysql session

默认情况下,PHP会话使用我的配置,如果我只是去 session_start()并尝试标准会话增量测试。

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);
        }
    }

2 个答案:

答案 0 :(得分:1)

我认为您不需要调用session_module_name,尝试将其注释掉,看看会发生什么。

答案 1 :(得分:1)

有几件事......

  1. 我们可能至少需要看到实际的功能。

  2. 您可能想要注册一个关闭函数,您的写入可能被调用太晚而无法保存到数据库中。

    register_shutdown_function( 'session_write_close');

  3. 为了澄清,上面的原因是写入和关闭函数通常在对象被销毁后调用。此调用将确保在对象销毁之前进行这些调用。