Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql中一行上的差异_Php_Mysql_Diff - Fatal编程技术网

Php mysql中一行上的差异

Php mysql中一行上的差异,php,mysql,diff,Php,Mysql,Diff,我想知道是否有一种比较两行MySQL数据的简单方法 特别是,我有一个表,其中包含每个用户的设置值列表 用户可以毫无问题地在gui中修改这些设置 现在,我想做的是:每当用户保存新数据时,我想找出旧数据和要保存的数据之间的差异,以找出哪些列发生了更改,然后保存到日志中 我现在这样做的方式是在保存和比较之前读取对应于用户的行,逐个变量地查找更改的数据,但我发现速度很慢,我想知道是否有更聪明的方法来完成这一操作,可能是在mysql查询中(可能使用临时表?)或者使用一些我不知道的php mysql函数 我

我想知道是否有一种比较两行MySQL数据的简单方法

特别是,我有一个表,其中包含每个用户的设置值列表

用户可以毫无问题地在gui中修改这些设置

现在,我想做的是:每当用户保存新数据时,我想找出旧数据和要保存的数据之间的差异,以找出哪些列发生了更改,然后保存到日志中

我现在这样做的方式是在保存和比较之前读取对应于用户的行,逐个变量地查找更改的数据,但我发现速度很慢,我想知道是否有更聪明的方法来完成这一操作,可能是在mysql查询中(可能使用临时表?)或者使用一些我不知道的php mysql函数

我希望你能给我一些想法

(我勾选了这个问题:,但结果与我要找的有很大不同)


提前谢谢

您可以使用PHP中的
array\u diff\u assoc()
函数来实现这一点

这里我们有两行php数组中的数据

$newValues = array_diff_assoc($afterRow, $beforeRow);
它将返回一个数组,其中任何列值都已更改或添加

编辑

要在MySQL中实现这一点,您需要在名称-值对中使用它们,如下所示:

Prefs
----------------------------------------------
UserID   TransactionID   Name       Value
----------------------------------------------
1        1               Font       Sans Serif
1        1               Color      Red
1        1               Height     100
1        1               Width      400

1        2               Font       Verdana
1        2               Color      Red
1        2               Height     100
1        2               Indent     50
TransactionID 1是旧行,事务ID 2是新行:

SELECT * FROM Prefs new
  LEFT JOIN Prefs old
  ON new.Name = old.Name
    AND new.Value = old.Value
  WHERE UserID = 1
    AND new.TransactionID = 2
    AND old.TransactionID = 1
    AND (old.Name IS NULL OR old.Value IS NULL)
如果我的逻辑是正确的,我应该:

----------------------------------------------
UserID   TransactionID   Name       Value
----------------------------------------------
1        2               Font       Verdana
1        2               Indent     50

如果您想做的是日志更改,请考虑使用。这样,您就不必担心在更新行时手动检查。@MichaelMior刚刚意识到我跳过了您的评论:(谢谢,这非常有帮助,没有问题:)祝您好运+0我删除了包含非常类似解决方案的答案。它只说明了新的元素。它不能解释更改的值。@mmmshuddup,如果你是说上面的解决方案不能解释更改的值,那么我说我的眼睛欺骗了我。试试看,让我知道。。我发誓当我写那篇评论时,你的答案的内容是不同的!哈哈,我会重读一遍,告诉你我得到了什么。暂时,我收回我先前的评论。:)很抱歉耽搁了,但是是的!这就是我要找的,我在php中没有两行,因为旧的设置在mysql中,新的设置在php中,但我可以做一些快速更改,我很乐意:)谢谢!我打开了一个类似的问题,但我需要比较文本:。你有什么建议吗?