phpbar.de logo

Mailinglisten-Archive

Tabelle mitÄnderungen

Tabelle mitÄnderungen

Wolfgang Hauck wbh at euta.net
Die Mar 25 11:41:58 CET 2003


Herr Ing. Thomas Kolditz schrieb:

>vor ein paar tagen hab ich mich mit diesem probelm an euch gewandt.
>leider hat mir keiner von euch so richtig helfen können.

>nun gibts von mir eine lösung dazu!

Sehr geehrter Herr Ing. Thomas Kolditz,

Ich weiss überhaupt nicht warum ich auf dieser Liste antworten soll 
wenn die Fragesteller für sich selbst antworten und die Hinweise der 
Listenmitglieder die sich bemühen anderen Leuten zu helfen einfach 
ignorieren!!!

Hier nochmals die Mail vom 19.03.2003 15:50:

<Schnipp>
>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
</Schnapp>

Es bleibt den Listenmitgliedern selbst vorbehalten was sie davon 
denken...

MfG Wolfgang



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


php::bar PHP Wiki   -   Listenarchive