更改数据库记录的最佳方法是可追踪的吗?

时间:2014-04-08 14:54:06

标签: php html mysql sql

我有一个带有HTML前端的PHP webapp,供用户在MySQL数据库表中进行更改。我还为旧记录制作了一个存档表,以便在用户更改记录时将其移动到其中。

但我不仅希望在存档表中保存旧记录,我还希望获得特别更改的列。

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

当用户在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
   .
   .
   .

在上面的示例中,提交数据后,后端只会在存档表中复制当前记录,并使用val1val5的值更新“实时”记录。 / p>

现在,我想制作一个上次更改页面,您可以在其中查看已更改的信息,例如:

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后端中,立即检查哪些值与原始记录不同,以仅存储更改的值。所以我会自动列出相关的列。

1 个答案:

答案 0 :(得分:0)

在subimt上,你有更新的"或者可能没有"字段,你有原始的价值,对吧? 两个数据集都可能表示如下:

$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