session入庫,就是重寫session制機,在session的週期內,得到到session的數據並記錄到數據庫php
Session默認是存放到服務器上的文件中,不方便管理,若是能把session存放到數據庫中就能夠方便的對數據庫進行管理了html
好比:mysql
session入庫能夠解決哪些問題?sql
1. 能夠解決跨域操做數據庫
2. 能夠實現單點登錄跨域
3. 能夠統計在線人數服務器
4. 能夠實現同一時只容許一個用戶在線session
session_set_save_handler的回掉函數描述yii
實現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的內容,字段類型爲text
session_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>