Session保存到数据库的php类分享


  本文标签:Session,数据库

复制代码 代码如下:

<?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();
}