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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ThinikPhp 将数据库模型的增、删、改操作写入日志

發(fā)布時(shí)間:2025/1/21 数据库 116 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ThinikPhp 将数据库模型的增、删、改操作写入日志 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Thinkphp中的模型可以對(duì)數(shù)據(jù)庫字段進(jìn)行驗(yàn)證規(guī)則的設(shè)置和設(shè)置一些字段的默認(rèn)值(比如字段為當(dāng)前時(shí)間)以及在操作數(shù)據(jù)時(shí)的的一些回調(diào)方法等 基本上每一個(gè)模型都需要設(shè)置一些驗(yàn)證規(guī)則和字段默認(rèn)值的設(shè)置,而大部分都存在著重復(fù)的工作 特別是像需要將數(shù)據(jù)庫操作記錄到日志系統(tǒng)的,這就導(dǎo)致我們需要在每個(gè)模型中反復(fù)處理 針對(duì)此問題我定義一個(gè)父類模型,所以模型都繼承自此類即可解決以上兩個(gè)問題 父類就完成了以下兩件工作:
  • 記錄增、刪、改等操作到日志系統(tǒng)
  • 定義一些大部分?jǐn)?shù)據(jù)庫都需要驗(yàn)證的規(guī)則(子類可覆蓋或自定義)或者需要自動(dòng)生成的字段(如每個(gè)數(shù)據(jù)庫都有一個(gè)記錄當(dāng)前時(shí)間的字段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: 驗(yàn)證字段,子類可以覆蓋或移出*/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自動(dòng)生成當(dāng)前時(shí)間*/protected $_auto = array (array ('create_time', 'mGetDate', 1, 'callback' ), // 增加的時(shí)候調(diào)用回調(diào)函數(shù));/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 15:52:40* @Description: 返回該類的自動(dòng)驗(yàn)證信息,用于在子類中合并該驗(yàn)證信息(不能在子類中定義此$_validate屬性否則會(huì)被覆蓋,如果不需要在子類中合并則可以可忽略此方法)*/protected function get_validate(){return $this->_validate;}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:06:03* @Description: 獲取當(dāng)前時(shí)間*/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: 更新成功后的回調(diào)方法*/protected function _after_update($data,$options) {//區(qū)分會(huì)員登錄和更改操作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: 插入成功后的回調(diào)方法*/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: 刪除成功后的回調(diào)方法*/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: 更新或插入成功后和刪除前寫入系統(tǒng)日志*/function after_write($type,$data,$options){$db_name = C('DB_PREFIX')."system_log"; //日志表//如果是系統(tǒng)日志表則不處理,防止循環(huán)調(diào)用此方法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']);//更改時(shí)如果原數(shù)據(jù)未更改則不進(jìn)行記錄,防止重復(fù)記錄if("update" === $type){//表主健$_data['t_id'] = $data['id'];// 主健名稱不是id// 獲取主健對(duì)應(yīng)的數(shù)據(jù)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('寫入系統(tǒng)日志時(shí)發(fā)生錯(cuò)誤,錯(cuò)誤信息:'.$e->getMessage(),'WARN');}}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 11:04:40* @Description: 是否是數(shù)組*/function _is_array($array){return ($array && is_array($array) && count($array)>0);} }

      

    定義一個(gè)數(shù)據(jù)庫模型并繼承自CommonModel即可 <?php/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:03:57* @Description: 基礎(chǔ)價(jià)格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: 自動(dòng)驗(yàn)證,合并父類驗(yàn)證規(guī)則*/function _initialize() {//自定義驗(yàn)證規(guī)則$_val = array(array('cost','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),array('price','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),);//合并父類的規(guī)則//驗(yàn)證父類code、name字段//當(dāng)前模型的create_time字段自動(dòng)填充$this->_validate = array_merge (parent::get_validate(),$_val);// 移出父類的Code唯一性驗(yàn)證//foreach ($this->_validate as $key => $value) {// if($value[0]=='code' && $value[4]=='unique'){// unset($this->_validate[$key]);// }//}//覆蓋父類驗(yàn)證規(guī)則$this->_validate = $_val;} }

      

    數(shù)據(jù)庫結(jié)構(gòu) 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 '操作的時(shí)間',`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.2開發(fā)手冊(cè) 自動(dòng)驗(yàn)證

    TP3.1開發(fā)手冊(cè) 模型擴(kuò)展

    From WizNote



    總結(jié)

    以上是生活随笔為你收集整理的ThinikPhp 将数据库模型的增、删、改操作写入日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。