要疯了。。三天了。。一个问题就是搞不定。不知道问谁去。
问题如下:
我在set_session_test.php中注册的session无法再get_session_php中读取,也就是只能读取当天页面的session为神马???求神人解释。高分求救。数据库结构如下:conf.php<?php
define("DBHOST", "localhost");
define("DBUSER", "root");
define("DBPSW", "");
define("DBNAME", "savesession");
define("PAGENUM",10);
final_session.php<?php
$gb_DBname = "savesession";
$gb_DBuser = "root";
$gb_DBpass = "";
$gb_DBHOSTname = "localhost";$SESS_DBH = "";$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");function sess_open($save_path, $session_name){
global $gb_DBname,$gb_DBuser,$gb_DBpass,$gb_DBHOSTname,$SESS_DBH;
if(!$SESS_DBH = mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){
echo "<li>Mysql Error:".mysql_errno()."</li>";
die();
}
if(!mysql_select_db($gb_DBname)){
echo "<li>Mysql Error:".mysql_errno()."</li>";
die();
}
return true;
}function sess_close(){
return true;
}function sess_read($key){
global $SESS_DBH,$SESS_LIFE;
$qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time();
$qid = mysql_query($qry, $SESS_DBH);
if(list($value) = mysql_fetch_row($qid)){
return $value;
}
return false;
}function sess_write($key, $val){
global $SESS_DBH,$SESS_LIFE;
$expiry = time()+$SESS_LIFE;
$value = $val;
$qry = "INSERT INTO db_session VALUES('$key', $expiry, '$value')";
//echo $qry;
$qid = mysql_query($qry,$SESS_DBH);
if(!$qid){
$qry = "UPDATE db_session SET expiry=$expiry,value='$value' WHERE sesskey='$key' and expiry>".time();
$qid = mysql_query($qry);
}
return $qid;
}function sess_destory($key){
global $SESS_DBH;
$qry = "DELETE FROM db_session WHERE sesskey = '$key'";
$qid = mysql_query($qry, $SESS_DBH);
return $qid;
}function sess_gc($maxlifetime){
global $SESS_DBH;
$qry = "DELETE FROM db_session WHERE expiry<".time();
$qid = mysql_query($qry, $SESS_DBH);
return mysql_affected_rows($SESS_DBH);
}session_module_name();session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destory", "sess_gc");
set_session_test.php<?php
include_once 'final_session.php';session_start();$_SESSION['message'] = "Can I help you?";
$_SESSION['message1'] = "No, Thank ";
$_SESSION['Tom'] = "Tom";
echo $_SESSION['message'];
echo $_SESSION['message1'];
echo $_SESSION['Tom'];echo "<a href=\"get_session_test.php\">显示SESSION</a>";
?>
get_session_test.php<?php
include_once 'final_session.php';session_start();
$_SESSION['test'] = "test";
echo $_SESSION['test'];
$_SESSION['test2'] = "test22222222222";
echo $_SESSION['test2'];
echo $_SESSION['message'];
echo $_SESSION['message1'];
echo $_SESSION['Tom'];
?>
问题如下:
我在set_session_test.php中注册的session无法再get_session_php中读取,也就是只能读取当天页面的session为神马???求神人解释。高分求救。数据库结构如下:conf.php<?php
define("DBHOST", "localhost");
define("DBUSER", "root");
define("DBPSW", "");
define("DBNAME", "savesession");
define("PAGENUM",10);
final_session.php<?php
$gb_DBname = "savesession";
$gb_DBuser = "root";
$gb_DBpass = "";
$gb_DBHOSTname = "localhost";$SESS_DBH = "";$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");function sess_open($save_path, $session_name){
global $gb_DBname,$gb_DBuser,$gb_DBpass,$gb_DBHOSTname,$SESS_DBH;
if(!$SESS_DBH = mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){
echo "<li>Mysql Error:".mysql_errno()."</li>";
die();
}
if(!mysql_select_db($gb_DBname)){
echo "<li>Mysql Error:".mysql_errno()."</li>";
die();
}
return true;
}function sess_close(){
return true;
}function sess_read($key){
global $SESS_DBH,$SESS_LIFE;
$qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time();
$qid = mysql_query($qry, $SESS_DBH);
if(list($value) = mysql_fetch_row($qid)){
return $value;
}
return false;
}function sess_write($key, $val){
global $SESS_DBH,$SESS_LIFE;
$expiry = time()+$SESS_LIFE;
$value = $val;
$qry = "INSERT INTO db_session VALUES('$key', $expiry, '$value')";
//echo $qry;
$qid = mysql_query($qry,$SESS_DBH);
if(!$qid){
$qry = "UPDATE db_session SET expiry=$expiry,value='$value' WHERE sesskey='$key' and expiry>".time();
$qid = mysql_query($qry);
}
return $qid;
}function sess_destory($key){
global $SESS_DBH;
$qry = "DELETE FROM db_session WHERE sesskey = '$key'";
$qid = mysql_query($qry, $SESS_DBH);
return $qid;
}function sess_gc($maxlifetime){
global $SESS_DBH;
$qry = "DELETE FROM db_session WHERE expiry<".time();
$qid = mysql_query($qry, $SESS_DBH);
return mysql_affected_rows($SESS_DBH);
}session_module_name();session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destory", "sess_gc");
set_session_test.php<?php
include_once 'final_session.php';session_start();$_SESSION['message'] = "Can I help you?";
$_SESSION['message1'] = "No, Thank ";
$_SESSION['Tom'] = "Tom";
echo $_SESSION['message'];
echo $_SESSION['message1'];
echo $_SESSION['Tom'];echo "<a href=\"get_session_test.php\">显示SESSION</a>";
?>
get_session_test.php<?php
include_once 'final_session.php';session_start();
$_SESSION['test'] = "test";
echo $_SESSION['test'];
$_SESSION['test2'] = "test22222222222";
echo $_SESSION['test2'];
echo $_SESSION['message'];
echo $_SESSION['message1'];
echo $_SESSION['Tom'];
?>
注意:使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。
有试过。。也用ini_set()函数设置了。。结果依然是这样的数据库中是有session写入的。。
????你查询的是全部字段,为什么只取出第一个?
那不是 sessionid 吗?
$qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time();
换成
$qry = "SELECT value FROM db_session WHERE sesskey = '$key' and expiry > ".time();
就可以了。
输出变量看看。echo $_SESSION['message'];
function sess_write($key, $val){
global $SESS_DBH,$SESS_LIFE;
$expiry = time()+$SESS_LIFE;
$value = $val;
$qry = "REPLACE INTO db_session VALUES('$key', $expiry, '$value')";
$qid = mysql_query($qry,$SESS_DBH);
}
能确保再次访问的时候能拿到跟前次访问相同的$key?
这是我改写的你的代码。
因为我不喜欢用全局变量改成了常量,另外改了一下库名和表名
<?php
define("DBHOST", "localhost");
define("DBUSER", "root");
define("DBPSW", "");
define("DBNAME", "test");
define("PAGENUM",10);
define("SESS_LIFE", get_cfg_var("session.gc_maxlifetime"));function sess_open($save_path, $session_name){
if(! $conn = mysql_pconnect(DBHOST, DBUSER, DBPSW)){
echo "<li>Mysql Error:".mysql_errno()."</li>";
die();
}
define("SESS_DBH", $conn);
if(!mysql_select_db(DBNAME, SESS_DBH)){
echo "<li>Mysql Error:".mysql_errno()."</li>";
die();
}
return true;
}function sess_close(){
return true;
}function sess_read($key){
$qry = "SELECT * FROM sessions WHERE sesskey = '$key' and expiry > ".time();
$qid = mysql_query($qry, SESS_DBH) or die(mysql_error());
$r = mysql_fetch_assoc($qid);
return $r['value'];
}function sess_write($key, $val){
$expiry = time()+SESS_LIFE;
$value = $val;
$qry = "REPLACE INTO sessions VALUES('$key', $expiry, '$value')";
$qid = mysql_query($qry, SESS_DBH);
}function sess_destory($key){
$qry = "DELETE FROM sessions WHERE sesskey = '$key'";
$qid = mysql_query($qry, SESS_DBH);
return $qid;
}function sess_gc($maxlifetime){
$qry = "DELETE FROM sessions WHERE expiry<".time();
$qid = mysql_query($qry, SESS_DBH);
return mysql_affected_rows(SESS_DBH);
}//session_module_name();session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destory", "sess_gc");session_start();
if(list($value) = mysql_fetch_row($qid)){
return $value;
}
错了,只需要返回session的序列化串,也就是表内的value字段,改成
if($value = mysql_fetch_row($qid)){
return $value[2];
}
$qry = "SELECT * FROM sessions WHERE sesskey = '$key' and expiry > ".time();你把$qry打印出来,看看能不能取到?