Nedir, belirli bir form alanı değişiklikleri denetlemek için en iyi yolu nedir?

5 Cevap php

Ben her bir veritabanına bir girdi, eski değerini ve yeni değerini gösteren bir formda bir alan değişiklikleri eklemek gerekir.

Bunu nasıl hakkında gitmek istiyorsunuz?

Yapar mısın ...

  1. Her alan için bir gizli alan eklemek ve göndermek üzerine yeni değere sonra karşılaştırın neccessary bir denetim girişi varsa ekleyebilir?

  2. Yazı üzerine eklenecek bir veri seçme sonra her özelliği karşılaştırmak ve denetim girdisi eklemek etmeyin.

  3. Diğer fikirler?

Şerefe.

5 Cevap

Eğer ben günlüğü yapmak için alan başına özelliklere sahip bir model katman kullanmak için tavsiye ediyorum uygulama katmanında bu tutmak istiyorum varsayarsak. Tüm veri erişim sonra işlevsellik eklemek için bir kanca vererek, bu veri modelini yalak gider.

Bir activerecord tabanlı örnek (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

Bu biraz şişirilmiş görünebilir, ama bu bir tetik temelli bir yaklaşım daha esnektir. Örneğin kolayca sınır kontrolleri ve böyle uygulayabilirsiniz.

Birden fazla varlık sınıfları yazmak gerektiğinde İkincisi, bir temsilci sınıfa işlevsellik bir sürü itin ve özellik alıcı ve yazmak için kod şablonu kullanabilirsiniz belirleyiciler.

Sen karşılaştırma ve denetim yapmak için veritabanında bir güncelleştirme tetikleyici kullanmak mümkün olabilir. (Ben bir örnek kod kullanışlı yok - üzgünüm).

i think that first you can serialize the form to string , and compare with the latest string , to see if something change . if 2 string equal you have nothing to do.

i şeklinde tüm eleman [] gibi tarafından adlandırılmış gerektir:

form_name['first_name'] .... form_name['last_name'] ....

Eğer php kullanarak eğer ne değişikliği görmek için, array_diff_assoc yapabilirsiniz.

ihtiyacınız olan tüm, son şeklidir dizide db her zaman kazanmak tefrika dizge olarak kaydetmek değildir.

Sen din't ne kullandığınız veritabanı söylüyorlar. Sen akım değerini alır bir prosedür, yazmayı deneyin ve veritabanı, mağaza karşılaştırabilirsiniz. Ben, bu veritabanı tarafında değil, ön ucunda yapılacak bir karşılaştırmada daha fazla olduğunu düşünüyorum ben bu öneririz.

Düzenleme: Oracle kullanırsanız Hey, prosedürleri yazmak kolaydır. :)

Eğer Postgres veya işlevleri olan herhangi bir diğer veritabanı kullanıyorsanız, kolayca bir tabloda bir UPDATE yapıldığı her tetiklenen olabilir sizin için bunu yapmak için bir işlev yazabilirsiniz

Birisi kolayca kendi POST deyimi zanaat olabilir gibi noktası 1 için, bu formda 'gizli alanları' dahil etmek kesinlikle iyi bir fikir değil.

Noktası 2 için, bu kolayca yeterli çalışmak ve ben bir işlev yazamadım eğer ben kullanmak istiyorum ne olur.

Sen istersin diye böyle bir şey yapın:

  1. Ne gönderdiğinizi geçerli olduğunu doğrulamak
  2. Olmayan güncellenen arka arkaya gelen bilgiler seçiniz
  3. Form verilerini ve iki dizide db hem de veri depolamak, örneğin $db_data ve $form_data
  4. Get fonksiyonu array_diff_assoc kullanarak farkları

    $ Fark = array_diff_assoc (db_data $, $ form_data);

Form ve db dizisi hem aynı tuşları gerektiğini akılda tutarak.