• 欢迎访问Ppabc博客网站,专注于Linux、CentOS、Apache、Nginx、MySQL、PHP等开源工具安装优化的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入Ppabc博客
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏Ppabc博客吧

PHP用MYSQL存SESSION数据测试代码

php技术 admin 7年前 (2012-05-10) 392次浏览

在使用 session 时一般也就是以下几个步骤:

1.启动 session,使用 session_start()函数;

如果使用的状态是 cookie base 的 session 传递方式,之后程式的开头都必须使用 session_start()函数,而且一定要放在页面开头,之前不能有任何结果输出(比如:echo 输出或者 html)

如果在 php.ini 的设置中 session.use_trans_sid = 1,点击页面上的连接可以正常传值到第二页,网址会自动加上(举例)[?PHPSESSID=8234c3f661bd1eac450c23d5650e0881]

如果在 php.ini 的设置中 session.use_trans_sid = 0,需要使用 URL 的方式传递 session id,[SID]是 php 在启动 session 后自动产生的变量,可以在 URL 中使用,如:第二页(URLs)

传递过来的第二页也要先启动 session,调用 session_start()函数。

2.注册 session,不推荐使用 session_register()函数,使用$_SESSION[]来注册;

需要先调用 session_start()函数,使用$_SESSION[”session_name”] = “session_value”;的方式注册 session

3.清楚 session,使用 session_destroy()函数

结束 session,同时删除 session 文件,需要事先调用过 session_start()

4.取得 session 的 id,使用 session_id()函数

5.查看 session 是否已被注册,使用 session_is_registered()函数

下面再将跟 session 有关的函数罗列一下,用到自己查 php 手册即可

session_cache_expire ;得到目前 cache 的存活时间

session_cache_limiter ;得到或设计目前 cache 的限制器

session_decode ;从某一字符串进行 session 资料的解码

session_destroy ;注销一个 session

session_encode ;把 session 字符串进行编码

session_id ;得到或设定目前的 session id

session_is_registered ;检测 session 是否已经建立

session_module_name ;取得或设定目前 session 的组能

session_name ;取得或设定目前 session 的名称(预设:PHPSESSID)

session_regenerate_id ;更新当前的 session id

session_register ;注册 session

session_save_path ;得到或设定目前 session 文件的存储路径

session_start ;启动 session

session_unregister ;注销某个指定的 session

session_unset ;释放所有 session 里的资料

session_write_close ;写入 session 资料并结束 session 功能

session_set_save_handler;设定使用者 session 的存储方式

session_get_cookie_params ;取得 session 在 cookie 的参数

session_set_cookie_params ;设定 session 在 cookie 的参数

