如何跟踪表单的变化并存储在数据库中


How to track changes of a form and store in DB

我有一个PHP/HTML编写的表单。表单由文本框、下拉框和复选框组成。我想要实现的是,我想从文本框,下拉框和复选框跟踪表单上的所有变化,并将其存储在DB中用于审计目的。我不需要知道以前的数据和什么已经更新,但我想知道如果用户改变textbox1,下拉框和复选框。

在PHP上执行此操作的最有效方法是什么?我在mysql中读过一些触发器,但我想只在PHP中这样做。

如果我正确地解释您的请求,当您绘制表单时,您知道字段的值。您可以存储它们的散列:

<?php
$hash = md5($text . $drop . $check);
?>
<input type="hidden" name="values" value="<?php $hash; ?>" />

然后在提交表单的过程中可以比较这两个值

<?php
$previous = $_POST['values'];
$actual = md5($_POST['text'] . $_POST['drop'] . $_POST['check']);
if ($previous !== $actual)
    // you know some values are diferent
}
?>

我猜这里面不会有什么神奇的东西吧?如果没有,那就这样吧?

当用户提交表单时,取所有值并将它们与数据库中当前保存的值进行比较,如果它们已经更改,则写入数据库,如果不做任何事情。在数据库中有一个on更新触发器,以便当一行更新时,它在写入新数据之前将旧行复制到另一个表(存档表可能)。如果你不知道你的数据是什么样子的,或者你的表结构是什么,你很难提供更多的东西。

基于Macjohn解决方案,我已经达到了这一点,但我想问什么是处理这种SQL场景的有效方法。我相信有一个快捷方式,使代码更小的比较上有if语句的每个元素的形式。

if ($_REQUEST['hidden_value_of_input_box1'] !== $newvalueofinputbox1) {
  $data = "Input Box 1 has been changed"'
  $name = $name;
  $date = $datenow;
  $stm = $dbh->prepare("INSERT INTO audit SET name=:name, datenow=:datenow, data=:data");  
  $stm->bindParam(':name', $name);
  $stm->bindParam(':value', $value);
  $stm->execute();
}
if ($_REQUEST['hidden_value_of_input_box2'] !== $newvalueofinputbox2) {
  $data = "Input Box 2 has been changed"'
  $name = $name;
  $date = $datenow;
  $stm = $dbh->prepare("INSERT INTO audit SET name=:name, datenow=:datenow, data=:data");  
  $stm->bindParam(':name', $name);
  $stm->bindParam(':value', $value);
  $stm->execute();
}
if ($_REQUEST['hidden_value_of_dropdown1'] !== $newvalueofdropdown1) {
  $data = "Drop Down 1 has been changed"'
  $name = $name;
  $date = $datenow;
  $stm = $dbh->prepare("INSERT INTO audit SET name=:name, datenow=:datenow, data=:data");  
  $stm->bindParam(':name', $name);
  $stm->bindParam(':value', $value);
  $stm->execute();
}
if ($_REQUEST['hidden_value_of_dropdown2'] !== $newvalueofdropdown2) {
  $data = "Drop Down 2 has been changed"'
  $name = $name;
  $date = $datenow;
  $stm = $dbh->prepare("INSERT INTO audit SET name=:name, datenow=:datenow, data=:data");  
  $stm->bindParam(':name', $name);
  $stm->bindParam(':value', $value);
  $stm->execute();
}