ThinikPhp 将数据库模型的增、删、改操作写入日志
- 记录增、删、改等操作到日志系统
- 定义一些大部分数据库都需要验证的规则(子类可覆盖或自定义)或者需要自动生成的字段(如每个数据库都有一个记录当前时间的字段create_time)
<?php
/* * * 公共模型*/
namespace Common\Model;
use Think\Model;
class CommonModel extends Model {/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:22:19* @Description: 验证字段,子类可以覆盖或移出*/protected $_validate = array(array('code','require','{%ERROR_NOT_PAST}'),//必须array('name','require','{%ERROR_NOT_PAST}'),//必须);/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:08:38* @Description: 所有继承的子类字段create_time自动生成当前时间*/protected $_auto = array (array ('create_time', 'mGetDate', 1, 'callback' ), // 增加的时候调用回调函数);/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 15:52:40* @Description: 返回该类的自动验证信息,用于在子类中合并该验证信息(不能在子类中定义此$_validate属性否则会被覆盖,如果不需要在子类中合并则可以可忽略此方法)*/protected function get_validate(){return $this->_validate;}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:06:03* @Description: 获取当前时间*/protected function mGetDate() {return date ( 'Y-m-d H:i:s' );}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 10:50:20* @Description: 更新成功后的回调方法*/protected function _after_update($data,$options) {//区分会员登录和更改操作if( $options['model']=="Users"&& $data['last_login_ip']&& $data['last_login_time']&& count($data)==3){$this->after_write("login",$data,$options);}else{$this->after_write("update",$data,$options);}}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 10:50:27* @Description: 插入成功后的回调方法*/protected function _after_insert($data,$options) {$this->after_write("insert",$data,$options);}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 11:56:12* @Description: 删除成功后的回调方法*/protected function _after_delete($data,$options) {$this->after_write("delete",$data,$options);}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 11:03:18* @Description: 更新或插入成功后和删除前写入系统日志*/function after_write($type,$data,$options){$db_name = C('DB_PREFIX')."system_log"; //日志表//如果是系统日志表则不处理,防止循环调用此方法if(!$this->_is_array($data) || !$this->_is_array($options) || strcasecmp($options['table'],$db_name)==0) return ;$model = M("SystemLog"); //日志表$new_value = json_encode($data);// 去除前缀的表名$_data['log_table'] = str_replace(C('DB_PREFIX'), "",$options['table']);//更改时如果原数据未更改则不进行记录,防止重复记录if("update" === $type){//表主健$_data['t_id'] = $data['id'];// 主健名称不是id// 获取主健对应的数据if($_data['id']){$tablename = $options['table'];$_data['t_id'] = $data[M($tablename)->getPk()];}// 如果最后一条的值没有更改则不记录if($model->where($_data)->order("id desc")->getField("new_value")===$new_value) return;}$_data['log_type'] = $type;$_data['new_value'] = $new_value;$_data['log_user'] = $_SESSION['ADMIN_ID'];$_data['create_time'] = date('Y-m-d H:i:s');$_data['ip_address'] = get_client_ip(0,true);$_data['user_agent'] = $_SERVER['HTTP_USER_AGENT'];try {$model->add($_data);} catch (Exception $e) {\Think\Log::write('写入系统日志时发生错误,错误信息:'.$e->getMessage(),'WARN');}}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 11:04:40* @Description: 是否是数组*/function _is_array($array){return ($array && is_array($array) && count($array)>0);}
}
<?php/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:03:57* @Description: 基础价格Model*/
namespace Common\Model;
use Common\Model\CommonModel;
class PriceModel extends CommonModel
{ /*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 15:01:46* @Description: 自动验证,合并父类验证规则*/function _initialize() {//自定义验证规则$_val = array(array('cost','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),array('price','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),);//合并父类的规则//验证父类code、name字段//当前模型的create_time字段自动填充$this->_validate = array_merge (parent::get_validate(),$_val);// 移出父类的Code唯一性验证//foreach ($this->_validate as $key => $value) {// if($value[0]=='code' && $value[4]=='unique'){// unset($this->_validate[$key]);// }//}//覆盖父类验证规则$this->_validate = $_val;}
}
CREATE TABLE `tp_system_log` (`id` INT(11) NOT NULL AUTO_INCREMENT,`log_type` VARCHAR(50) NOT NULL COMMENT '操作类别',`log_table` VARCHAR(100) NOT NULL COMMENT '操作的表',`log_user` VARCHAR(100) NOT NULL COMMENT '操作的用户',`t_id` VARCHAR(50) NOT NULL COMMENT '操作的表的主健ID',`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作的时间',`new_value` TEXT NOT NULL COMMENT '操作后的新值',`ip_address` VARCHAR(20) NOT NULL COMMENT 'Ip地址',`user_agent` VARCHAR(500) NULL DEFAULT NULL COMMENT 'User-Agent:',PRIMARY KEY (`id`),INDEX `id` (`id`)
)
TP3.1开发手册 模型扩展
ThinikPhp 将数据库模型的增、删、改操作写入日志相关推荐
- 表单的增 删 改 查
django单表操作 增 删 改 查 一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取 ...
- datatable更新到mysql_.NET_使用DataTable更新数据库(增,删,改),1、修改数据复制代码 代码如 - phpStudy...
使用DataTable更新数据库(增,删,改) 1.修改数据 DataRow dr = hRDataSet.Tables["emp"].Rows.Find(textBox3.Tex ...
- java stringbuilder 替换字符串_StringBuilder修改字符串内容,增,删,改,插
package seday01; /** * 字符串不变对象特性只针对字符串重用,并没有考虑修改操作的性能.因此String不适合频繁修改内容. * 若有频繁修改操作,使用StringBuilder来 ...
- properties(map)增.删.改.查.遍历
import java.util.Map; import java.util.Properties; import java.util.Set;/*** properties(map)增.删.改.查. ...
- python学生姓名添加删除_python-函数-实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统。...
实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统. 要求1:使用一个list用于保存学生的姓名. 要求2:输入0显示所有学员信息,1代表增加,2代表删除,3代表修改,4代表查询,exit ...
- PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理
笔者最近需要使用pyspark进行数据整理,于是乎给自己整理一份使用指南.pyspark.dataframe跟pandas的差别还是挺大的. 文章目录 1.-------- 查 -------- -- ...
- 简单的php数据库操作类代码(增,删,改,查)
数据库操纵基本流程为: 1.连接数据库服务器 2.选择数据库 3.执行SQL语句 4.处理结果集 5.打印操作信息 其中用到的相关函数有 •resource mysql_connect ( [stri ...
- Python 操作 Elasticsearch 实现 增 删 改 查
Github 地址:https://github.com/elastic/elasticsearch-py/blob/master/docs/index.rst 官网地址:https://elasti ...
- 【django】数据库操作-增 删 改
一.增加数据 增加数据有两种⽅法. 1)save 通过创建模型类对象,执⾏对象的save()⽅法保存到数据库中. f1=FilmInfo(fname='我爱你中国',pub_data='2021-10 ...
最新文章
- 带你看看获得鲁班奖的数据中心工程建设的有多完美!!
- createTemporaryView is deprecated
- 通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design
- 根据children动态复杂表头excel导出_Java高级特性-注解:注解实现Excel导出功能
- lvgl的区别 qt_LVGL分析-画面刷新
- 【吴恩达课后编程作业pytorch实现】Keras入门与残差网络的搭建【1】
- 冰城环保进入智慧时代
- springboot整合quartz定时任务
- DNS服务器的安装与配置
- 欧拉计划第80题:平方根数字展开
- zip压缩包太大无法用unzip成功解压(保姆级)
- 体验论文新神器!AMiner人工智能工具,自动溯源论文来龙去脉
- 华为交换机基础学习命令(ensp)
- C/C++电话号码查询系统
- C++习题:6-1 CCircle And CCylinder
- C语言编程输出象棋棋盘
- 淘宝神话-one piece 般的十年
- python爬虫使用正则爬取网站
- C# dotnet 一个看上去还能用的二进制序列化帮助类
- c语言调用子程序的例子,几个C语言编程应用实例.DOC
热门文章
- Origin如何绘制泡泡图?
- java小程序源码_【小程序源码分享】基于Java开发的物业管理系统!
- linux sql failed,Cacti SQL Failed! Error:’1062′故障排除
- VS 中配置使用Visual SVN系列 一:SVN Server下载和安装
- _cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别
- 深入解析Windows窗口创建和消息分发
- 用python定位手机_使用Python定位android和iphone
- Python 排序 -- sort()、sorted()
- 数据结构与算法(C++)– 二叉查找树(Binary Search Tree )
- 呵护宝宝健康成长 飞鹤携手第四范式天枢打造精准智能推荐