PHP oturum save_handler kullanıcı (mysql) tasarruf olmaz

2 Cevap php

Hey guys, ben burada çalışılıyor ne:

Ben sadece session_start() gidin ve o inşaat standart oturumu artış testi deneyin eğer PHP oturumları, benim yapılandırma ile birlikte varsayılan olarak çalışır.

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

Ancak ben oturumu depolama için MySQL tablo kullanmak istiyorum. Ben benim sessions.php tüm fonksiyonları ile dosya, doğru bir n00b gibi bir kitap onları kopyalanamaz, ve ben normal fonksiyonları gibi onları ararsanız işlevleri, (veritabanını etkilemez) birlikte çalışma koymak ama kullanarak ettik Yukarıdaki standart test çalışmaz. Sadece sayfa yük için oturumu, ve veritabanında değişiklik ayarlar. Ben her çağrıyı oturum için her işlevi bir çizgi koymak ve günlük işlevleri session_start() tarafından çağrıldığını olduğunu yansıtmaktadır.

İşte benim kod şuna benziyor:

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

session_open, vs, benim fonksiyonların ismi olmak. Ben bile o'rly örnek üzerinden fonksiyonları başka bir dizi çalıştı ve aynı sonuçları var.

Any ideas why? session_register() also yields the same results.
Thanks, guys.

EDIT: Burada gerçek fonksiyonları, ben uzunluğu için özür dilerim, ama ben dev şeyi yapın.

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 Cevap

Ben, session_module_name bunu yorumlama deneyin ve neler olacağını görmek için çağrı gerekir sanmıyorum.

Bir kaç şey vardır ...

  1. Biz, en azından, gerçek fonksiyonları görmek gerekebilir.

  2. Muhtemelen yazar muhtemelen veritabanına kaydetmek için çok geç denir ediliyor, bir kapatma işlevi kayıt istiyorum.

    register_shutdown_function ('session_write_close');

Sadece netleştirmek için, için yukarıda nedeni nesneler tahrip sonra yazma ve yakın fonksiyonları normal denir olmasıdır. Bu çağrı, bu nesne imha önce yapılan sağlayacaktır.