要瘋了。。三天了。。一個問題就是搞不定。不知道問誰去。
問題如下:
我在set_session_test.php中註冊的session無法再get_session_php中讀取,也就是只能讀取當天頁面的session。。。為神馬???求神人解釋。高分求救。
資料庫結構如下:
conf.php
final_session.php
Mysql Error:".mysql_errno()."";die();}if(!mysql_select_db($gb_DBname)){echo "
Mysql Error:".mysql_errno()."";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
get_session_test.php
回複討論(解決方案)
session_set_save_handler()
注意:使用本函數前,先要配置php.ini檔案,session.save_hadler=user ,否則,session_set_save_handler()不會生效。
session_set_save_handler()
注意:使用本函數前,先要配置php.ini檔案,session.save_hadler=user ,否則,session_set_save_handler()不會生效。
有試過。。也用ini_set()函數設定了。。結果依然是這樣的。。。資料庫中是有session寫入的。。
if(list($value) = mysql_fetch_row($qid)){
????
你查詢的是全部欄位,為什麼只取出第一個?
那不是 sessionid 嗎?
把sess_read裡的
$qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time();
換成
$qry = "SELECT value FROM db_session WHERE sesskey = '$key' and expiry > ".time();
就可以了。
你試用cookie看可以解決你的問題嗎。
樓主$_SESSION['message'] = "Can I help you?";
輸出變數看看。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);} 好的。。我去試下。。但感覺應該不是這個問題。。因為session已經成功寫入。。是讀取的問題。
還有一處
PHP code
function sess_write($key, $val){
global $SESS_DBH,$SESS_LIFE;
$expiry = time()+$SESS_LIFE;
$value = $val;
$qry = "REPLACE INTO db_session VALUES('$key', $expiry, ……
還是不行。。。不過學會了REPLACE的用法。。受教了。
等待高人解決。。另外本人貼張圖上來。好讓大家明白究竟什麼樣的儲存結構。
好的。。我去試下。。但感覺應該不是這個問題。。因為session已經成功寫入。。是讀取的問題。
引用 11 樓 的回複:
還有一處
PHP code
function sess_write($key, $val){
global $SESS_DBH,$SESS_LIFE;
$expiry = time()+$SESS_LIFE;
$value = $val;
$qr……
加分懸賞。提供正解者。加分100.
SESSIONID($key)是儲存在COOKIE裡的,有沒有設定它的儲存時間呢?
能確保再次訪問的時候能拿到跟前次訪問相同的$key?
怎麼還沒搞好呢?
這是我改寫的你的代碼。
因為我不喜歡用全域變數改成了常量,另外改了一下庫名和表名
Mysql Error:".mysql_errno().""; die(); } define("SESS_DBH", $conn); if(!mysql_select_db(DBNAME, SESS_DBH)){ echo "Mysql Error:".mysql_errno().""; 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();
sess_read裡的
if(list($value) = mysql_fetch_row($qid)){ return $value; } 錯了,只需要返回session的序列化串,也就是表內的value欄位,改成
if($value = mysql_fetch_row($qid)){ return $value[2]; } 嚴重感謝。。。代碼測試可以正常運行。。但我還是想知道是神馬毛病。
怎麼還沒搞好呢?
這是我改寫的你的代碼。
因為我不喜歡用全域變數改成了常量,另外改了一下庫名和表名
PHP code
define("DBHOST", "localhost");
define("DBUSER", "root");
define("DBPSW", "");
define("DBNAME", "test");
define("PAGENUM",10);
defi……
那段代碼木有問題。。測試過。。換了結果還是一樣的。
sess_read裡的
PHP code
if(list($value) = mysql_fetch_row($qid)){
return $value;
}
錯了,只需要返回session的序列化串,也就是表內的value欄位,改成
PHP code
if($value = mysql_fetch_row($qid)){
re……
100分送你了。。。稍等我看下能不能找出什麼毛病。。這兩天就結貼。
怎麼還沒搞好呢?
這是我改寫的你的代碼。
因為我不喜歡用全域變數改成了常量,另外改了一下庫名和表名
PHP code
define("DBHOST", "localhost");
define("DBUSER", "root");
define("DBPSW", "");
define("DBNAME", "test");
define("PAGENUM",10);
defi……
因為你的表中的sesskey列沒有設為主鍵或惟一約束,所以在每次在session_start();會產生一個一樣的SID,把資料庫表sesskey列設定為主鍵或惟一鍵即可解決。
註:你多重新整理幾次你的測試代碼,然後去資料庫查一下會發現有多個重複的SID
我的資料庫是有設主鍵的。。你說的情況我明白。但不是這種情況。
我有個回帖裡面也提到了這個問題。
資料庫的寫入是沒有問題的。。可以正常插入。
但是你設的主鍵是不是(sesskey和expiry),而不是sesskey吧???
不是組合主鍵。。。主鍵只有sesskey....
但是你設的主鍵是不是(sesskey和expiry),而不是sesskey吧???
問題可能出在:
function sess_read($key){
$qry = "SELECT * FROM sessions WHERE sesskey = '$key' and expiry > ".time();
你把$qry列印出來,看看能不能取到?
sess_read裡的
資料庫讀出來後 只能返回value欄位裡面的資料! 不能返回整條資料