/* SQL
    CREATE TABLE `sess` (
    `sesskey` varchar(32) NOT NULL default "",
    `expiry` bigint(20) NOT NULL default '0',
    `data` longtext NOT NULL,
    PRIMARY KEY (`sesskey`),
    KEY `expiry` (`expiry`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
sesskey 为 SESSION ID,expiry 为 SESSION 过期时间,data 用于保存 SESSION 数据。
默认情况下 SESSION 数据是以文件方式保存,想要使用数据库方式保存,就必须重新定义 SESSION 各个操作的处理函数。PHP 提供了 session_set_save_handle()函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user。

接下来着重讲一下 session_set_save_handle() 函数,此函数有六个参数:

session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )

各个参数为各项操作的函数名,这些操作依次是:打开、关闭、读取、写入、销毁、垃圾回收。PHP 手册中有详细的例子,在这里我们使用 OO 的方式来实现这些操作,详细代码如下:
*/
    //类定义
    class My_Sess
    {
    function init()
    {
    $domain = '.zhank.com';
    //不使用 GET/POST 变量方式
    ini_set('session.use_trans_sid', 0);
    //设置垃圾回收最大生存时间 MY_SESS_TIME
    ini_set('session.gc_maxlifetime', 3600);
    //使用 COOKIE 保存 SESSION ID 的方式
    ini_set('session.use_cookies', 1);
    ini_set('session.cookie_path', '/');
    //多主机共享保存 SESSION ID 的 COOKIE
    ini_set('session.cookie_domain', $domain);
    //将 session.save_handler 设置为 user,而不是默认的 files
    session_module_name('user');
    //定义 SESSION 各项操作所对应的方法名:
    session_set_save_handler(
    array('My_Sess', 'open'), //对应于静态方法 My_Sess::open(),下同。
    array('My_Sess', 'close'),
    array('My_Sess', 'read'),
    array('My_Sess', 'write'),
    array('My_Sess', 'destroy'),
    array('My_Sess', 'gc')
    );
    } //end function
    function open($save_path, $session_name) {
    return true;
    } //end function
    function close() {
    global $MY_SESS_CONN;
    if ($MY_SESS_CONN) { //关闭数据库连接
    $MY_SESS_CONN->Close();
    }
    return true;
    } //end function
    function read($sesskey) {
    global $MY_SESS_CONN;
    $sql = 'SELECT data FROM sess WHERE sesskey=' . $MY_SESS_CONN->qstr($sesskey) . ' AND expiry>=' . time();
    $rs =& $MY_SESS_CONN->Execute($sql);
    if ($rs) {
    if ($rs->EOF) {
    return ;
    } else { //读取到对应于 SESSION ID 的 SESSION 数据
    $v = $rs->fields[0];
    $rs->Close();
    return $v;
    } //end if
    } //end if
    return ;
    } //end function
    function write($sesskey, $data) {
    global $MY_SESS_CONN;
    $qkey = $MY_SESS_CONN->qstr($sesskey);
	$qkey = str_replace("'","",$qkey);
	//echo $qkey;
    $expiry = time() + 3600; //设置过期时间 My_SESS_TIME
    //写入 SESSION
    $arr = array(
    'sesskey' => $qkey,
    'expiry' => $expiry,
    'data' => $data);
    $MY_SESS_CONN->Replace('sess', $arr, 'sesskey', $autoQuote = true);
    return true;
    } //end function
    function destroy($sesskey) {
    global $MY_SESS_CONN;
    $sql = 'DELETE FROM sess WHERE sesskey=' . $MY_SESS_CONN->qstr($sesskey);
    $rs =& $MY_SESS_CONN->Execute($sql);
    return true;
    } //end function
    function gc($maxlifetime = null) {
    global $MY_SESS_CONN;
    $sql = 'DELETE FROM sess WHERE expiry. time()';
    $MY_SESS_CONN->Execute($sql);
    //由于经常性的对表 sess 做删除操作,容易产生碎片,
    //所以在垃圾回收中对该表进行优化操作。
    $sql = 'OPTIMIZE TABLE sess';
    $MY_SESS_CONN->Execute($sql);
    return true;
    } //end function
    }
    //使用 ADOdb 作为数据库抽象层。
    require_once('adodb5/adodb.inc.php');
    //数据库配置项,可放入配置文件中(如:config.inc.php)。
    $db_type = 'mysql';
    $db_host = 'localhost';
    $db_user = 'root';
    $db_pass = '123123';
    $db_name = 'test2';
    //创建数据库连接,这是一个全局变量。
    $GLOBALS['MY_SESS_CONN'] =& ADONewConnection($db_type);
    $GLOBALS['MY_SESS_CONN']->Connect( $db_host, $db_user, $db_pass, $db_name);
    //初始化 SESSION 设置,必须在 session_start() 之前运行!!
    My_Sess::init();
	//session_start();
$sesskey="163";
$data="111ererer";
My_Sess::open('/', $sesskey);
My_Sess::write($sesskey, $data);

$aaa= My_Sess::read($sesskey);
echo $aaa;


Selinux 中国 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP 用 MYSQL 存 SESSION 数据测试代码
喜欢 (0)