PHP/mysql veränderte werte checken?
Stefan
- php
0 Tom0 Thomas Luethi0 Stefan
Hi,
ich möchte in einem Editformular die Möglichkeit bieten, Werte innerhalb einer mysql tabelle zu ändern.
In eine andere Tabelle soll aber der Edit protokolliert werden.
Klappt prima.
Falls ich zusätzlich auch protokollieren möchte, welche Felder beim jeweiligen Edit geändert wurden, muß ich dazu bei jedem Feld Originalinhalt mit dem Inhalt nach Versenden des Formulars vergleichen oder gibts da eine einfachere Möglichkeit?
Danke und Grüße
Stefan
Hello,
Falls ich zusätzlich auch protokollieren möchte, welche Felder beim jeweiligen Edit geändert wurden, muß ich dazu bei jedem Feld Originalinhalt mit dem Inhalt nach Versenden des Formulars vergleichen oder gibts da eine einfachere Möglichkeit?
Nein, die gibt es nicht, da die Sicherheitszone erst wieder auf dem Server beginnt...
Beim Absenden des Forms vom Server an den Client unter einer FORM-ID alle Daten in ein Array in der Session schreiben. Wenn das Form vom Client zurückkommt, schauen ob die Form-ID da ist und dann die Daten mit foreach() oder sogar durch Arrayvergleich vergleichen.
Das geht bei einigermaßen geschickter Programmierung alles mit wenigen Zeilen.
Ich habe mir, seit ich an der Idee bastele angewöhnt, alle Daten im Formular folgendermaßen zu strukturieren:
<input type="txt" name="data[vorname] ...>
<input type="txt" name="data[nachname] ...>
<input type="submit" name="ctrl[speichern] ...>
<input type="submit" name="ctrl[loeschen] ...>
Do landen nachher alle Daten im Array $_POST["data"][...]
und alle nicht zu speichernden Größen in $_POST["ctrl"][...]
Nun könnte man noch einen Schritt weiter gehen und die Datenarrays auch noch nach der Bindung an die Tabelle bezeichnen, falls in einem Formular Daten für mehrere Tabellen gehandelt werden.
Grüße
Tom
Ich habe mir, seit ich an der Idee bastele angewöhnt, alle Daten im Formular folgendermaßen zu strukturieren:
<input type="txt" name="data[vorname] ...>
<input type="txt" name="data[nachname] ...><input type="submit" name="ctrl[speichern] ...>
<input type="submit" name="ctrl[loeschen] ...>
Hi Tom,
guet Idee!
Naja, bei mir ist es nicht wirklich wichtig, die geänderten Felder zu wissen, es wäre halt ein zusätzliches nettes Feature gewesen, das nun wegbleibt :-)
Danke
Stefan
Hello,
array_diff() und array_diff_assoc sind für Dich nicht so toll brauchbar.
Da müsste man über eine foreach-Schleife testen. Fragt sich jetzt nur, was passiert, wenn die zu vergleichenden Werte im Satzpuffer-Out und im Satzpuffer-In selber Arrays sind.
<?php ####arraydiff.php ####
$array1 = array ("a" => "grün", "rot", "blau", "rot");
$array2 = array ("b" => "grün", "gelb", "rot");
$result1 = array_diff ($array1, $array2);
$result2 = array_diff_assoc ($array1, $array2);
echo "<pre>";
print_r($array1);
print_r($array2);
print_r($result1);
print_r($result2);
echo "\nVergleich:\n\n";
foreach($array1 as $key => $val)
{
if ($val != $array2[$key]) echo "[".$key."] => ".$val." -> ".$array2[$key]."<br />\n";
}
echo "</pre>";
?>
Grüße
Tom
Hallo,
In eine andere Tabelle soll aber der Edit protokolliert werden.
Du sprichst eine komische Sprache.
"Der Edit" existiert in meinem Wortschatz leider nicht.
Wie heissen Deine Tabellen und ihre Felder (Spaltennamen)?
Wieviele Felder willst Du in der betreffenden Tabelle aendern?
Falls ich zusätzlich auch protokollieren möchte, welche Felder beim jeweiligen Edit geändert wurden, muß ich dazu bei jedem Feld Originalinhalt mit dem Inhalt nach Versenden des Formulars vergleichen oder gibts da eine einfachere Möglichkeit?
Wenn Du schauen willst, ob eine UPDATE-Query ueberhaupt
eine oder mehrere Zeilen effektiv veraendert hat, kannst
Du das mit mysql_affected_rows() feststellen.
http://www.mysql.com/doc/en/mysql_affected_rows.html
"Zero indicates that no records where updated for
an UPDATE statement, [...]"
http://www.php.net/manual/de/function.mysql-affected-rows.php
"Benutzen Sie UPDATE wird MySQL keine Spalten aktualisieren,
bei denen der neue dem alten Wert entpspricht.
Das kann dazu führen, dass mysql_affected_rows() nicht die tatsächliche Anzahl der betroffenen Zeilen liefert, sondern
nur die, die wörtlich durch die Anfrage betroffen sind."
=> Das bedeutet eben, dass wenn die Werte sind wie vorher,
mysql_affected_rows() als Resultat 0 (Null) zurueckgeben wird.
--
Oder Du koennest auch gleich das Resultat von UPDATE auswerten:
http://www.mysql.com/doc/en/UPDATE.html
"UPDATE returns the number of rows that were actually changed."
--
Wenn das beides nicht den gewuenschten Effekt zeigt,
d.h. wenn auch bei gleichbleibenden Werten angegeben
wird, es haetten sich gewisse Zeilen veraendert,
dann kannst Du es mit einer TIMESTAMP-Spalte versuchen.
Diese wird wirklich nur dann aktualisiert, wenn effektiv
ein neuer Wert geschrieben wird:
http://www.mysql.com/doc/en/DATETIME.html
"Note that an UPDATE that sets a column
to the value it already has will not cause
the TIMESTAMP column to be updated, because
if you set a column to its current value,
MySQL ignores the update for efficiency."
Du koenntest also vor und nach dem Update die TIMESTAMPs
auslesen und diese vergleichen, um festzustellen,
ob ueberhaupt eine Aenderung stattgefunden hat.
HTH, Gruesse,
Thomas
Hallo,
In eine andere Tabelle soll aber der Edit protokolliert werden.
Du sprichst eine komische Sprache.
"Der Edit" existiert in meinem Wortschatz leider nicht.
Hi Thomas,
Schon möglich, aber ich denke, Du bist flexibel genug, zu erkennen, was ich meine.
Wobei, Du hast mir eine Antwort geschrieben, die eigendlich darauf schließt, daß Du nicht wußtest, was ich meine :-)
Egal, umso netter, daß Du Dir trotzdem diese große Mühe gemacht hast. Danke dafür :-)
Habe viel aus Deiner Antwort gelernt, was ich aber meinte, war weniger, ob wirklich eine Änderung der Tabellenfelder stattgefunden hat, sondern welche der Tabellenfelder tatsächlich geändert wurden.
Und das ist wohl wirklich nur über das Vergleichen der Feldinhalte per php möglich.
Nochmal Danke an Dich
Stefan