簡體   English   中英

session_set_save_handler無法正常工作

[英]session_set_save_handler is not working

我一直在嘗試使用session_set_save_handler()設置保存會話,但我不知道出了什么問題,我擁有所有可調用的函數,但是某處出現了問題,在這里發布了我的代碼。 順便說一句,我在WP工作。

    <?php 
$root = dirname(dirname(dirname(dirname(__FILE__))));
if (file_exists($root.'/wp-load.php')) {
    require_once($root.'/wp-load.php');
}
if (file_exists($root.'/wp-config.php')) {
    require_once($root.'/wp-config.php');
}

global $wpdb;

//function called when session_start();
function _open() {
    print "Session opened.\n";
    print "</br>";
    return true;
}

//called at the end of the page
function _close() {
    print "</br>";
    print "Session closed.\n";
    print "</br>";
    return true;
}

//function called after session_start();
function _read($session_id) {
    global $wpdb;

    $session_id = mysql_real_escape_string($session_id);
    $record = $wpdb->get_var( "SELECT data FROM sessions_gm WHERE id='$session_id'");
    print "SELECT data FROM sessions_gm WHERE id='$session_id'";

    print "Session READ.\n";
    print "</br>";
    print "El record:".$record;

     if($record)
    return $record;

    return '';
}

function _write($session_id, $data) {
    global $wpdb;
    $access = time();
    $session_id = mysql_real_escape_string($session_id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);

    $session = $wpdb->get_row("SELECT * FROM sessions_gm WHERE id = '$session_id'");

    print "SELECT * FROM sessions_gm WHERE id = '$session_id'";
    print "La session:";
    print_r($session);

    print "</br>";
    print "Session value written.\n";
    print "</br>";
    print "Sess_ID: $session_id\n";
    print "</br>";
    print "Data: $data\n\n";
    print "</br>";

    if($session == null)
    {
        $insert = $wpdb->insert( 
        'sessions_gm', 
        array( 
        'id' => $session_id, 
        'access' => $access,
        'data' => $data
        ), 
        array( 
        '%s', 
        '%d', 
        '%s'
        ) 
        );

        if($insert!=false)
        {
            print "Se inserto.";
            return true;
        }
    }
    else
    {
        $update = $wpdb->update( 
            'sessions_gm', 
            array( 
            'access' => $access,    // string
            'data' => $data // integer (number) 
            ), 
            array( 'id' => $session_id ), 
            array( 
            '%d',   // value1
            '%s'    // value2
            ), 
            array( '%s' ) 
        );

        if($update!=false)
        {
            print "Se updateo.";
            return true;
        }
    }

    return false;
}

// called when session_destroy();
function _destroy($session_id) {
    global $wpdb;
    $session_id = mysql_real_escape_string($session_id);
    print "</br>";
    print "Session destroy called.\n";
    print "</br>";
    $delete=$wpdb->query( "DELETE FROM sessions_gm WHERE id = '$session_id'");
    if($delete!=false)
    {
        print "Se elimino";
        return true;
    }
    return false;
}

function _gc($maxlifetime) {
    print "</br>";
    print "Session garbage collection called.\n";
    print "</br>";
    print "Sess_maxlifetime: $maxlifetime\n";
    print "</br>";
   $old = time() - $max;
   $old = mysql_real_escape_string($old);
   $delete=$wpdb->query( "DELETE FROM sessions_gm WHERE access < '$old'");

     if($delete!=false)
    {
        print "Se elimino las pasadas.";
        return true;
    }
    return false;
}

var_dump(is_callable("_open"));
var_dump(is_callable("_close"));
var_dump(is_callable("_read"));
var_dump(is_callable("_write"));
var_dump(is_callable("_destroy"));
var_dump(is_callable("_gc"));


if (session_set_save_handler("_open", "_close", "_read", "_write", "_destroy", "_gc")) {
    die('Works fine');
}
else {
    die('Couldn\'t set session handler');
} 

session_set_save_handler("_open", "_close", "_read", "_write", "_destroy", "_gc");
session_start();

$_SESSION['Username'] = 'clau';  
print_r($_SESSION);?>

所以由於某些原因,如果:

        if (session_set_save_handler("_open", "_close", "_read", "_write", "_destroy", "_gc")) {
    die('Works fine');
}
else {
    die('Couldn\'t set session handler');}

它正在返回無法設置會話處理程序。 謝謝您的幫助! :D

在設置處理程序之前,嘗試添加session_write_close()函數:

session_write_close();

if (session_set_save_handler("_open", "_close", "_read", "_write", "_destroy", "_gc")) {
    die('Works fine');
} else {
    die('Couldn\'t set session handler');
} 

會話似乎已經開始。 然后重新初始化:

session_start();

首先,這是錯誤的

if (session_set_save_handler("_open", "_close", "_read", "_write", "_destroy", "_gc")) {
    die('Works fine');
} else {
    die('Couldn\'t set session handler');
}

因為當你打電話給死(...); session_start(); 不要解雇,會話也無法開始。

其次,您的方法很困惑,請嘗試以下示例:

class session extends SessionHandler { 

        protected $users;
        protected $emailshadow = null; 

        public function setNewUsers(Users $users){


            $this->users = clone $users;

            if(!$this->emailshadow)$this->emailshadow = $users->getShadowEmail();

            return true;

        }

        public function destroy($sessID) { 

            $this->users->setLogout($this->emailshadow);

            return true; 

        } 

        public function gc($sessMaxLifeTime) { 

            $this->users->setLogout($this->emailshadow);

            return true;

        } 
    } 

    $usersession = new session(); 


    session_set_save_handler($usersession,true);

    session_name("op-session");
    session_start();

好的,在此示例中,我使用由我編碼的Users類進行用戶登錄,在這種情況下,

session_destroy();

觸發它會設置用戶注銷,但是最重要的是,當您注銷時,編寫以下代碼:

$_SESSION = array();
session_destroy();


if (isset($_SERVER['HTTP_COOKIE'])) {

    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
     foreach($cookies as $cookie) {

       $parts = explode('=', $cookie);
       $name = trim($parts[0]);

       setcookie($name, '', -(time()+3600*24));
       setcookie($name, '', -(time()+3600*24), '/');

    }

}

因為如果您不刪除所有cookie,則此會話仍然有效。 這項工作對我來說很好,希望對您有所幫助,對不起我的英語。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM