欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

如何快捷有效的判断某条MySQL数据被修改的内容。

程序员文章站 2022-06-09 11:14:34
...
前提

我使用PHP MySQL制作了一个数据添加修改功能,关于修改功能。我需要获取每次数据修改了什么内容,以便存储为一个log数据,以备查看。

示例

有一个数据表,内容分别是

id,名称,编号,等…

有一条数据内容是

1,小明,101,等…

然后我通过update语录,修改了小明小红,修改了101102等数据。

这时候我要做一个log记录,保存某某某时间 将小明改为小红,等

问题

这时候问题来了。如何快捷有效的判断出修改内容。

我的做法

因为编辑数据前我载入了一次数据到网页中,然后网页提交的时候,我就判断提交的内容和刚载入的数据是否相同,不相同表示这里修改过了。

我认为的弊端

因为我的数据很多很多不只有id 名称这几个,所以判断起来特别麻烦,很多if,比如if name == newname 之类的判断语录。

需求

有没有更高效,代码更精炼的方式实现?

回复内容:

前提

我使用PHP MySQL制作了一个数据添加修改功能,关于修改功能。我需要获取每次数据修改了什么内容,以便存储为一个log数据,以备查看。

示例

有一个数据表,内容分别是

id,名称,编号,等…

有一条数据内容是

1,小明,101,等…

然后我通过update语录,修改了小明小红,修改了101102等数据。

这时候我要做一个log记录,保存某某某时间 将小明改为小红,等

问题

这时候问题来了。如何快捷有效的判断出修改内容。

我的做法

因为编辑数据前我载入了一次数据到网页中,然后网页提交的时候,我就判断提交的内容和刚载入的数据是否相同,不相同表示这里修改过了。

我认为的弊端

因为我的数据很多很多不只有id 名称这几个,所以判断起来特别麻烦,很多if,比如if name == newname 之类的判断语录。

需求

有没有更高效,代码更精炼的方式实现?

新旧数据如果用一维数组表示,可以用PHP函数array_diff_assoc比较两个数组。
用很多if判断是很笨的方法,另外也不建议交给数据库来做这种工作

$old = array('id'=>'1','name'=>'a','sort'=>'1');
$new = array('id'=>'1','name'=>'b','sort'=>'2');

$result1 = array_diff_assoc($new, $old);
$result2 = array_diff_assoc($old, $new);

print_r($result1); //Array ( [name] => b [sort] => 2 )
print_r($result2); //Array ( [name] => a [sort] => 1 ) 

直接分析mysql日志不就好了。

如果是表单数据的话, 一种方法是把多维表单数据压缩成字串,然后求出字串的长度(int) 值存入到改条目里面。下次对比的时候只要调出该字串长度然后跟提交表单的压缩字串对比一下就知道了。长度相同为没改,长度不同为该了。注意繁体简体字的问题。

触发器?我记得在oracle是可以的 我们也做过 有一个表哪行改了就把数据拷贝到另外一份表里
但是如果diff到字段可能不现实

之前上次也是做了一个需要判断哪些字段改没改
我也是采用你那样的做法,只不过没有各种判断if,也就是两个数组(新数据,旧数据)进行比较,他们的key值要一致,然后直接写个方法两个key值对应去比较值,不同就记录下来

其实我觉得题主的方法未必不可,通过题主的描述,应该是一个大表单的Update而这种入口也不会很多吧?
我觉得唯一可以做的,就是不需要把这些东西放在主业务流程里面而且应该是异步的。噶虐可以通过消息机制或者其它方式来异步完成这件事情。