phpbar.de logo

Mailinglisten-Archive

Tabelle mitÄnderungen

Tabelle mitÄnderungen

Wolfgang Hauck wbh at euta.net
Mit Mar 19 15:50:36 CET 2003


>hallo liste,

>folgendes problem:

>ein datensatz wird per eingabemaske (php) editiert - und soll wieder 
in
>geänderter form in die DB eingetragen werden.

>davor soll aber die änderung erkannt und mitprotokolliert werden.

>ziel:

>beim datensatz ein button "archiv" mit all den veränderungen in 
laufe
>der zeit.

>ich habe folgenden denkansatz:

>bevor das UPDATE gefahren wird soll der datensatz noch einmal davor
>rausgeholt werden und mit den neuen daten verglichen werden - ist 
eine
>änderung in einem feld, dann schreibt das script das in eine
>"veränderungstabelle".

>richtiger weg ?? oder gibt es da etwas in mysql, das das von haus 
aus
>geht?

>bin schon am verzweifeln, da der weg in PHP steinig wird, weil über 
50
>felder...

Hi Tom,

Ich denke das ist der falsche Weg...
Dafür gibts vekettete Listen:

Dazu benötigst du

1. Eine id (autoincrement)
2. Eine id_root (Stamm - ID des ersten inserts) default 0
3. Eine id_ref (Referenz auf die nächste Änderung) default 0
4. Ein Timestampfeld (für die Suche Änderung ab.. hilfreich)
5. Beliebige Daten

So nun tragen wir den ersten DS ein:

id	id_root	id_ref Daten
1	0	0       irgendwas

Wurde nun der DS verändert wird

1. Ein neuer DS eingtragen:
id	id_root	id_ref Daten
2	1	0       irgendwas_anderes

2. Der alte DS angepasst:
id	id_root	id_ref Daten
1	0	2       irgendwas

Dann erhalten wir:

id	id_root	id_ref Daten
1	0	2       irgendwas
2	1	0       irgendwas_anderes

Bei der nächsten Änderung schauts dann so aus:

id	id_root	id_ref Daten
1	0	2       irgendwas
2	1	3       irgendwas_anderes
3	1	0       irgendwas_anderes_neues

usw.

Was nützt jetzt das:

1. Alle Datensätze mit id_ref = 0 sind aktuell.
2. Alle Datensätze mit id_root = 0 sind die ersten ursprünglichen 
Daten.
3. Alle Datensätze mit id_root = 0 und id_ref = 0 wurden nie 
verändert.

Damit lassen sich mit relativ einfachen SQL - Anweisungen z.B. alle 
Änderungen anzeigen, die aktuellen DS finden und auch ganze DS - 
Gruppen löschen.

z.B.

DELETE form Tabelle where id = 1 OR id_root = 1;

Damit wäre jetzt der DS mit allen Änderungen gelöscht. Du benötigst 
also gar keine Veränderungstabelle.

Aktuelle DS finden:

Select * from Tabelle where id_ref = 0;

Alle Änderungen:

SELECT * form Tabelle where id = 1 OR id_root = 1;

Ursprünglicher und letzte Änderung:

SELECT * form Tabelle where id = 1 AND (id_root = 0 OR id_ref = 0);

and so on...

MfG Wolfgang


-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive