跨頁面讀取資料庫session失敗

來源:互聯網
上載者:User
要瘋了。。三天了。。一個問題就是搞不定。不知道問誰去。
問題如下:
我在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欄位裡面的資料! 不能返回整條資料

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.