如何跟踪表单的更改并在DB中存储

时间:2011-12-01 15:15:26

标签: php html

我有一个用PHP / HTML编写的表单。表单由文本框,下拉列表和复选框组成。我想要实现的是,我想从文本框,下拉列表和复选框跟踪表单上的所有更改,并将其存储在DB中以进行审计。我不需要知道以前的数据和已更新的内容,但我想知道用户是否更改了textbox1,下拉列表和复选框。

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

非常感谢。

3 个答案:

答案 0 :(得分:1)

我认为这里不会有魔法魔法吗?如果不是那么可能是这样的?

当用户提交表单时,获取所有值并将它们中的每一个与数据库中当前保存的值进行比较,如果它们已更改,则写入db,如果不执行任何操作。 在db中有一个on update触发器,这样当一行更新时,它会在写入新数据之前将旧行复制到另一个表(可能是归档表)。在不知道您的数据是什么样的或者您的表结构是什么的情况下,很难提供这些数据。

答案 1 :(得分:1)

如果我正确理解您的请求,当您绘制表单时,您就会知道字段的值。您可以存储它们的哈希值:

<?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
}
?>

答案 2 :(得分:1)

基于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();
}