[英]why would session_set_save_handler not be working PHP 5.2
[英]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.