我有一个用PHP / HTML编写的表单。表单由文本框,下拉列表和复选框组成。我想要实现的是,我想从文本框,下拉列表和复选框跟踪表单上的所有更改,并将其存储在DB中以进行审计。我不需要知道以前的数据和已更新的内容,但我想知道用户是否更改了textbox1,下拉列表和复选框。
在PHP上执行此操作的最有效方法是什么。我在mysql中读过一些触发器,但我只想在PHP中执行它。
非常感谢。
答案 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();
}