PHPCMS v9 二次开发_验证码结合Session开发
本文主要講解了在V9中使用v9自帶驗證碼并且需要使用session的情況下,多種問題的解決。:)。如有問題或者更好的解決辦法,希望不吝賜教。
1、前端調用驗證碼
pc_base::load_sys_class('form', '', 0);{form::checkcode('code_img', '4', '14', 120, 26)} 2、管理端驗證碼驗證 $code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : exit(format_ajax_out_json('-1', '請輸入驗證碼')); if ($_SESSION['code'] != strtolower($code)) { exit(format_ajax_out_json('-1', "驗證碼錯誤!")); }3、結合驗證碼Session的使用
一)、PHP原生Session
session_start(); //注意$output['data']['area']數據為數組,其他為字符串,原生session能夠存儲數組 $_SESSION['area'] = $output['data']['area']; $_SESSION['yhid'] = $output['data']['yhid'];在需要使用原生session且驗證驗證碼時,驗證碼從session中是取不出來的:
if (isset($_GET['dosubmit'])) {session_start();$code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : exit(format_ajax_out_json('-1', '請輸入驗證碼'));if ($_SESSION['code'] != strtolower($code)) {exit(format_ajax_out_json('-1', "驗證碼錯誤!")); }//-------------------------省略中間代碼-------------------------------//添加session//注意$output['data']['area']數據為數組,其他為字符串,原生session能夠存儲數組 $_SESSION['area'] = $output['data']['area'];$_SESSION['yhid'] = $output['data']['yhid'];exit(format_ajax_out_json($output['statusCode'], $output)); }
經過分析,session取不出來的原因,是因為v9代碼中,存儲code的session時,調用的是session_mysql類。
api/checkcode.php:
$session_storage = 'session_'.pc_base::load_config('system','session_storage'); pc_base::load_sys_class($session_storage);二)、v9 ?session_mysql
session_mysql.class.php:(v9)
<?php /*** session mysql 數據庫存儲類** @copyright (C) 2005-2010 PHPCMS* @license http://www.phpcms.cn/license/* @lastmodify 2010-6-8*/ class session_mysql {var $lifetime = 1800;var $db;var $table; /*** 構造函數* */public function __construct() {$this->db = pc_base::load_model('session_model');$this->lifetime = pc_base::load_config('system','session_ttl');session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc'));session_start();} /*** session_set_save_handler open方法* @param $save_path* @param $session_name* @return true*/public function open($save_path, $session_name) {return true;} /*** session_set_save_handler close方法* @return bool*/public function close() {return $this->gc($this->lifetime);} /*** 讀取session_id* session_set_save_handler read方法* @return string 讀取session_id*/public function read($id) {$r = $this->db->get_one(array('sessionid'=>$id), 'data');return $r ? $r['data'] : '';} /*** 寫入session_id 的值* * @param $id session* @param $data 值* @return mixed query 執行結果*/public function write($id, $data) {$uid = isset($_SESSION['userid']) ? $_SESSION['userid'] : 0;$roleid = isset($_SESSION['roleid']) ? $_SESSION['roleid'] : 0;$groupid = isset($_SESSION['groupid']) ? $_SESSION['groupid'] : 0;$m = defined('ROUTE_M') ? ROUTE_M : '';$c = defined('ROUTE_C') ? ROUTE_C : '';$a = defined('ROUTE_A') ? ROUTE_A : '';if(strlen($data) > 255) $data = '';$ip = ip();$sessiondata = array('sessionid'=>$id,'userid'=>$uid,'ip'=>$ip,'lastvisit'=>SYS_TIME,'roleid'=>$roleid,'groupid'=>$groupid,'m'=>$m,'c'=>$c,'a'=>$a,'data'=>$data,);return $this->db->insert($sessiondata, 1, 1);} /** * 刪除指定的session_id* * @param $id session* @return bool*/public function destroy($id) {return $this->db->delete(array('sessionid'=>$id));} /*** 刪除過期的 session* * @param $maxlifetime 存活期時間* @return bool*/public function gc($maxlifetime) {$expiretime = SYS_TIME - $maxlifetime;return $this->db->delete("`lastvisit`<$expiretime");} } ?>該session的使用方式:
private function _session_start() {$session_storage = 'session_'.pc_base::load_config('system','session_storage');$this->todo_session = pc_base::load_sys_class($session_storage); }public function dlsLogin() {$this->_session_start();if (isset($_GET['dosubmit'])) {$code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : exit(format_ajax_out_json('-1', '請輸入驗證碼'));if ($_SESSION['code'] != strtolower($code)) {exit(format_ajax_out_json('-1', "驗證碼錯誤!"));} //-------------------------省略中間代碼-------------------------------
//注意$output['data']['area']數據為數組,其他為字符串,原生session能夠存儲數組,而session_mysql方法不能存儲數組。 $this->todo_session->write('area',$output['data']['area']);$this->todo_session->write('yhid',$output['data']['yhid']);exit(format_ajax_out_json($output['statusCode'], $output));} }
使用該session方式能很好的使用驗證碼+需要寫入session的數據,但是該方法有個弊端。則:無法在session中存儲數組。假設,你需要存入session的數據時數組,且數組的大小是不定的,而使用v9自帶的session_mysql其實質是將session值存入數據庫,在取的時候讀取數據庫,如果存一個數組在其中,讀出來的數據則是一個"Array"字符串。
經過研究,這里有兩種解決方案。
a、將數據庫的字段的類型、大小改變(原本為varchar類型,且只能存儲255個字符)。并將數組轉換成一個json字符串,并使用session_mysql的方式存儲。
b、使用session_files方式從存儲。
三)、v9 ?session_files
這里需要注意的是,我們需要實現的目的是既能使用驗證碼又能使用session,且能用session存儲數組。(不建議重新寫一套驗證碼)
v9 ?中,除了用數據庫存儲session還能用文件的方式。
session_files.class.php:
<?php class session_files {function __construct() {$path = pc_base::load_config('system', 'session_n') > 0 ? pc_base::load_config('system', 'session_n').';'.pc_base::load_config('system', 'session_savepath') : pc_base::load_config('system', 'session_savepath');ini_set('session.save_handler', 'files');session_save_path($path);session_start();} } ?>由于要使用驗證碼,這里需要重新寫一個api中的checkcode.php并且在form.class.php中添加一個方法。
新建api/checkcode_files.php
<?php defined('IN_PHPCMS') or exit('No permission resources.'); pc_base::load_sys_class('session_files'); $checkcode = pc_base::load_sys_class('checkcode'); //之后代碼省略------------------form.class.php添加方法
//驗證碼 session_file存儲方式 public static function checkcode_file($id = 'checkcode',$code_len = 4, $font_size = 20, $width = 130, $height = 50, $font = '', $font_color = '', $background = '') {return "<img id='$id' οnclick='this.src=this.src+\"&\"+Math.random()' src='".SITE_PROTOCOL.SITE_URL.WEB_PATH."api.php?op=checkcode_file&code_len=$code_len&font_size=$font_size&width=$width&height=$height&font_color=".urlencode($font_color)."&background=".urlencode($background)."'>"; }前端調用:
{form::checkcode_file('code_img', '4', '14', 120, 26)}使用該方式在存儲session讀取session時與原生PHP中使用一樣,直接使用$_SESSION。使用該方法,既能讀出$_SESSION['code']值也能完美的解決在session中存儲數組的問題。
?
?
?
========================
by llicat
轉載需注明出處:http://www.cnblogs.com/llicat/
轉載于:https://www.cnblogs.com/llicat/p/4785234.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的PHPCMS v9 二次开发_验证码结合Session开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 界面滑动实现---Scr
- 下一篇: LeetCode -- 3Sum