page contents

php SESSION入库的实现

以下内容希望帮助到大家!

attachments-2020-04-Q63B3leq5e85a7a7ee89f.jpg

session入库,就是重写session制机,在session的周期内,获得到session的数据并记录到数据库

Session默认是存放到服务器上的文件中,不方便管理,如果能把session存放到数据库中就可以方便的对数据库进行管理了


比如session入库可以解决哪些问题?

1. 可以解决跨域操作

2. 可以实现单点登陆

3. 可以统计在线人数

4. 可以实现同一时只允许一个用户在线


session_set_save_handler的回掉函数描述


实现session入库


第一步:在php.ini配置文件中设置session.save_headler=user(默认是file)

或者使用ini_set设置ini_set(‘session.save_handler’,’user’);


第二步:创建一个存放session的数据表

session_id用于存放session_id的,字段类型为字符型,长度为32

session_value用于存放session的内容,字段类型为textsession_life 用于存放session的生存期


第三步:session_set_save_handler ( callback $open , callback $close ,callback $read , callback $write , callback $destroy , callback $gc )


 第四步:代码实现

<?php
header('content-type:text/html;charset=utf-8');

//将session存储方式设置为存入数据库的方式
//session.save_handler = files
ini_set("session.save_handler", "user");

session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

//打开并连接数据库
function open()
{
    //使用pdo
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=yii','root','root');
    $pdo->exec('set names utf8');
}

//关闭连接
function close()
{
    //使用pdo
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=yii','root','root');
    $pdo->exec('set names utf8');
    $pdo = null;
}

//从表中中读信息
function read($session_id)
{
    //使用pdo
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=yii','root','root');
    $pdo->exec('set names utf8');
    $read = $pdo->query("select * from session where session_id='$session_id'")->fetch(PDO::FETCH_ASSOC);
    return $read["session_info"];
}

//将session存入数据库
function write ($session_id,$session_info)
{
    // echo $session_id. "        " . $session_info;
    //使用pdo
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=yii','root','root');
    $pdo->exec('set names utf8');
    $read = $pdo->query("select * from session where session_id='$session_id'")->fetch(PDO::FETCH_ASSOC);

    if(empty($read))
    {
        $time = time();
        $pdo->exec("insert into session (session_id, session_info, session_life) values ('$session_id', '$session_info', '$time')");
    }
    else
    {
        $sql = "update session set session_info='$session_info' where session_id='$session_id'";
        $pdo->exec($sql);
    }
}

//销毁指定session
function destroy($session_id)
{
    //使用pdo
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=yii','root','root');
    $pdo->exec('set names utf8');
    $pdo->exec("delete from session where session_id='$session_id'");
}

//删除所有过期的session
function gc()
{

}

session_start();
//判断是否有session
if(isset($_SESSION['name']))
{

    $status = 1;
}
else
{
    $status = 0;

}

//获取需要接收的值
$user_name = isset($_POST['user_name'])?$_POST['user_name']:null;
$user_pwd = isset($_POST['user_pwd'])?$_POST['user_pwd']:null;
//使用pdo
$pdo = new PDO('mysql:host=127.0.0.1;dbname=yii','root','root');
$pdo->exec('set names utf8');
$sql = "select * from user where username = '$user_name' and password = '$user_pwd' ";
$re = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
if($re)
{
    $status = 1;
    $_SESSION['name'] = $user_name;
}

?>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<?php if($status == 0){?>
    <h3>服务器3</h3>
    <form action="a.php" method="post">
        <table>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="user_name"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="user_pwd"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="登录"></td>
            </tr>
        </table>
    </form>
<?php } else{?>
    <h2>欢迎<?=$_SESSION['name']?>登录</h2>
    <h3>服务器3</h3>
<?php }
?>
</body>
</html>


attachments-2020-04-bno4Cgij5e85a77e73158.jpg

  • 发表于 2020-04-02 16:53
  • 阅读 ( 432 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章