• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[PHP] Im Log Ereignisse festhalten

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
Ich bin dabei ein Inventarscript zu schreiben und möchte nun Ereignisse in einem Log festhalten. Wenn ich nun beispielsweise einen Bildschirm in die Datenbank eintrage oder lösche ist das noch sehr einfach. Einfach einen Eintrag in die Logtabelle übergeben in der Art "Benutzer hat Bildschirm AB mit Seriennummer XY eingetragen."

Soweit funktioniert das ja auch. Problematisch wird es aber, wenn an dem eingetragenen Bildschirm etwas geändert werden soll. Es werden ja diverse Dinge eingetragen die Variabel sind. Der Standort kann sich ändern, er kann einem anderen Mitarbeiter zugewiesen werden, er kann umbenannt werden, eine Bemerkung kann geändert werden, die Kostenstelle kann sich ändern, etc. Um die Sache noch komplizierter zu machen können sich ja auch mehrere Dinge auf einmal ändern, also beispielsweise der Standort, damit der Mitarbeiter und damit auch die Kostenstelle.

Wie packt man das jetzt vernünftig in ein Logfile? Die Originalwerte aus der Datenbank übergebe ich jeweils in einem hidden-Feld. So kann man dann abgleichen
[src=php]# Dirty Code
if ($_POST'feld'] == "Originalwert aus der Datenbank") {
echo "Alles gleich.";
} else {
echo "Da hat sich was geändert. Verbindung zur Datenbank und Log schreiben".
}[/src]

Das macht für eine einzelne Prüfung (meinetwegen auch bei zwei Prüfungen) noch Sinn, aber wenn man vier, fünf oder mehr Felder auf eine Veränderung prüfen will und das auch noch mit mehreren Feldern gleichzeitig passieren kann wird das irgendwann ein ellenlanger Code der ziemlich unschön ist. Ob man auch nach jeder Prüfung eine Datenbankverbindung aufmachen muss um das zu speichern ist ebenfalls eine Frage die ich mir stelle. Kann man das nicht erstmal "sammeln" und dann alles auf einmal eintragen?

Ich hätte halt am Ende gerne einen Logeintrag der ungefähr so aussieht:
28.05.2014 10:20:30 Uhr | Benutzer hat den Standort des Bildschirms von X nach Y geändert
28.05.2014 10:20:30 Uhr | Benutzer hat den Mitarbeiter des Bildschirms von A nach B geändert
28.05.2014 10:20:30 Uhr | Benutzer hat den Namen des Bildschirms von C nach D geändert
 

keksautomat

Neu angemeldet

Registriert
15 Juli 2013
Beiträge
471
Hallo,

nehmen wir mal an, der User stellt den Monitor von Platz A auf Platz B und gleichzeitig ändert er den Gewichtswert (weil dieser falsch war) von C auf D.
Diese Werte schickst du beim "Senden" an dein Updatescript (es muss ja auch in der DB geändert werden). Was du nun machen solltest ist, dass du geschickten Werte einzeln verpackst (Array) (bzw. sie stehen ja sowieso schon als Array im $_POST) und mit einer foreach durchgehst und die Werte in einem einzelnen Query sammeln und direkt abschicken.
Bei solchen "Kleindaten" ist es mMn komplett egal, dass du für eine Wertänderung einen Query hast, statt ein "Queryset" (alles in einem Query). (+ so wird es einfacher aus dem mysql Log die Sachen herauslesen ZU KÖNNEN (nicht das dies notwendig oder empfehlenswert ist))

Da du nun in deiner foreach folgende Daten hast (haben solltest): id des Users, id des Inventargegenstandes und der geänderte Wert, kannst du auch einen SELECT Query auf die id schicken (+ dem Feld, was geändert werden soll) und die Werte vergleichen. Unterscheiden sie sich, kannst du den UPDATE SET Query losfeuern und dein Log schreiben. Wenn sie sich nicht unterscheiden: tue nichts, oder logge das auch. (nicht notwendig)

Als kleiner Logwrapper würde ich dir einfach einen CSV Wrapper empfehlen. Diese gibts zu hauf, - besonders dolle sind die Dinger nicht, aber ich nutze sie häufiger und aus einer schönen CSV kann man immer Daten rauslesen (und relativ einfach), also ist es auch möglich aus dem "log" einen "Html-Log" zu basteln. Einfach mal auf github suchen.

Was anderes;
Da meine Firma vor kurzem auch ein Inventarsystem gesucht hat und die Zeit gefehlt hat, es intern zu entwickeln, sind wir auf folgendes OpenSource Projekt gestoßen: GLPI. Das ist gut anpassbar und (fast komplett) auf deutsch übersetzt worden.

Denn: warum das Rad nochmal neu erfinden - es seidenn es ist rein zu Übungs,- und Lernzwecken.
 

eraser

Stinkstiefel

Registriert
21 Juli 2013
Beiträge
3.775
Mach doch einfach einen 1. Eintrag. Dann wenn jemand was dran ändern will, das zB in eine 2. Tabelle mit Änderungen. Dazu noch einen Timestamp und du hast genau das was du möchtest.

Würde mich übrigens wundern, wenn der code da oben funktioniert.
 

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
Die Originalwerte hast du doch in der Datenbank stehen und wenn etwas geändert wird, dann kannst du dir doch dazu speichern, was geändert wurde:

[src=text]tab_bildschirme
id name beschreibung standort_id preis anschaffung_datum mitarbeiter_id
------------------------------------------------------------------------------------

tab_standorte
id raum_id platz
--------------------

tab_raum
id stockwerk raum_nr
-------------------------

tab_mitarbeiter
id vorname nachname ....
-----------------------------[/src]

jetzt legst du eben noch eine Tabelle an, in der du changes speicherst:
[src=text]
tab_log
transaktions_id zeit nutzer_id transaktion rollback
---------------------------------------------------------[/src]

transaktion wäre dann etwa
UPDATE `bla` set a = "b" WHERE a = "a"
INSERT INTO `blup` (...)
DELETE FROM `blabla` WHERE e = f

rollback wäre immer der Umkehrbefehl:
UPDATE `bla` SET a = "a" WHERE a = "a"
DELETE FROM `blup` (...)
INSERT INTO `blabla (...)

Bei Änderungen musst du dir eben ein bisschen mehr Arbeit machen, aber das sollte ja kein so großes Problem sein.


Ich hoffe ich konnte deine Frage beantworten, bin mir aber nicht sicher, ob das ist, was du wissen wolltest.
 
Oben