<?php
/**
*数据库高级概念--在数据库中保存session;
*db_session.inc.php
*/
$sdbc=NULL;//变量$sdbc将保存数据库连接,在此对其进行初始化,然后在每个函数里让它成为全局变量。
//定义打开会话的函数,作用在于建立一个数据库连接。
function open_session(){
global $sdbc;
$sdbc=mysqli_connect('localhost','root','LUANtao','test') OR die('Cannot connect to the database.');
return true;
}
//定义关闭会话的函数,它将关闭数据库连接,返回操作成功的状态。
function close_session(){
global $sdbc;
return mysqli_close($sdbc);
}
//定义读取会话数据的函数,接受一个会话ID并检索其数据并返回。
function read_session($sid){
global $sdbc;
//格式化字符串,并使用mysqli_real_escape_string()来保证其安全。
$q=sprintf('select data from sessions where id="%s"',mysqli_real_escape_string($sdbc,$sid));
$r=mysqli_query($sdbc,$q);
if(mysqli_num_rows($r)==1){
list($data)=mysqli_fetch_array($r,MYSQLI_NUM);
return $data;
}else{
return '';
}
}
//定义向数据库写入数据函数,接收会话ID和会话数据
function write_session($sid,$data){
global $sdbc;
$q=sprintf('replace into sessions (id,data) values ("%s","%s")',mysqli_real_escape_string($sdbc,$sid),mysqli_real_escape_string($sdbc,$data));
//在数据库中首次插入数据要用insert语句,之后要使用update语句。使用replace可以得到相同的结果。
$r=mysql_query($sdbc, $q);
return mysqli_affected_rows($sdbc);
}
//创建销毁会话的函数,接收一个会话ID,通常发生在session_destory()函数被调用时使用。
function destroy_session($sid){
global $sdbc;
$q=sprintf('delete from sessions where id="%s"', mysqli_real_escape_string($sdbc,$sid));
$r=mysqli_query($sdbc,$q);
$_SESSION=array();//清除数组$_SESSION
return mysqli_affected_rows($sdbc);
}
//定义来收集函数,大多数程序员不会考虑的事情,其原因是PHP会自动删除旧的会话。
//它接收一个以秒为单位的时间,用以接收什么事‘旧’的会话。删除超过指定时间没有被访问的会话。
function clean_session($expire){
global $sdbc;
$q=sprintf('delete from sessions where date_add(last_accessed,interval %d second)<now()',(int)$expire);
$r=mysqli_query($sdbc,$q);
return mysqli_affected_rows($sdbc);
}
//告诉PHP使用会话处理函数
//在PHP设置里session.auto_start的值是On(表示每个页面会自动启动会话),就不能使用函数session_set_save_handler()。
session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session','destroy_session', 'clean_session');
//启动会话。
session_start();
//session_set_save_handler()并不启动会话,需要调用session_start()。
//必须以上述次序使用函数。如果颠倒,脚本中定义的处理函数会被忽略掉。
//在所有输出被发送到web浏览器后,"写入"会话才会被调用,之后,“关闭“才会被调用
?>
<?php
/*
* 数据库高级概念--在数据库中保存session;
*index.php
*/
//session_start()函数位于db_session.inc.php里,它必须在任何内容被发送到浏览器前调用,所以这个文件必须包含在任何HTML之前。
require_once 'db_session.inc.php';
//给空会话保存些数据
if(empty ($_SESSION)){
$_SESSION['blah']='nmlaut';
$_SESSION['this']='3615684.45';
$_SESSION['that']='blue';
echo'<p>Session Data Stored.</p>';
}else{
echo '<p>Session Data Exits:<pre>'.print_r($_SESSION,1).'</pre></p>';
}
//创建注销功能
if(isset($_GET['logout'])){
session_destroy();
echo '<p>Session destoryed.</p>';
}else{
echo '<a href="index.php?logout=ture">Log Out</a>';
}
//显示会话数据
echo '<p>Session Data:<pre>'.print_r($_SESSION,1).'</pre></p>';
session_write_close();
?>
在数据库中保存会话session
最新推荐文章于 2023-10-25 17:10:22 发布