免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1384 | 回复: 0
打印 上一主题 下一主题

使用数据库保存session的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-24 16:42 |只看该作者 |倒序浏览
使用数据库保存session的方法
php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。
使用数据库保存session的方法
php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。
数据表结构:[session_tbl]
CREATE TABLE session_tbl (  
sesskey char(32) not null,  
expiry int(11) unsigned not null,  
value text not null,  
PRIMARY KEY (sesskey)  
);
程序代码:[session_inc.php]
[color="#0000bb"]$SESS_DBHOST [color="#007700"]= [color="#dd0000"]"yourhost"[color="#007700"]; [color="#ff8000"]/* database server hostname */
[color="#0000bb"]$SESS_DBNAME [color="#007700"]= [color="#dd0000"]"yourdb"[color="#007700"]; [color="#ff8000"]/* database name */
[color="#0000bb"]$SESS_DBUSER [color="#007700"]= [color="#dd0000"]"youruser"[color="#007700"]; [color="#ff8000"]/* database user */
[color="#0000bb"]$SESS_DBPASS [color="#007700"]= [color="#dd0000"]"yourpassword"[color="#007700"]; [color="#ff8000"]/* database password */
[color="#0000bb"]$SESS_DBH [color="#007700"]= [color="#dd0000"]""[color="#007700"];
[color="#0000bb"]$SESS_LIFE [color="#007700"]= [color="#0000bb"]get_cfg_var[color="#007700"]([color="#dd0000"]"session.gc_maxlifetime"[color="#007700"]);
function [color="#0000bb"]sess_open[color="#007700"]([color="#0000bb"]$save_path[color="#007700"], [color="#0000bb"]$session_name[color="#007700"]) {
    global [color="#0000bb"]$SESS_DBHOST[color="#007700"], [color="#0000bb"]$SESS_DBNAME[color="#007700"], [color="#0000bb"]$SESS_DBUSER[color="#007700"], [color="#0000bb"]$SESS_DBPASS[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"];
    if (! [color="#0000bb"]$SESS_DBH [color="#007700"]= [color="#0000bb"]mysql_pconnect[color="#007700"]([color="#0000bb"]$SESS_DBHOST[color="#007700"], [color="#0000bb"]$SESS_DBUSER[color="#007700"], [color="#0000bb"]$SESS_DBPASS[color="#007700"])) {
        echo [color="#dd0000"]"
  • Can't connect to $SESS_DBHOST as $SESS_DBUSER"
  • MySQL Error: "
  • Unable to select database $SESS_DBNAME"[color="#007700"];
            echo [color="#dd0000"]"[color="#007700"]. [color="#0000bb"]mysql_error[color="#007700"]();
            die;
        }
        if (! [color="#0000bb"]mysql_select_db[color="#007700"]([color="#0000bb"]$SESS_DBNAME[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"])) {
            echo [color="#dd0000"]"[color="#007700"];
            die;
        }
        return [color="#0000bb"]true[color="#007700"];
    }
    function [color="#0000bb"]sess_close[color="#007700"]() {
        return [color="#0000bb"]true[color="#007700"];
    }
    function [color="#0000bb"]sess_read[color="#007700"]([color="#0000bb"]$key[color="#007700"]) {
        global [color="#0000bb"]$SESS_DBH[color="#007700"], [color="#0000bb"]$SESS_LIFE[color="#007700"];
        [color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " [color="#007700"]. [color="#0000bb"]time[color="#007700"]();
        [color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
        if (list([color="#0000bb"]$value[color="#007700"]) = [color="#0000bb"]mysql_fetch_row[color="#007700"]([color="#0000bb"]$qid[color="#007700"])) {
            return [color="#0000bb"]$value[color="#007700"];
        }
        return [color="#0000bb"]false[color="#007700"];
    }
    function [color="#0000bb"]sess_write[color="#007700"]([color="#0000bb"]$key[color="#007700"], [color="#0000bb"]$val[color="#007700"]) {
        global [color="#0000bb"]$SESS_DBH[color="#007700"], [color="#0000bb"]$SESS_LIFE[color="#007700"];
        [color="#0000bb"]$expiry [color="#007700"]= [color="#0000bb"]time[color="#007700"]() + [color="#0000bb"]$SESS_LIFE[color="#007700"]; [color="#ff8000"]//过期时间
        [color="#0000bb"]$value [color="#007700"]= [color="#0000bb"]addslashes[color="#007700"]([color="#0000bb"]$val[color="#007700"]);
        [color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')"[color="#007700"];
        [color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
        if (! [color="#0000bb"]$qid[color="#007700"]) {
            [color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " [color="#007700"]. [color="#0000bb"]time[color="#007700"]();
            [color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
        }
        return [color="#0000bb"]$qid[color="#007700"];
    }
    function [color="#0000bb"]sess_destroy[color="#007700"]([color="#0000bb"]$key[color="#007700"]) {
        global [color="#0000bb"]$SESS_DBH[color="#007700"];
        [color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"DELETE FROM session_tbl WHERE sesskey = '$key'"[color="#007700"];
        [color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
        return [color="#0000bb"]$qid[color="#007700"];
    }
    function [color="#0000bb"]sess_gc[color="#007700"]([color="#0000bb"]$maxlifetime[color="#007700"]) {
        global [color="#0000bb"]$SESS_DBH[color="#007700"];
        [color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"DELETE FROM session_tbl WHERE expiry [color="#007700"]();
        [color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
        return [color="#0000bb"]mysql_affected_rows[color="#007700"]([color="#0000bb"]$SESS_DBH[color="#007700"]);
    }
    [color="#0000bb"]session_set_save_handler[color="#007700"](
    [color="#dd0000"]"sess_open"[color="#007700"],
    [color="#dd0000"]"sess_close"[color="#007700"],
    [color="#dd0000"]"sess_read"[color="#007700"],
    [color="#dd0000"]"sess_write"[color="#007700"],
    [color="#dd0000"]"sess_destroy"[color="#007700"],
    [color="#dd0000"]"sess_gc"[color="#007700"]);
    [color="#0000bb"]session_start[color="#007700"]();
    [color="#0000bb"]?>
    完成以上步骤后,在程序中使用require("session_inc.php")来代替session_start()即可,其他的session函数还是象以前一样的方法调用


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/3413/showart_53220.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP