Hi,
ich habe gerade ein wenig in meiner Datenbank herumgedocktert und bin nun an einen "Punkt" wo ich folgendes tue:
Wert aus Formular holen
Werte in UPDATE-Klausel eintragen und ausführen
-wenn erfolgreich... ok; wenn nicht:
Werte in INSERT-Klausel eintragen und ausführen
-wenn erfolgreich... ok; wenn nicht: Fehler.
Nun zum Problem, es ist in der Anwendung ungemein häufig der Fall, dass nichts geändert wird an den Daten, die mittels UPDATE aktualisiert werden, also die aktualisierten Daten waren schon aktuell.
In der PHP-Doku (php.net) steht dazu:
Anmerkung: 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.
Ergo erhalte ich völlig zu Recht aus mysql_affected_rows() eine null, wenn die Anfrage zwar gültig war und der Datensatz auch gefunden wurde, aber es nichts zu aktualisieren gab. Das Blöde ist nur, _dann_ will ich ja kein INSERT machen, sondern die Zeile unberührt lassen (oder meinetwegen mit den neuen-alten Daten überschreiben).
Die Frage ist also, wie stelle ich am geschicktesten fest, ob das UPDATE deshalb erfolglos war, weil die Daten gleich geblieben sind, oder weil es den Datensatz einfach nicht gibt.
Hier noch der Code (gekürzt):
<?php
if (isset($_POST['input'])) {
$html = $html."\n\n\n\n\n<!--\n\n";
$input = $_POST['input'];
escape_mysql($input); //eigene Funktion, die den ganzen array mysql-escaped.
$input['id'] = (int)$input['id'];
foreach ($input as $key => $value) {
if ($key != 'id') {
if (!isset($value['ignore'])) {
// (...) ein paar Änderungen/Prüfungen der $input-Werte auf Plausibilität etc.
$sql = "UPDATE `".$Tabelle."` SET (...) WHERE `id` = '".$key."' LIMIT 1 ;";
$html = $html."\n$sql";
if (mysql_query($sql)) { if (mysql_affected_rows() > 0) { $Update_erfolg = TRUE; } } else { $Update_erfolg = FALSE; }
if ($Update_erfolg) {
$html = $html."\nUPDATE ERFOLG!!!\n\n\n";
} else {
$html = $html."\nUPDATE war nix:\n".mysql_error();
$sql = "INSERT INTO `".$Tabelle."` ( (...) ) VALUES ( (...) ) ; ";
$html = $html."\n$sql";
if (mysql_query($sql)) { if (mysql_affected_rows() > 0) { $Insert_erfolg = TRUE; } } else { $Insert_erfolg = FALSE; }
if ($Insert_erfolg == TRUE) {
$html = $html."\nINSERT erfolgt\n\n\n";
} else {
$html = $html."\nINSERT missglückt \n".mysql_error()."\n\n\n\n";
}
}
}
}
}
$html = $html."\n\n\n\n\n-->\n\n";
}
echo ($html);
?>