Welcome 微信登录

首页 / 网页编程 / PHP / Session保存到数据库的php类分享

复制代码 代码如下:
<?php
class SessionToDB
{
private $_path = null;
private $_name = null;
private $_pdo = null;
private $_ip = null;
private $_maxLifeTime = 0;

public function __construct(PDO $pdo)
{
session_set_save_handler(
array(&$this, "open"),
array(&$this, "close"),
array(&$this, "read"),
array(&$this, "write"),
array(&$this, "destroy"),
array(&$this, "gc")
);

$this->_pdo = $pdo;
$this->_ip = !empty($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : null;
$this->_maxLifeTime = ini_get("session.gc_maxlifetime");
}

public function open($path,$name)
{
return true;
}

public function close()
{
return true;
}

public function read($id)
{
$sql = "SELECT * FROM session where PHPSESSID = ?";
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id));

if (!$result = $stmt->fetch(PDO::FETCH_ASSOC)) {
return null;
} elseif ($this->_ip != $result["client_ip"]) {
return null;
} elseif ($result["update_time"]+$this->_maxLifeTime < time()){
$this->destroy($id);
return null;
} else {
return $result["data"];
}
}

public function write($id,$data)
{
$sql = "SELECT * FROM session where PHPSESSID = ?";
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id));

if ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($result["data"] != $data) {
$sql = "UPDATE session SET update_time =? , date = ? WHERE PHPSESSID = ?";

$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array(time(), $data, $id));
}
} else {
if (!empty($data)) {
$sql = "INSERT INTO session (PHPSESSID, update_time, client_ip, data) VALUES (?,?,?,?)";
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id, time(), $this->_ip, $data));
}
}

return true;
}

public function destroy($id)
{
$sql = "DELETE FROM session WHERE PHPSESSID = ?";
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id));

return true;
}

public function gc($maxLifeTime)
{
$sql = "DELETE FROM session WHERE update_time < ?";
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array(time() - $maxLifeTime));

return true;
}
}

try{
$pdo = new PDO("mysql:host=localhost;dbname=rphp4zf", "root","rickyfeng");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

new SessionToDB($pdo);
} catch(PDOException $e) {
echo "Error: ".$e->getMessage();
}