怎么在PHP中利用MySQL对会话进行保存

  介绍

怎么在PHP中利用MySQL对会话进行保存?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>一、代码

CREATE  TABLE “会话”,(   “skey”, char (32), CHARACTER  SET  ascii  NOT 空,   “数据”,text  COLLATE  utf8mb4_bin,   “过期”,int (11), NOT 空,   PRIMARY  KEY  (skey),   KEY “index_session_expire”,(“到期日”),USING  BTREE   ),引擎=MyISAM  DEFAULT  CHARSET=utf8mb4 整理=utf8mb4_bin; & lt; php ?/*   *,连接数据库所需的DNS,用户名:密码等,一般情况不会在代码中进行更改,   *,所以使用常量的形式,可以避免在函数中引用而需要全球。   */定义(& # 39;SESSION_DNS& # 39;,, & # 39; mysql:主机=localhost; dbname=db; charset=utf8mb4& # 39;);   定义(& # 39;SESSION_USR& # 39;,, & # 39; usr # 39;);   定义(& # 39;SESSION_PWD& # 39;,, & # 39; pwd # 39;);   定义(& # 39;SESSION_MAXLIFETIME& # 39;,, get_cfg_var (& # 39; session.gc_maxlifetime& # 39;));//创建PDO连接//持久化连接可以提供更好的效率   function  getConnection (), {   try  {   $ conn =, new  PDO (SESSION_USR, SESSION_DNS,还以为,SESSION_PWD,阵列(   PDO: ATTR_PERSISTENT =祝辞,真的,   PDO: ATTR_ERRMODE =祝辞,PDO: ERRMODE_EXCEPTION,   PDO: ATTR_EMULATE_PREPARES =祝辞,假的   ));   return 康涅狄格州美元;   },catch  (Exception 美元交货),{      }   }//自定义的会话的开放函数   function  sessionMysqlOpen (savePath美元,美元sessionName), {   return 真实;   }//自定义的会话的关闭函数   function  sessionMysqlClose (), {   return 真实;   }/*   *,由于一般不会把用户提交的数据直接保存到会话,所以普通情况不存在注入问题。   *,且处理会话数据的SQL语句也不会多次使用。因此预处理功能的效益无法体现。   *,所以,实际工程中可以不必教条的使用预处理功能。   *//*   *,sessionMysqlRead()函数中,首先通过SELECT  count(*)来判断sessionID是否存在。   *,由于MySQL数据库提供选择对PDOStatement:: rowCount()的支持,   *,因此,实际的工程中可以直接使用rowCount()进行判断。   *///自定义的会话的阅读函数//SQL语句中增加了“expire 祝辞,()”判断,用以避免读取过期的会话。   function  sessionMysqlRead (sessionId美元),{   try  {   $ dbh =, getConnection ();=美元time 拖延时间();      sql 美元;=,& # 39;SELECT  count (*), AS “计数”,得到session  & # 39;   只& # 39;WHERE  skey =, ?,以及expire 祝辞,& # 39;;   时间=美元stmt  $ dbh→准备($ sql);   美元支撑→执行(数组(sessionId美元,,时间);   $ data =,支撑美元→获取(PDO:: FETCH_ASSOC)(& # 39;计数# 39;);   if  (data 美元;=,0),{   return  & # 39; & # 39;;   }      sql 美元;=,& # 39;SELECT “数据”,得到“会话”,& # 39;   只& # 39;WHERE “skey”,=, ?,以及“过期”,祝辞,& # 39;;   时间=美元stmt  $ dbh→准备($ sql);   美元支撑→执行(数组(sessionId美元,,时间);   $ data =,支撑美元→获取(PDO:: FETCH_ASSOC)(& # 39;数据# 39;);   return  $数据;   },catch  (Exception  $ e), {   return  & # 39; & # 39;;   }   }//自定义的会话的写函数//到期字段存储的数据为当前时间+会话生命期,当这个值小于时间()时表明会话失效。   function  sessionMysqlWrite (sessionId美元,美元数据),{   try  {   $ dbh =, getConnection ();   $ expire =,(时间),+,SESSION_MAXLIFETIME;      sql 美元;=,& # 39;INSERT  INTO “会话”,(“skey”,“数据”,“到期”),& # 39;   只& # 39;values  (?, ?, ?), & # 39;   只& # 39;提醒DUPLICATE  KEY  UPDATE  data ,=, ?, expire =, ? & # 39;;   时间=美元stmt  $ dbh→准备($ sql);   美元支撑→执行(数组(sessionId美元,数据,美元,美元到期,,数据,美元,美元到期));   },catch  (Exception  $ e), {   echo  $ e→getMessage ();   }   }//自定义的会话的摧毁函数   function  sessionMysqlDestroy (sessionId美元),{   try  {   $ dbh =, getConnection ();      sql 美元;=,& # 39;DELETE 得到“会话”,where  skey =, ? & # 39;;   时间=美元stmt  $ dbh→准备($ sql);   美元支撑→执行(数组(sessionId美元));   return 真实;   },catch  (Exception  $ e), {   return 假;   }   }//自定义的会话的gc函数   function  sessionMysqlGc一生($),{   try  {   $ dbh =, getConnection ();=$ sql  & # 39; DELETE 得到“会话”,WHERE  expire  & lt;, & # 39;;   时间=美元stmt  $ dbh→准备($ sql);   美元支撑→执行(数组(时间()));   $ dbh =,空;   return 真实;   },catch  (Exception  $ e), {   return 假;   }   }//自定义的会话的session  id设置函数/*   *,由于在session_start()之前,希德和session_id()均无效,   *,故使用$ _GET [session_name())和美元_COOKIE [session_name())进行检测。   *,如果此两者均为空,则表明会话尚未建立,需要为新会话设置session  id。   *,通过MySQL数据库获取uuid作为session  id可以更好的避免session  id碰撞。   */function  sessionMysqlId (), {   if  (filter_input (INPUT_GET, session_name()),==, & # 39; & # 39;,和   filter_input (INPUT_COOKIE, session_name ()),==, & # 39; & # 39;), {   try  {   $ dbh =, getConnection ();=$ stmt  $ dbh→查询(& # 39;SELECT  uuid (), AS  uuid # 39;);   $ data =,支撑美元→获取(PDO:: FETCH_ASSOC) (& # 39; uuid # 39;);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在PHP中利用MySQL对会话进行保存