Rolf B: PHP SQL, Änderungen nach UPDATE Befehl visualisieren

Beitrag lesen

Hallo PHP-Neuling,

okay. Also nochmal Schritt für Schritt. Das Posting ist lang, weil es für jeden Teil diverse Optionen gibt und ich mehrere beleuchten möchte.

Du hast 2 Aufgaben:

(1) Erkennen, was der Anwender geändert hat
(2) Dem Mail-Bearbeiter mitteilen, was geändert wurde.

Teil 1 hängt auch davon ab, wie komplex dein Form ist. Ich habe nicht ganz verstanden, wie dein Form mit den DB-Sätzen korreliert. „Sofern ein Standort zum Namen passt“ schreibst Du, und das klingt so als würdest Du beim Aufbau des Forms bereits ordentlich mit DB-Sätzen jonglieren. Sehe ich das richtig? Oder enthält ein HTML Form, das der Anwender bekommt, nur Daten aus einem einzigen DB Satz?

Ist aber letztlich egal. Du hast bspw. 47 Checkboxen im Form, und die kann der Anwender verändern. Jede Checkbox hat einen Namen oder eine laufende Nummer. Bei laufenden Nummern ist es am einfachsten, bei Namen etwas schwieriger, aber in jedem Fall kannst Du den "Alt" Datenstand in einem einzigen String codieren.

Bei nummerierten Checkboxen von 1-47 ist es ein String mit 47 Positionen, jede Position entspricht einer Checkbox.

Bei Namen machst Du so etwas wie "name1:0;name2:1;name3:0;...". Das erzeugst Du mittels implode und nimmst es mit explode wieder auseinander.

Nun kannst Du den Stand, den Du dem Anwender als HTML geschickt hast, beim POST wiederherstellen und mit den Werten in $_POST vergleichen.

Für Teil 2 wäre es aus meiner Sicht am einfachsten, die ermittelten Änderungen einfach in die Mail hineinzuschreiben. Wenn Du dann die Mail bekommst, brauchst Du keinen alten und neuen Stand der Datenbank, um deine AD Aktivitäten zu bestimmen, sondern machst das einfach auf Grund der Mail.

Wenn Du den alten und neuen Stand unbedingt in der Datenbank sehen willst, dann hast Du wieder mehrere Möglichkeiten.

  • Historisieren der id,name,standort... Tabelle, in dem Du weitere Spalten wie "Last Update" oder "Version" hinzufügst. Im Ergebnis hast Du dann für jeden Eintrag nicht nur den aktuellen Stand, sondern auch alle Stände davor. Die Datenmenge wächst dadurch stetig mit jedem Update an - du musst für Dich entscheiden, ob das sinnvoll ist. Um das zu bekommen, machst Du an Stelle eines UPDATE einen INSERT mit der neuen Version. Beim Auslesen musst Du dann natürlich dafür sorgen, dass Du immer nur den letzten Satz verwendest. Das kann man durch eine weitere Spalte "Gültig" beschleunigen; das setzt aber auch voraus, dass Du beim Update den geänderten Satz als Ungültig markierst - du machst dann also einen Update und einen Insert.

  • Erzeugen einer Altdaten-Tabelle. Die Tabelle, die Du jetzt hast, zeigt den gültigen Datenstand. Bevor Du einen Update machst, duplizierst Du diesen Stand zusammen mit dem Änderungstimestamp in eine zweite Tabelle. Das geht mit einem INSERT (...) SELECT (...).

Historisieren benötigt keinen Trigger, das steuerst Du über PHP und es bedeutet etliche Änderungen in deinem PHP. Die Altdaten-Tabelle kannst Du in einem Trigger befüllen. Die Idee, dass ein Trigger nur mit Temp-Tabellen hantiert, mag einem merkwürdigen Beispiel geschuldet sein; mit der Realität hat sie nichts zu tun. Du machst einen AFTER UPDATE Trigger auf diese Tabelle, und verwendest die OLD-Version der geänderten Row, um die Werte in die Altdatentabelle zu INSERTen. Was es mit OLD und NEW auf sich hat, findest Du hier.

Aber wie gesagt; das sollte man nur tun wenn man auf historische Daten in der DB angewiesen ist. So, wie Du deinen Workflow beschreibst, sollte es genügen, wenn die Änderungen mit altem und neuem Wert in der Mail dokumentiert sind.

Rolf

--
sumpsi - posui - obstruxi