表单 对数据库字段自动加密解密表单提交(THINKPHP3.2)

1.config配置变量

‘MODEL_FIELD_FLAG‘ => TRUE,//表单加密开关

‘MODEL_FIELD_NAME_PRE‘ => ‘mlm_‘,//表单加密前缀

‘MODEL_FIELD_EMCODE‘ => ‘md5‘,//加密方式

‘MODEL_FIELD_EMCODE_KEY‘ => ‘[email protected]‘//加密key

2.控制器层

$model  继承基础类 BaseModel BaseRelationModel 任意一个的自定义模型 初始化对象

$data[‘_field‘] = $model->fields_name_encode();//获取数据库加密字段数组

$this->assign(‘data‘, $data);

3.视图表单

<input type="text" name="{$data._field.title}" value="{$data.title}" maxlength="50"/>

4.表单提交控制器

可直接调用$model->create_decode(); 做的工作是解析加密字段至对应数据库字段值 可替代模型create自带方法,

也可手动调用$model->fields_data_decode(I(‘post.‘), true);解密数据字段值

/**

* 解密加密数组

* @param type $data 提交数组

* @param type $flag 过滤数组非数据库字段 开关

* @return type

*/

public function fields_data_decode($data = array(), $flag = false) {

...

}

效果

基础模型类

<?php

namespace Root\Model;

use Think\Model;

/**
 * 模型基础类
 */
class BaseModel extends Model {

    /**
     * 解密加密数组
     * @param type $data 提交数组
     * @param type $flag 过滤数组非数据库字段 开关
     * @return type
     */
    public function fields_data_decode($data = array(), $flag = false) {
        if (!C('MODEL_FIELD_FLAG')) {
            return $data;
        }
        if (empty($data)) {
            $data = I('post.');
        } elseif (is_object($data)) {
            $data = get_object_vars($data);
        }

        $fields = $this->getDbFields();
        $table_name = $this->getTableName();
        // 检查字段映射
        $encode_method = function_exists(C('MODEL_FIELD_EMCODE')) ? C('MODEL_FIELD_EMCODE') : 'md5'; //加密方法
        $encode_method_key = C('MODEL_FIELD_EMCODE_KEY') . $table_name;
        $field_name_pre = C('MODEL_FIELD_NAME_PRE');
        if (!empty($fields)) {
            foreach ($fields as $key => $val) {
                $key_field = $field_name_pre . call_user_func($encode_method, $val . $encode_method_key);
                if (isset($data[$key_field])) {
                    $data[$val] = $data[$key_field];
                    unset($data[$key_field]);
                }
            }
            if ($flag) {
                foreach ($data as $k => $v) {
                    if (!in_array($k, $fields)) {
                        unset($data[$k]);
                    }
                }
            }
        }
        return $data;
    }

    public function fields_name_encode() {
        $fields = $this->getDbFields();
        $table_name = $this->getTableName();
        // 检查字段映射
        $encode_method = function_exists(C('MODEL_FIELD_EMCODE')) ? C('MODEL_FIELD_EMCODE') : 'md5'; //加密方法
        $encode_method_key = C('MODEL_FIELD_EMCODE_KEY') . $table_name;
        $field_name_pre = C('MODEL_FIELD_NAME_PRE');
        if (!empty($fields)) {
            foreach ($fields as $key => $val) {
                if (C('MODEL_FIELD_FLAG')) {
                    $fields[$val] = $field_name_pre . call_user_func($encode_method, $val . $encode_method_key);
                } else {
                    $fields[$val] = $val;
                }
                unset($fields[$key]);
            }
        }
        return $fields;
    }

    public function create_decode($data = '', $type = '') {
        // 如果没有传值默认取POST数据
        if (empty($data)) {
            $data = I('post.');
        } elseif (is_object($data)) {
            $data = get_object_vars($data);
        }
        $data = $this->fields_data_decode($data);
        return $this->create($data, $type);
    }

}

表单 对数据库字段自动加密解密表单提交(THINKPHP3.2)

时间: 2024-07-30 05:59:18

表单 对数据库字段自动加密解密表单提交(THINKPHP3.2)的相关文章

数据库mysql 自动分库分表备份脚本

