PHPとセッションを組み合わせてデータベースを操作する方法

墨辰丷
リリース: 2023-03-30 15:34:01
オリジナル
1990 人が閲覧しました

この記事ではセッションと組み合わせてPHPでデータベースを操作する方法を中心に紹介しますので、興味のある方は参考にしていただければ幸いです。

詳細は次のとおりです:

<?php
/**
 * session 数据库存储类
 */
class Session {
 private static $session_id   = 0;
 private static $session_data  = array();
 private static $is_update   = FALSE;
 private static $is_del    = FALSE;
 private static $is_gc    = FALSE;
 private static $dbo    = NULL;  //数据库连接句柄
 private static $gc_max_time  = 1440;
 private static $table   = &#39;sessions&#39;;
 private static $pre_key   = &#39;weige&#39;;//session 密钥
 //捆绑使用哈
 private static $gc_rate_de  = 100;//代表分母
 private static $gc_rate_co  = 20;//代表分子
 private static $path   = &#39;/&#39;;//保存路径
 private static $domain   = null; //域
 private static $secure   = false;//默认
 private static $httponly  = false;//默认
 /**
  * 获取数据库句柄 私有
  */
 private static function open() 
 {
  if (!self::$dbo) 
  {
   self::$dbo = Db::factory();
  }
  return TRUE;
 }
 /**
  * 设置
  * */
 public static function set($key, $val=NULL) 
 {
  self::open();
  $data = self::read();
  if ($data === FALSE)
  {
   $data = array();
  }
  if (!$val && is_array($key))
  {
   $data = $key;
  } 
  else if ($val && is_string($key))
  {
   $data[$key] = $val;
  }
  self::write($data);
  self::close();
 }
 /**
  *获取值 
  * 
  */
 public static function get($key=NULL) {
  self::open();
  self::$session_data = self::read();
  $ret = &#39;&#39;;
  if (!$key) {
   $ret = self::$session_data;
  } else if(is_array(self::$session_data) && isset(self::$session_data[$key])) {
   $ret = self::$session_data[$key];
  }
  self::update(); 
  self::close();
  return $ret;
 }
 /**
  * 删除或者重置
  * */
 public static function del($key)
 {
  if (!self::$is_del) 
  {
   self::open();
   $val = self::read();
   if (isset($val[$key])) 
   {
    unset($val[$key]);
   }
   $session_id  = self::$session_id;
   $session_data  = serialize($val);
   $session_expire = TIME + self::get_gc_maxtime();
   self::$dbo->query("update ".self::$table." set value=&#39;$session_data&#39;, expiry=&#39;$session_expire&#39; where session_id=&#39;$session_id&#39;");
   self::close();
  }
  self::$is_del = TRUE;
 }
 /**
  * 销毁
  * 
  * */
 public static function destroy() 
 {
  $session_id   = self::get_session_id();
  $_COOKIE[&#39;WBSID&#39;] = &#39;&#39;;
  self::open();
  self::$dbo->query("delete from ".self::$table." where session_id=&#39;$session_id&#39;");
  self::close();
 }
 /**
  * 读取 私有
  * */
 private static function read()
 {
  $session_id = self::$session_id;
  if (!$session_id) {
   $session_id = self::get_session_id();
  }
  if (!$session_id) return array();
  $user_agent = isset($_SERVER[&#39;HTTP_USER_AGENT&#39;]) ? md5($_SERVER[&#39;HTTP_USER_AGENT&#39;]) : &#39;&#39;;
  $client_ip = Fun::getIp();
  $session_expire = TIME - self::get_gc_maxtime();
  $rs = self::$dbo->fetchRow("select session_id, value, agent, ip from ".self::$table."
   where session_id=&#39;$session_id&#39; and expiry>&#39;$session_expire&#39;");
  if (!$rs || $rs[&#39;agent&#39;] != $user_agent || $rs[&#39;ip&#39;] != $client_ip) 
  {
   return FALSE;
  }
  self::$session_id = $rs[&#39;session_id&#39;];
  return unserialize($rs[&#39;value&#39;]);
 }
 /**
  * session 写入 私有
  * */
 private static function write(array $session_data) 
 {
  $session_id = self::$session_id;
  if (!$session_id)
  {
   $session_id = self::get_session_id();
  }
  $session_expire = TIME + self::get_gc_maxtime();
  $user_agent = isset($_SERVER[&#39;HTTP_USER_AGENT&#39;]) ? md5($_SERVER[&#39;HTTP_USER_AGENT&#39;]) : &#39;&#39;;
  $client_ip  = Fun::getIp();
  $session_data = serialize($session_data);
  if (self::$session_id && self::$session_id === $session_id) 
  {
   self::$dbo->query("update ".self::$table." set value=&#39;$session_data&#39;, expiry=&#39;$session_expire&#39;, agent=&#39;$user_agent&#39;, ip=&#39;$client_ip&#39; where session_id=&#39;$session_id&#39;");
  } 
  else 
  {
   self::$session_id = $session_id = self::create_session_id();
   self::$dbo->query("insert into ".self::$table."(session_id, value, expiry, agent, ip) 
    values(&#39;$session_id&#39;, &#39;$session_data&#39;, &#39;$session_expire&#39;, &#39;$user_agent&#39;, &#39;$client_ip&#39;)");
  }
  return true;
 }
 /**
  * session 更新 私有
  * */
 private static function update() 
 {
  if (!self::$is_update) 
  {
   $session_id = self::$session_id;
   $session_expire = TIME + self::get_gc_maxtime();
   self::$dbo->query("update ".self::$table." set expiry=&#39;$session_expire&#39; where session_id=&#39;$session_id&#39;");
  }
  self::$is_update = TRUE;
 }
 private static function close() 
 {
  if (!self::$is_gc && mt_rand(1, self::$gc_rate_de)%self::$gc_rate_co == 0) 
  {
   self::gc();
  }
  self::$is_gc = TRUE;
 }
 /**
  * 过期session 清除 随机触发
  * */
 private static function gc() 
 {
  $session_expire = TIME - self::get_gc_maxtime();
   self::$dbo->query("delete from ".self::$table." where expiry<&#39;$session_expire&#39;");
 }
 private static function get_session_id() 
 {
  if (isset($_COOKIE[&#39;WBSID&#39;]) && strlen($_COOKIE[&#39;WBSID&#39;])==32) 
  {
   $sid = $_COOKIE[&#39;WBSID&#39;];
   setcookie(&#39;WBSID&#39;, $sid, TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
   return $sid;
  }
  return null;
 }
 private static function create_session_id() 
 {
  $sid = self::get_session_id();
  if (!$sid) 
  {
   $sid = Fun::getIp() . TIME . microtime(TRUE) . mt_rand(mt_rand(0, 100), mt_rand(100000, 90000000));
   $sid = md5(self::$pre_key . $sid);
   setcookie(&#39;WBSID&#39;, substr($sid, 0, 32), TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
  }
  return $sid;
 }
 public static function get_gc_maxtime()
 {
  return self::$gc_max_time;
 }
}
ログイン後にコピー

概要: 上記がこの記事の全内容です。お役に立てば幸いです。みんなの勉強。

関連する推奨事項:

PHP でアダプター パターンを実装する方法の詳細な説明

方法PHP で純粋な静的ページを実装する

列の一括削除を実装するための ThinkPHP メソッド

以上がPHPとセッションを組み合わせてデータベースを操作する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート