2009-06-24 8 views
0

Ich muss einen Eintrag in eine Datenbank jedes Mal hinzufügen, wenn sich ein Feld in einem Formular ändert, das den alten Wert und den neuen Wert angibt.Was ist der beste Weg, Änderungen in einem bestimmten Formularfeld zu überprüfen?

Wie würden Sie darüber gehen ??

Würden Sie ...

  1. ein verstecktes Feld für jedes Feld hinzufügen und es auf den neuen Wert vergleichen, auf einreichen dann einen Überwachungseintrag hinzufügen, wenn nötig ??

  2. Wählen Sie die Daten aus, die in den Post eingefügt werden sollen, und vergleichen Sie dann jede Eigenschaft und fügen Sie den Prüfeintrag ein.

  3. Irgendwelche anderen Ideen?

Prost.

+0

Sie haben dies als ASP-Classic, PHP und ASP.NET gekennzeichnet. Welches ist es? –

+0

ist es auch getaggt Javascript, das ist eine wirklich schlechte Idee. Verwenden Sie keine Client-Seite für solche Dinge. –

+0

Server-Seite Javascript auf klassischen asp. – Schotime

Antwort

0

Ich denke, dass Sie zuerst das Formular in String, serialisieren und mit der neuesten Zeichenfolge, vergleichen können, um zu sehen, wenn sich etwas ändert. Wenn 2 Strings gleich sind, hast du nichts zu tun.

sollte ich, dass alle Elemente in Ihrem Formular mit dem Namen von [] wie:

formular_name [ 'first_name'] .... formular_name [ 'last_name'] ....

, wenn Sie mit php Sie können array_diff_assoc tun, um zu sehen, welche Änderung.

alles, was Sie brauchen, ist jedes Mal in db speichern die neuesten Form-Array, speichern Sie als String von serialisiert.

0

Möglicherweise können Sie einen Aktualisierungstrigger in Ihrer Datenbank zum Vergleichen und Auditing verwenden. (Ich habe kein Code-Beispiel zur Hand - tut mir leid).

+0

Ja .... wir tun das für etwas, aber in diesem Fall nicht anwendbar. – Schotime

+0

andere Grenzen? Können Sie gespeicherte Prozeduren verwenden? Wenn Sie können, würde ich mit Option 2 gehen, in einer gespeicherten Prozedur (die Ihre App einfach halten würde) – Antony

+0

können Sie SPs aber müssen den Benutzer wissen, der den Wert geändert hat. – Schotime

0

Sie können nicht sagen, welche Datenbank Sie verwenden. Sie können versuchen, eine Prozedur zu schreiben, die den aktuellen Wert erhält und vergleicht, in der Datenbank speichert. Ich schlage das vor, wie ich denke, dies ist eher ein Vergleich, der auf Datenbankseite und nicht am Frontend gemacht wird.

Bearbeiten: Hey, wenn Sie Oracle verwenden, ist es einfach, Verfahren zu schreiben. :)

0

Wenn Sie Postgres oder jede andere Datenbank, die Funktionen, die Sie leicht eine Funktion schreiben können, das zu tun für Sie, die ausgelöst werden könnte, wenn ein Update auf einem Tisch

durchgeführt wird

Für Punkt 1, Es ist definitiv keine gute Idee, "versteckte Felder" in das Formular aufzunehmen, da jemand einfach seine eigene POST-Anweisung erstellen könnte.

Für Punkt 2, würde dies leicht genug funktionieren und ist, was ich verwenden würde, wenn ich eine Funktion nicht schreiben könnte.

Sie würden wollen etwas tun, wie folgt aus:

  1. Validate dass das, was sie einreichen gültig
  2. Wählen Sie Informationen aus der nicht-aktualisierte Zeile
  3. Store ist sowohl die Formulardaten und die DB-Daten in zwei Arrays, zum Beispiel $db_data und $form_data
  4. die Unterschiede Holen Sie die Funktion array_diff_assoc

    mit

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

Beachten Sie, dass sowohl das Formular als auch das db-Array die gleichen Schlüssel haben müssen.

1

Angenommen, Sie möchten dies in der App-Ebene beibehalten, würde ich empfehlen, eine Modellschicht mit Eigenschaften pro Feld zu verwenden, um die Protokollierung durchzuführen. Der gesamte Datenzugriff geht dann durch dieses Datenmodell und gibt Ihnen einen Haken, um Funktionalität hinzuzufügen.

Ein activerecord basierend Beispiel (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 

Es könnte ein bisschen aufgebläht erscheinen, aber es ist flexibler als ein Trigger-basierten Ansatz. Zum Beispiel können Sie einfach Reichweitenprüfungen und ähnliches implementieren.

Zweitens, wenn Sie mehrere Entity-Klassen schreiben müssen, können Sie eine Menge Funktionalität in eine Delegate-Klasse schieben und Code-Vorlage verwenden, um die Eigenschaft Getter & Setter zu schreiben.

Verwandte Themen