2013-02-22 36 views
1

我一直在嘗試使用session_set_save_handler()設置保存會話,我不知道是什麼問題,我有我所有的可調用函數但是會出錯,在這裏我發佈我的代碼。順便說一句我在WP工作。session_set_save_handler無法正常工作

<?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

回答

0

嘗試將處理程序之前添加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(); 
0

第一,這是錯誤的

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

因爲當你調用die(...); 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(); 

好吧,在這個例子中,我使用的用戶類由我編碼的用戶登錄,在這種情況下,當

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,則此會話保持活動狀態。 這項工作對我很好,我希望這可以幫助你,對不起我的英語。