介绍
怎么在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对会话进行保存