veritabanında php oturumları yalnızca tablo bilgi parçasını yazma

2 Cevap php

GÜNCELLEME (okuma / yazma yapar sınıfı için kod eklendi)

<?php
error_reporting(E_ALL);

class dbSession
{
    function dbSession($gc_maxlifetime = "", $gc_probability = "", $gc_divisor = "")
    {
        if ($gc_maxlifetime != "" && is_integer($gc_maxlifetime)) {
            @ini_set('session.gc_maxlifetime', $gc_maxlifetime);
        }
        if ($gc_probability != "" && is_integer($gc_probability)) {
            @ini_set('session.gc_probability', $gc_probability);
        }
        if ($gc_divisor != "" && is_integer($gc_divisor)) {
            @ini_set('session.gc_divisor', $gc_divisor);
        }
        $this->sessionLifetime = ini_get("session.gc_maxlifetime");
        session_write_close(); 

        session_set_save_handler(
            array(&$this, 'open'),
            array(&$this, 'close'),
            array(&$this, 'read'),
            array(&$this, 'write'),
            array(&$this, 'destroy'),
            array(&$this, 'gc')
        );
        register_shutdown_function('session_write_close');
        @session_start();
    }

    function open($save_path, $session_name)
    {
        $mySQLHost = "localhost";
        $mySQLUsername = "username";
        $mySQLPassword = "password";
        $mySQLDatabase = "rst_sessions";

        $link = mysql_connect($mySQLHost, $mySQLUsername, $mySQLPassword);

        if (!$link) {

            die ("Could not connect to database!");

        }

        $dbc = mysql_select_db($mySQLDatabase, $link);

        if (!$dbc) {

            die ("Could not select database!");

        }

        return true;

    }

    function close()
    {
        mysql_close();
        return true;
    }

    function read($session_id)
    {

        $result = @mysql_query("
            SELECT
                session_data
            FROM
                session_data
            WHERE
                session_id = '".$session_id."' AND
                http_user_agent = '".$_SERVER["HTTP_USER_AGENT"]."' AND
                session_expire > '".time()."'
        ");

        if (is_resource($result) && @mysql_num_rows($result) > 0) {

            // return found data
            $fields = @mysql_fetch_assoc($result);
            // don't bother with the unserialization - PHP handles this automatically
            return $fields["session_data"];

        }
        return "";
    }

    function write($session_id, $session_data)
    {

        // first checks if there is a session with this id
        $result = @mysql_query(" SELECT *FROM session_data WHERE session_id = '".$session_id."'");
        if (@mysql_num_rows($result) > 0) 
        {
            $result = @mysql_query(" UPDATE session_data
                SET
                    session_data = '".$session_data."',
                    session_expire = '".(time() + $this->sessionLifetime)."',
                    account_id = '" . $_SESSION['account']['account_id'] . "',
                    username = '" . $_SESSION['users']['username'] . "', 
                    report_logo_path = '". $_SESSION['path_to_report_logo'] . '/' . $_SESSION['report_logo_img'] . "',
                    report_footer_all = '". $_SESSION['report_footer_all'] . "',
                    report_footer_summary= '". $_SESSION['report_footer_summary'] . "'
                WHERE
                    session_id = '".$session_id."'
            ");

            // if anything happened
            if (@mysql_affected_rows()) 
            {
                return true;
            }


        } 
        else // if this session id is not in the database
        {
            $sql = "
                INSERT INTO
                    session_data
                        (
                            session_id,
                            http_user_agent,
                            session_data,
                            session_expire,
                            account_id,
                            username
                        )
                    VALUES
                        (
                            '".serialize($session_id)."',
                            '".$_SERVER["HTTP_USER_AGENT"]."',
                            '".$session_data."',
                            '".(time() + $this->sessionLifetime)."',
                            '".$_SESSION['account']['account_id']."',
                            '".$_SESSION['users']['username']."'    
                        )
            ";

            $result = @mysql_query($sql);

            if (@mysql_affected_rows()) 
            {
                // return an empty string
                return "";
            }

        }

        // if something went wrong, return false
        return false;

    }

}
?>

GÜNCELLEME: Ben oturumu yerine DB bir dosyaya yazılı izin vermek için php.ini dosyasındaki satırı uncommented ettik, ve ben sağ noktalar üzerinde session_start () koymak. Yani diğer noktalar kod ekarte etmek mümkün oldum. Bir gerekliliktir oturumları, saklamak için bir veritabanı kullanırken bana bu sorunu çözmek yardımcı olabilir orada başka bir fikir varsa, bana bildirin böylece bu sorun yalnızca oluşur. teşekkürler.


ORIGINAL POST: I'm having difficulty figuring out what's going on here, hoping some one can help me out.

Ben mysql veritabanında benim oturum bilgi depolamak, php kullanarak edilmiştir. Uygulama sadece localhost, Vista üzerinde çalışıyor. Php.ini dosyasında ben "session.save_handler = Dosyaları" hattı üzerinden yorumladı ve yazar / vb okur oturumu işlemek için bir php sınıfını kullanıyorum

Benim giriş işlemi şudur: login.php yoluyla oturum açma bilgilerini gönderin. login.php loginprocess.php çağırır. loginprocess.php kullanıcıyı doğrular ve geçerli yeni bir oturum başlatır ve oturum vars veri ekler, o zaman index.php yönlendirir.

İşte sorun bu. loginprocess.php sayfa $ _SESSION ['account_id'] = $ account_id gibi set olsun oturumu vars bir grup var; vs ama ben index.php gitmek ve ne zaman bir var_dump($_SESSION) sadece "array () boş" diyor. Ancak, yönlendirme hat header("Location: ../index.php"); o oturum değişkeni tüm verileri gösterir hemen önce, loginprocess.php bir var_dump($_SESSION) yaparsanız. Ben oturum bilgilerin depolandığı veritabanı bakarsanız, orada veri session_id alanında olduğu alan created_ts ve alanını sona eriyor, ancak session_data alan bunun içinde bir şey vardır ve geçmişte bu alanda nerede tüm oturum verileri saklandı.

Nasıl loginprocess.php de oturumu var_dump mümkün olabilir, ancak veriler bir tür önbelleğe kullanarak, db tablosunda mevcut değil mi? Ben, vb çerezlerimi, temizlenir .. ama değişim yok.

Neden session_id, bir tabloya yazılıyor, ama gerçek oturum veri yok?

Herhangi bir fikir takdir edilmektedir. Teşekkürler.

2 Cevap

PHP oturum verilerini erişmek için önce session_start gerekir.

Serialize () işlevi bakmak, ve veritabanına yazmadan önce onu kullanmayı düşünün; ve karşılık gelen unserialize () okurken