<?php
class session
{
private static $handle = null;
private static $ip = null;
private static $lifetime = null;
private static $time = null; static function init($pdo)
{
self::$handle = $pdo;
self::$ip = !empty($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : "unknow";
self::$lifetime = ini_get('session.gc_maxlifetime');
self::$time = time();
} static function start($pdo)
{
self::init($pdo);
session_set_save_handler(
array(__CLASS__,'open'),
array(__CLASS__,'close'),
array(__CLASS__,'read'),
array(__CLASS__,'write'),
array(__CLASS__,'destroy'),
array(__CLASS__,'gc')
);
session_start();
} public static function open($path, $name)
{
return true;
} public static function close()
{
return true;
} public static function read($PHPSESSID)
{
$sql = "select * from session where PHPSESSID = ?";
$smit = self::$handle->prepare($sql);
$smit->execute(array($PHPSESSID)); if(!$result = $smit->fetch(PDO::FETCH_ASSOC))
{
return '';
} if(self::$ip != $result['client_ip'])
{
self::destroy($PHPSESSID);
return '';
} if( ($result['update_time'] + self::$lifetime) < self::$time)
{
self::destroy($PHPSESSID);
return '';
} return $result['data'];
} public static function write($PHPSESSID,$data)
{
$sql = "select * from session where PHPSESSID = ?";
$stmt = self::$handle->prepare($sql);
$stmt->execute(array($PHPSESSID)); if($result = $stmt->fetch(PDO::FETCH_ASSOC))
{
if($result['data'] != $data || self::$time-30 > $result['update_time'])
{
$sql="update session set update_time = ?, data =? where PHPSESSID = ?";
$stmt = self::$handle->prepare($sql);
$stmt->execute(array(self::$time,$data,$PHPSESSID));
} }else
{
if(!empty($data))
{
$sql="insert into session(PHPSESSID, update_time, client_ip, data) values(?,?,?,?)";
$sth = self::$handle->prepare($sql);
$sth->execute(array($PHPSESSID,self::$time,self::$ip,$data));
}
}
return true;
} public static function destroy($PHPSESSID)
{
$sql = "delete from session where PHPSESSID = ?";
$sth = self::$handle->prepare($sql);
$sth->execute(array($PHPSESSID));
return true;
} public static function gc($lifetime)
{
$sql = "delete from session where update_time < ?";
$stmt=self::$handler->prepare($sql);
$stmt->execute(array(self::$time-self::$lifetime));
return true;
}
} try{
$pdo = new PDO("mysql:host=localhost;dbname=test", "root" ,"");
}catch(PDOException $e)
{
echo $e->getMessage();
} session::start($pdo);

session写入数据库的更多相关文章

  1. 将Session写入数据库

    使用session_set_save_handler()函数,将Session的内容写入数据库 <?php /* *@author Fahy *@link http://home.cnblogs ...

  2. PHP session 写入数据库中的方法

    首先解释下为什么要把session 写到数据库中呢,session 一般默认是以文件的形式放在php.ini 配置的目录中的, 如果你的网站实现了多台服务器负载均衡,这样用户访问你的网站,可能进入的服 ...

  3. session 存入数据库 php

     session 机制 1.php中session的生成机制 session是保存在服务器的,当我们在代码中调用session_start();时,PHP会同时往SESSION的存放目录(默认为/tm ...

  4. Asp.Net进程外Session(状态服务器Session、数据库Session)

    介绍 我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了.即Seesion就丢失了.(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变 ...

  5. python通过snmp协议运用多线程获取多台主机网卡信息,写入数据库

    #-*- coding:utf-8 -*- import netsnmp class SnmpClass(object): """ SNMP ""&q ...

  6. flask写入数据库

    sqlalchemy是一个关系型数据库框架,它提供了高层的ORM 和底层的原生数据库的操作. sqlalchemy实际上是对数据库的抽象,通过python对象操作数据库,提高开发效率. 安装 flas ...

  7. c#上传文件并将word pdf转化成txt存储并将内容写入数据库

    c#上传文件并将word pdf转化成txt存储并将内容写入数据库 using System; using System.Data; using System.Configuration; using ...

  8. Log4j写入数据库详解

    log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出.本节主要讲述如何将日志信息输入到 ...

  9. php之将用户信息写入数据库

    session高级应用将用户信息写入到数据库中 首先建立数据库表 在实验数据库sqldb中建立session表,用于存储数据 在根文件夹下建立须要用到的文件(重点是session,class.php这 ...

随机推荐

  1. C# TypeDescriptor获取类型转换器,实现泛型转换

    需求背景 平时的coding过程中,经常性遇到string类型转换成其他的基本类型,如 int double bool等,那我们正常的方式就是下面的方式进行类型转换 int.Parse("1 ...

  2. ruby操作mysql

    require "win32ole" require 'pathname' require 'mysql2' excel = WIN32OLE.new('excel.applica ...

  3. Welcome-to-Swift-07闭包(Closures)

    闭包是自包含的函数代码块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似. 闭包可 ...

  4. HDU-1529 Cashier Employment

    据网上说这是到差分约束四星题... 可我觉得难吗? 比推DP方程容易... 两种约束方式,当然实现到程序就变成六种了... #include <cstdio> #include <c ...

  5. 北京集训TEST13——PA(第k小数)

    题目: Description [问题描述] 从n个数中选若干(至少1)个数求和,求所有方案中第k小的和(和相同但取法不同的视为不同方案).[输入格式]    第一行输入2个正整数n,k.    第二 ...

  6. 【CCF】无线网络 搜索+思维

    #include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...

  7. javaweb之Filter详解

    一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或 ...

  8. C#:使用WebRequest类请求数据

    本文翻译于:https://msdn.microsoft.com/en-us/library/456dfw4f(v=vs.110).aspx 下列程序描述的步骤用于从服务器请求一个资源,例如,一个We ...

  9. css选择器浅谈

    css选择器有很多,种类的话总结起来有5种.即: id选择器,class选择器,elements选择器,级联选择器,相邻选择器. 前三个没什么好说的,分别是id,class和标签的选择,注意选中对象的 ...

  10. Requery,Refresh,Adoquery.Close,Open 区别

    经过测试发现: Requery 相当于 Adq.Close,Open:并且比Close,Open方法有个优点就是不丢失排序,Sort Adq.Close,Open 后,原来的 Adq.Sort 会丢失 ...