每当字段在指示旧值和新值的表单中更改时,我都需要在数据库中添加一个条目。
你会怎么做?
你愿意......
为每个字段添加一个隐藏字段,并将其与提交时的新值进行比较,然后在必要时添加审核条目?
选择要在帖子上插入的数据,然后比较每个属性并插入审核条目。
还有其他想法吗?
干杯。
答案 0 :(得分:1)
假设您希望将其保留在应用层中,我建议使用具有每个字段属性的模型层来进行日志记录。然后,所有数据访问都通过此数据模型进行访问,为您提供添加功能的钩子。
基于activerecord的示例(VBScript):
class cSomeEntity
public db ' link to a db wrapper
private id, dirty, loaded ' varous flags
private sub class_initialize
dirty = false
loaded = false
end sub
private sub class_terminate
if dirty then
db.execute("update some_table set some_field=? where id=?", array(p_some_field, id))
end if
end sub
public sub load_by_id(value)
dim rs
set rs = db.fetch_rs("select id, some_field from some_table where id=?", array(id))
id = rs("id")
p_some_field = rs("some_field")
loaded = true
end sub
private p_some_field
public property get some_field
some_field = p_some_field
end property
public property let some_field(value)
if not loaded then err.raise 1, , "Entity not yet initialized, call .load_by_id() first!"
if value <> p_some_field then
dirty = true
make_log_entry("some_value", p_some_field, value)
p_some_field = value
end if
end property
private sub make_log_entry(field, old_value, new_value)
db.execute("insert into audit_log (table, field, old_value, new_value) values (?, ?, ?, ?)", _
array("some_table", field, old_value, new_value))
end sub
end class
它可能看起来有点臃肿,但它比基于触发器的方法更灵活。例如,您可以轻松实现范围检查等。
其次,当您需要编写多个实体类时,您可以将大量功能推送到委托类,并使用代码模板来编写属性getter&amp; setter方法。
答案 1 :(得分:0)
我认为首先你可以将表单序列化为字符串, 并与最新的字符串进行比较, 看看有什么变化。 如果2个字符串相等则你无事可做。
我认为你的表单中的所有元素都由[]命名,如:
form_name ['first_name'] .... form_name ['last_name'] ....
如果你使用php,你可以做array_diff_assoc,看看有什么变化。
所有你需要的是每次在db中保存最新的表单数组,通过序列化保存为字符串。
答案 2 :(得分:0)
您可以在数据库中使用更新触发器来进行比较和审核。 (我没有方便的代码示例 - 抱歉)。
答案 3 :(得分:0)
你不能说你正在使用什么数据库。您可以尝试编写一个过程,该过程获取当前值并进行比较,存储在数据库中。我认为,我认为这更像是在数据库方面而不是在前端进行的比较。
编辑:嘿,如果你使用Oracle,很容易编写程序。 :)
答案 4 :(得分:0)
如果您正在使用Postgres或任何其他具有功能的数据库,您可以轻松编写一个函数来为您执行此操作,只要执行表上的UPDATE就可以触发该函数
对于第1点,在表单中包含“隐藏字段”绝对不是一个好主意,因为有人可以轻松制作自己的POST语句。
对于第2点,这样可以很容易地工作,如果我不能写一个函数,我会使用它。
你想做这样的事情:
$db_data
和$form_data
使用函数array_diff_assoc
$ differences = array_diff_assoc($ db_data,$ form_data);
请记住,表单和db数组都需要具有相同的键。