PHPCMS v9 二次开发_验证码结合Session开发
本文主要講解了在V9中使用v9自帶驗(yàn)證碼并且需要使用session的情況下,多種問(wèn)題的解決。:)。如有問(wèn)題或者更好的解決辦法,希望不吝賜教。
1、前端調(diào)用驗(yàn)證碼
pc_base::load_sys_class('form', '', 0);{form::checkcode('code_img', '4', '14', 120, 26)} 2、管理端驗(yàn)證碼驗(yàn)證 $code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : exit(format_ajax_out_json('-1', '請(qǐng)輸入驗(yàn)證碼')); if ($_SESSION['code'] != strtolower($code)) { exit(format_ajax_out_json('-1', "驗(yàn)證碼錯(cuò)誤!")); }3、結(jié)合驗(yàn)證碼Session的使用
一)、PHP原生Session
session_start(); //注意$output['data']['area']數(shù)據(jù)為數(shù)組,其他為字符串,原生session能夠存儲(chǔ)數(shù)組 $_SESSION['area'] = $output['data']['area']; $_SESSION['yhid'] = $output['data']['yhid'];在需要使用原生session且驗(yàn)證驗(yàn)證碼時(shí),驗(yàn)證碼從session中是取不出來(lái)的:
if (isset($_GET['dosubmit'])) {session_start();$code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : exit(format_ajax_out_json('-1', '請(qǐng)輸入驗(yàn)證碼'));if ($_SESSION['code'] != strtolower($code)) {exit(format_ajax_out_json('-1', "驗(yàn)證碼錯(cuò)誤!")); }//-------------------------省略中間代碼-------------------------------//添加session//注意$output['data']['area']數(shù)據(jù)為數(shù)組,其他為字符串,原生session能夠存儲(chǔ)數(shù)組 $_SESSION['area'] = $output['data']['area'];$_SESSION['yhid'] = $output['data']['yhid'];exit(format_ajax_out_json($output['statusCode'], $output)); }
經(jīng)過(guò)分析,session取不出來(lái)的原因,是因?yàn)関9代碼中,存儲(chǔ)code的session時(shí),調(diào)用的是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 數(shù)據(jù)庫(kù)存儲(chǔ)類** @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; /*** 構(gòu)造函數(shù)* */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 執(zhí)行結(jié)果*/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));} /*** 刪除過(guò)期的 session* * @param $maxlifetime 存活期時(shí)間* @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', '請(qǐng)輸入驗(yàn)證碼'));if ($_SESSION['code'] != strtolower($code)) {exit(format_ajax_out_json('-1', "驗(yàn)證碼錯(cuò)誤!"));} //-------------------------省略中間代碼-------------------------------
//注意$output['data']['area']數(shù)據(jù)為數(shù)組,其他為字符串,原生session能夠存儲(chǔ)數(shù)組,而session_mysql方法不能存儲(chǔ)數(shù)組。 $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方式能很好的使用驗(yàn)證碼+需要寫入session的數(shù)據(jù),但是該方法有個(gè)弊端。則:無(wú)法在session中存儲(chǔ)數(shù)組。假設(shè),你需要存入session的數(shù)據(jù)時(shí)數(shù)組,且數(shù)組的大小是不定的,而使用v9自帶的session_mysql其實(shí)質(zhì)是將session值存入數(shù)據(jù)庫(kù),在取的時(shí)候讀取數(shù)據(jù)庫(kù),如果存一個(gè)數(shù)組在其中,讀出來(lái)的數(shù)據(jù)則是一個(gè)"Array"字符串。
經(jīng)過(guò)研究,這里有兩種解決方案。
a、將數(shù)據(jù)庫(kù)的字段的類型、大小改變(原本為varchar類型,且只能存儲(chǔ)255個(gè)字符)。并將數(shù)組轉(zhuǎn)換成一個(gè)json字符串,并使用session_mysql的方式存儲(chǔ)。
b、使用session_files方式從存儲(chǔ)。
三)、v9 ?session_files
這里需要注意的是,我們需要實(shí)現(xiàn)的目的是既能使用驗(yàn)證碼又能使用session,且能用session存儲(chǔ)數(shù)組。(不建議重新寫一套驗(yàn)證碼)
v9 ?中,除了用數(shù)據(jù)庫(kù)存儲(chǔ)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();} } ?>由于要使用驗(yàn)證碼,這里需要重新寫一個(gè)api中的checkcode.php并且在form.class.php中添加一個(gè)方法。
新建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添加方法
//驗(yàn)證碼 session_file存儲(chǔ)方式 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)."'>"; }前端調(diào)用:
{form::checkcode_file('code_img', '4', '14', 120, 26)}使用該方式在存儲(chǔ)session讀取session時(shí)與原生PHP中使用一樣,直接使用$_SESSION。使用該方法,既能讀出$_SESSION['code']值也能完美的解決在session中存儲(chǔ)數(shù)組的問(wèn)題。
?
?
?
========================
by llicat
轉(zhuǎn)載需注明出處:http://www.cnblogs.com/llicat/
轉(zhuǎn)載于:https://www.cnblogs.com/llicat/p/4785234.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的PHPCMS v9 二次开发_验证码结合Session开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android 界面滑动实现---Scr
- 下一篇: LeetCode -- 3Sum