日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHPCMS v9 二次开发_验证码结合Session开发

發布時間:2025/4/14 php 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。