代码之家  ›  专栏  ›  技术社区  ›  Schotime

审核特定表单字段上的更改的最佳方法是什么?

  •  0
  • Schotime  · 技术社区  · 17 年前

    每当字段在指示旧值和新值的窗体中发生更改时,我需要在数据库中添加一个条目。

    你会怎么做??

    你会。。。

    1. 为每个字段添加一个隐藏字段,并将其与提交时的新值进行比较,然后在必要时添加审核条目??

    2. 选择要在post上插入的数据,然后比较每个属性并插入审核条目。

    3. 还有其他想法吗?

    干杯。

    5 回复  |  直到 17 年前
        1
  •  1
  •   Joost Moesker    17 年前

    假设你想把这个保存在应用层,我建议你使用一个模型层来记录每个字段的属性。然后,所有数据访问都通过这个数据模型,为您提供了一个添加功能的钩子。

    一个 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&setter。

        2
  •  0
  •   Antony    17 年前

    您可以在数据库中使用更新触发器来进行比较和审核。(我手头没有代码示例-抱歉)。

        3
  •  0
  •   Haim Evgi    17 年前

    我想你可以先把表单序列化成字符串, 与最新的字符串相比, 看看有什么变化。 如果两个字符串相等,则无需执行任何操作。

    我想你表格中的所有元素都是由[]命名的,比如:

    表单名称['名字']。。。。 表单名称[姓氏]。。。。

    如果你使用php,你可以做array-diff-assoc,看看有什么变化。

    您只需要每次在db中保存最新的表单数组,通过序列化保存为字符串。

        4
  •  0
  •   Guru    17 年前

    你没说你在用什么数据库。您可以尝试编写一个过程,获取当前值并比较存储在数据库中。我建议这样做,因为我认为,这是一个比较做数据库方面,而不是在前端。

    编辑:嘿,如果你用甲骨文很容易写程序。:)

        5
  •  0
  •   Cetra    17 年前

    如果您使用的是Postgres或任何其他具有函数的数据库,那么您可以很容易地编写一个函数来实现这一点,每当对表执行更新时都可以触发该函数

    对于第1点,在表单中包含“隐藏字段”绝对不是一个好主意,因为有些人可以轻松地创建自己的POST语句。

    对于第2点,这很容易实现,如果我不能编写一个函数,我将使用它。

    你想做这样的事:

    1. 验证他们提交的内容是否有效
    2. 从未更新的行中选择信息
    3. 例如,将表单数据和数据库数据存储在两个数组中 $db_data $form_data
    4. 使用函数获取差异 array_diff_assoc

      $differences=数组差异关联($db_data,$form_data);

    请记住,form和db数组都需要具有相同的键。

    推荐文章