记录用户的行为日志有时候对于后台管理尤其是人员管理有很大的作用.日志可以用于追溯哪个人操作的某个东西.不过针对某个表修改了某个字段这个不太好办,于是想到一个办法.如下.
一.需要先建个数据
CREATE TABLE `hanchao_change_log` (
`id` int(10) NOT NULL COMMENT '' AUTO_INCREMENT PRIMARY KEY,
`model` varchar(50) NOT NULL COMMENT '触发行为的表',
`user_id` int(10) NOT NULL DEFAULT '0' COMMENT '执行用户id',
`record_id` int(10) NOT NULL DEFAULT '0' COMMENT '触发行为的数据id',
`action` varchar(50) NOT NULL COMMENT 'add/edit/del',
`action_ip` int(10) NOT NULL DEFAULT '0' COMMENT '执行行为者ip',
`create_time` int(10) NOT NULL DEFAULT '0' COMMENT '执行行为的时间',
`remark` text NOT NULL COMMENT '日志备注'
) COMMENT='数据变更日志' ENGINE='InnoDB' COLLATE 'utf8_general_ci';
二.写个记录的函数
/**
* 记录数据库日志
* @param string $action 行为标识
* @param string $model 触发行为的模型名
* @param int $record_id 触发行为的记录id
* @param int $user_id 执行行为的用户id
* @param int $mark 自定义备注
* @return boolean
*/
function change_log($action = null, $model = null, $record_id = null, $user_id = null,$mark=null){
if(empty($action) || empty($model) || empty($record_id)){return '参数不能为空';}
if(empty($user_id)){$user_id = is_login();}
if($action=='edit' && $mark && is_array($mark) && $mark['oldparam']){
$oldparam=json_decode(htmlspecialchars_decode($mark['oldparam']),1);unset($mark['oldparam']);
$edit=array();
foreach($mark as $k=>$v){if(isset($oldparam[$k]) && $v!=$oldparam[$k]){$edit[$k]=$v;}}
if($edit){$mark="修改内容:\n";foreach($edit as $k=>$v){$mark.=$k.":".(is_array($v)?serialize($v):$v)."\n";}}
}
//插入行为日志
$data=array();
$data['action'] = $action;
$data['user_id'] = $user_id;
$data['action_ip'] = get_client_ip(1);
$data['model'] = $model;
$data['record_id'] = $record_id;
$data['create_time'] = NOW_TIME;
if(!empty($mark))$data['remark']=$mark;
M('ChangeLog')->add($data);
}
三.模板中添加个隐藏域用来记录所有字段旧的值(用记编辑记录,添加删除等不需要)
<input type="hidden" name="oldparam" value='{:json_encode($info)}'/>
四.在相应方法中加入调用函数
change_log('add',CONTROLLER_NAME,$id,'','添加商品');
change_log('edit',CONTROLLER_NAME,$id,'',$postdata);
change_log('del',CONTROLLER_NAME,$id,'','删除商品');
搞定