php - 使数据库记录更改可跟踪的最佳方法?

标签 php html mysql sql

我有一个带有 HTML 前端的 PHP Web 应用程序,供用户在 MySQL 数据库表中进行更改。我还为旧记录创建了一个存档表,以便在用户更改记录时将其移入其中。

但我不仅想在归档表中保存旧记录,我还想获取具体哪些列被更改。

由于基于 Web 的数据库前端的性质,我无法轻松获取哪些列已更改,因为每次用户打开记​​录时,脚本都会提供该行的内容以将它们传递到 value HTML input 的字段我的前端中的元素(或 selecttextarea 等)。

当用户更改 input 中的值时字段并提交数据浏览器不仅会发送更改的字段,还会发送首先提供给前端的所有数据,包括用户更改的值。因此,即使值未更改,我也必须更新该行。

Original data   Passed to frontend  Changes by user      Data being sent back
  id=827
val1=arthur     val1=arthur                              val1=arthur
val2=ford       val2=ford                                val2=ford
val3=tricia     val3=tricia         val3=trillian        val3=trillian
val4=zaphod     val4=zaphod                              val4=zaphod
val5=marvin     val5=marvin                              val5=marvin
   .
   .
   .

在上面的示例中,提交数据后,后端将简单地复制存档表中的当前记录,并使用值 val1 更新“实时”记录。至val5 .

现在我想创建一个最近更改页面,您可以在其中查看哪些信息已更改,例如:

2014-04-08: User 'douglas' changed val3 in row #827 

或者...

2014-04-08: User 'eoin' changed val1, val2 and val3 in row #137 

目前我看到两种可能的解决方案:

  • 将当前行与归档表中的相应行进行比较,以获取行不同的列名 (!)。 MySQL有没有函数可以做到这一点?我必须用 PHP 实现这个吗?

  • 在 PHP 后端收到前端数据后,立即检查哪些值与原始记录不同,仅存储更改后的值。所以我会自动拥有有问题的列。

最佳答案

在提交时,您有更新的/“或可能没有”字段,并且有原始值,对吧? 两个数据集都可以表示如下:

$updated_data = ['first_name' => 'John', 'last_name' => 'White'];
$original_data = ['first_name' => 'Peter', 'last_name' => 'White'];

现在您可以使用 array_diff_assoc() 和 array_keys() 来查找修改的字段:

$updated_fields = array_keys(array_diff_assoc($updated_data, $original_data));

print_r($updated_fields);  # List of updated fields

关于php - 使数据库记录更改可跟踪的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940697/

相关文章:

mysql - Doctrine2 多重连接

php - 指定 PHP 查询的输出位置

php - Laravel groupBy 和原始查询

jQuery sortable 阻止某些项目排序?

mysql - JOIN 3 tables SUM 按月分组

mysql - 调整 SSD MySql 性能

php - Google reCAPTCHA - 不断获取 `incorrect-captcha-sol`

php - PHP 的 AJAX 分页解决方案

html - 模态框溢出

javascript - 如何通过javascript确定内部每个字符相对于页面的位置(x,y)?