数据库mysql 自动分库分表备份脚本 当我们在公司中遇到数据库的备份,项目比较多,经常进行数据库和表的添加工作,那么我们 想要让系统脚本自动进行查询数据库里的库和表结构,然后进行自动的定期进行数据库和表的定期份, 那么我们该如何实现呢,大家看看以下的脚本: vi mysql_backup.sh #!/bin/sh #backup tiandao bbs edoing #coding tonye.li MYUSER=root MYPASS=meidi SOCKET=/data/3306/mysq

数据库表中非主键字段自动加1功能

数据库版本表t_version包含的字段: 用户创建config,在一个config下创建多个版本. 在创建版本时,versionId字段要在该config下上一个版本ID的基础上自动加1. 在创建版本时,使用@Transaction注解设置数据库事务. 获取当前config的最大版本号 此时存在的问题:用户A在获取到当前最大版本后,用户B同时也获取了当前最大版本 值与A相同,A创建版本,B再创建版本.就会存在两个相同的versionId. 思路1: 了解了数据库的隔离级别: 1.Read Un

MySQL触发器初试:当A表插入新记录,自动在B表中插入相同ID的记录

今天第一次用MySQL的触发器,怕忘了,赶紧写篇博客记录一下. 废话不说,先上语法: 1 CREATE TRIGGER trigger_name 2 { BEFORE | AFTER } { INSERT | UPDATE | DELETE } 3 ON tbl_name 4 FOR EACH ROW 5 trigger_body 事情的起因是这样的:我有一个人员信息表 pers.因为字段很多,就把中文字段单出来,另建了一个表 perscn.我希望当 pers 插入一条记录,perscn 也能自

Thinkphp3.2数据库字段自动转小写,字段大小写自动转换

最简单的办法就是在配置文件加上 'DB_PARAMS' => [\PDO::ATTR_CASE => \PDO::CASE_NATURAL], 但是如果项目已经上线了一段直接, 这样可能会影响其他人写的 然后我想在控制器里面动态改变DB_PARAMS这个配置,后来发现不行. 因为基类里面有数据库操作,model是单例的.不会重新new对象. 最后我想到了一个办法,重新声明一个函数,就是为了让他重新new一个model function db($table=''){ $config = [ 'd

【原创】文本工具的使用--根据数据库字段快速生成该表对应的Model类属性

在实际项目开发过程中,我们会经常碰到这样的问题:数据库表的字段按下划线命名方式都设计好了,接下来是要创建该表对应的Model类.如果我们按照数据库表中的字段,再手动敲一遍,生成对应Model类的属性.在字段少的情况下,手动创建Model类似乎没啥的.要是字段比较多,那就有点费时了.那如何快速生成数据库表字段对应的Model类呢?以下是本人的解决方案: 1.将建表语句复制到文本编辑器,如notepad++,editplus,vim等. 2.剔除其他字符串,提取字段 点击全部替换 3.下划线法转驼峰

PHP加密解密数字

1 <?php 2 /** 3 * 加密解密类,PHP加密解密数字,适用于URL加密 4 * 该算法仅支持加密数字.比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密. 5 * @version alpha 6 * @加密原则 标记长度 + 补位 + 数字替换 7 * @加密步骤: 8 * 将a-z,A-Z,0-9 62个字符打乱,取前M(数字最大的位数)位作为 标记长度字符串,取第M+1 到第M+10位为数字替换字符串,剩余的为补位字符串 9 * 1.计算数字长度n,取乱码的第

Phpcms V9单页添加自定义字段

说起文章自定义自段,大家都会想到 wordpress 的自定义字段,确实 wordpress 系统很强大,字段可以很灵活的在后台进行添加与更新,并能够很好的在前台进行调用,对于这点 phpcms v9 就有点弱爆了,phpcms v9 是没有自定义字段这个功能的,只能要我们来进行二次开发. phpcms v9 文章内容的添加与更新选项已经很多了,基本上趋于完善,而关于 phpcms v9 单页 page就显得很简单,使用的字段只有三个:标题.关键词.内容,这往往不够使用,有时候需要添加更多的选项

Oracle两表关联(join)更新字段值一张表到另一张表

[采用视图更新的方式] 有需求A表,B表,需要将B表中的name字段更新到A表中的name,两表有id关联,代码如下: update  (select a.name aname, b.name bname from A a, B b where a.id = b.id) set aname = bname; --注:两表关联属性id必须为unique index或primary key

SQL语句 在一个表中插入新字段

SQL语句 在一个表中插入新字段: alter table 表名 add 字段名 字段类型 例: alter table OpenCourses add Audio varchar(50)alter table ListenCourses add Audio varchar(50)