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‘ onclick=‘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/

时间: 2024-11-09 13:31:05

PHPCMS v9 二次开发_验证码结合Session开发的相关文章

PHPCMS V9二次开发自定义分页函数的解决方案

下面为大家分享一个PHPCMS V9二次开发自定义分页函数的方法. 方法如下: 首先打开 phpcms\libs\functions\global.func.php这个文件,找到分页函数,复制一下,粘贴到默认分页函数的下面,重新命名,比如我的就命名为wz_pages,保存. 打开 phpcms/libs/classes/template_cache.class.php,找到207行的: $str .= '$pages = pages($'.$op.'_total, $page, $pagesiz

[PHPCMS V9二次开发]自定义字段模型-添加字段类型

步骤/方法 打开phpcms\modules\content\fields目录,复制文件夹downfiles,并改名为textgroups. 打开phpcms\modules\content\fields\fields.inc.PHP文件,增加字段类型: 'textgroups'=>'多文件上传', 打开phpcms\modules\content\fields\textgroups目录(第一步复制的文件夹),修改以下文件: form.inc.php function textgroups($f

PHPCMS v9 自定义表单添加验证码验证

1. 在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id="code" name="code" size="8" class="input-text">{form::checkcode('code_img', '4', '14', 84, 24)} 2. 在 \phpcms\modules\

PHPCMS v9 自定义表单添加验证码

1.  在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id="code" name="code" size="8" class="input-text">{form::checkcode('code_img', '4', '14', 84, 24)} 2. 在 \phpcms\modules

虚拟币期货交易系统开发_数字货币交易网站开发

虚拟币市场如火如荼,越来越多传统金融加入其中,这也就会产生把传统金融模式套到虚拟币的市场上来.虚拟币期货交易就是很明显的传统金融转变过来的. 虚拟币期货交易系统的核心功能有:订单处理,交易管理.行情展示.风险管理.基础数据服务.结算.数据中心(资金结算等)服务等.基于这些功能,系统要具备以下特点: 1.高性能:相比于其他管理系统,虚拟币期货交易系统要求更高的性能,包括行情数据的实时刷新,交易订单处理等.? 2.可扩充:数字货币期货交易系统通常要支持大量的并发用户,且随着业务不断的发展,交易所的用

phpcms V9的各种功能总结

[1]PHPCMS V9系统目录简析 在研究所有问题之前,请先了解一下系统的文件目录结构,具体如下图所示: [2]想修改默认的模板风格怎么办? PHPCMS V9默认的网页模板在phpcms目录下的templates文件夹.如果想更换模板,可以根据新模板的文件组织结构,分别覆盖default文件夹和static文件夹.然后到网页后台管理平台,切换网页风格,就可以看到新换的网页模板首页样式. 后台管理操作步骤如下:设置-->站点管理-->修改-->模板风格配置(切换风格,当然风格由自己提前

PHPCMS V9 学习总结(转)

转自:http://www.cnblogs.com/Braveliu/p/5074930.html 在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1]PHPCMS V9系统目录简析 在研究所有问题之前,请先了解一下系统的文件目录结构,具体如下图所示: [2]想修改默认的模板风格怎么办? PHPCMS V9默认的网页模板在phpcms目录下的templates文件夹.如果想更换模板,可以根据新模板的文件组织结构,分别覆盖default文件夹和st

PHPCMS V9 模块开发 二次开发实例 留言本

鄙人实现了PHPCMS V9 产品开发权威指南(2011官方最新版).doc中的留言板实例,并加上模块安装和卸载功能, 程序可以运行,但只实现基本功能,目的是想让和我一样徘徊在PHPCMS门口不知道从哪儿进门的初学者走一下流程,欢迎指正! 对于像我这样的入门者希望先把上面这个文档仔细读一遍再往下看! 声明:我用的是GBK版本. 二次开发流程 创建数据库和数据库表(无数据库操作可略过) 创建数据模型文件 创建模块目录 开发控制器和模板 install和uninstall模块 一.创建数据库表 具体

PHPCMS V9完全开发介绍

PHPCMS V9 文件目录结构: 根目录 | – api 接口文件目录 | – caches 缓存文件目录 | – configs 系统配置文件目录 | – caches_* 系统缓存目录 | – phpcms phpcms框架主目录 | – languages 框架语言包目录 | – libs 框架主类库.主函数库目录 | – model 框架数据库模型目录 | – modules 框架模块目录 | – templates 框架系统模板目录 | – phpsso_server phpsso主