使用資料庫儲存session的方法 (轉)

worldblog發表於2007-12-03
使用資料庫儲存session的方法 (轉)[@more@]作者:?member_id=3584">liuphy 發表日期:2000年12月20日 閱讀次數:98
 php的session預設是以方式儲存在端,並且在客戶端使用cookie儲存變數,這就會出現一個問題,當一個由於某種原因關閉了的cookie,中的session相關操作將無法。因此,如果能以儲存session資料,將不受客戶端設定的限制,並且在和擴充套件性等方面有一個飛躍。程式中使用關鍵是session_set_save_handler,同時要將php.ini裡的session.save_handler = files 改為 user。這裡我們討論的環境是(freesd)++my+php。

資料表結構:[sessions]
CREATE TABLE sessions ( 
sesskey char(32) not null, 
expiry int(11) unsigned not null, 
value text not null, 
PRIMARY KEY (sesskey) 
);

程式程式碼:[session_inc.php]
$SESS_HOST = "yourhost"; /* database server hostname */
$SESS_DBNAME = "yourdb"; /* database name */
$SESS_DBUSER = "youruser"; /* database user */
$SESS_DBPASS = "yourpass"; /* database password */

$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

function sess_open($save_path, $session_name) {
 global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;

 if (! $SESS_DBH = _pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
 echo "
  • Can't connect to $SESS_DBHOST as $SESS_DBUSER";
     echo "
  • MySQL Error: " . mysql_error();
     die;
     }

     if (! mysql__db($SESS_DBNAME, $SESS_DBH)) {
     echo "
  • Unable to select database $SESS_DBNAME";
     die;
     }

     return true;
    }

    function sess_close() {
     return true;
    }

    function sess_read($key) {
     global $SESS_DBH, $SESS_LIFE;

     $qry = "SELECT value FROM session_tbl 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 = addslashes($val);

     $qry = "INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')";
     $qid = mysql_query($qry, $SESS_DBH);

     if (! $qid) {
     $qry = "UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();
     $qid = mysql_query($qry, $SESS_DBH);
     }

     return $qid;
    }

    function sess_destroy($key) {
     global $SESS_DBH;

     $qry = "DELETE FROM session_tbl WHERE sesskey = '$key'";
     $qid = mysql_query($qry, $SESS_DBH);

     return $qid;
    }

    function sess_gc($maxlifetime) {
     global $SESS_DBH;

     $qry = "DELETE FROM session_tbl WHERE expiry  $qid = mysql_query($qry, $SESS_DBH);

     return mysql_affected_rows($SESS_DBH);
    }

    session_set_save_handler(
    "sess_open",
    "sess_close",
    "sess_read",
    "sess_write",
    "sess_destroy",
    "sess_gc");

    session_start();
    ?>

    完成以上步驟後,在程式中使用require("session_inc.php")來代替session_start()即可,其他的session函式還是象以前一樣的方法。

  • 【本文版權歸作者與奧索網共同擁有,如需轉載,請註明作者及出處】 

     

     

    說明:有利於使用者線上交流,並統計線上人數


    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987577/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章