Hi!
ich möchte einen vorhandenen Datensatz bearbeiten & speichern. Leider komme ich damit nicht klar.
Mit Hilfe der Affenformular-Technik lässt sich das effizient lösen. Du musst bedenken, dass du mehrere Requests an den Server hast, die du gezielt und teilweise anders bearbeiten musst. Da gibt es einen GET-Request: "zeig mir den Datensatz xy". Das Ergebnis ist ein Formular mit den Werten aus dem DBMS. Dieses Formular wird abgesendet und erzeugt einen POST-Request. Daran hast du vielleicht was auszusetzen, weil irgendwelche Werte nicht stimmen. In dem Fall ist die Antwort das Formular mit den vom Benutzer eingegebenen Werten. Das wiederholt sich, bis alles richtig ist, denn dann kannst du UPDATEen und wenn das fehlerfrei ablief am besten einen HTTP-Redirect senden, damit der Client per GET eine Ressource anfordert und so verhindert wird, dass beim Aktualisieren der Seite noch einmal das Formular abgesendet wird.
Und wenn dud das Ganze noch nach dem EVA-Prinzip aufbaust, also Eingabe, Verarbeitung und Ausgabe trennst, dann musst du auch das Formular nicht zweimal notieren.
Hier noch ein paar allgemeine Bemerkungen:
$query = "SELECT * FROM bericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);
Du hast hier eine Sicherheitslücke trotz mysql_real_escape_string(), weil du es falsch anwendest.
$result = mysql_query($query);
echo mysql_error();
$daten = mysql_fetch_array($result);
Ein Fehler ist nur dann aufgetreten, wenn dir das über den Rückgabewert von mysql_query() bekanntgegeben wurde. Werte diesen aus und reagiere entsprechend als einfach fortzufahren.
<input type="text" value="<?=$daten['DATUM']?>" readonly>
Input-Elemente können zwar auch einfach so im HTML-Text stehen, aber ohne ein Form-Element wirst du kein Formular absenden können. Und das war ja dein Ziel und nicht einfach nur die readonly-Anzeige.
$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
mysql_select_db( $db_name, $conID );
}
Wenn die Verbindung nicht funktioniert hat, darf auch der ganze Rest nicht ausgeführt werden, nicht nur nicht das Auswählen der Datenbank.
$sql = "UPDATE
bericht
SET ID = ".$_POST["ID"].", FEHLERZUSTAENDIGKEIT = ".$_POST["FEHLERZUSTAENDIGKEIT"].", KATEGORIE = ".$_POST["KATEGORIE"].", FEHLERPUNKTE = ".$_POST["FEHLERPUNKTE"]." WHEREID
='".$_POST["ID"]."'";
Wo ist hier deine kontextgerechte Behandlung der Werte und Absicherung gegen SQL-Injection?
mysql_query( $sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
Ob das Statement fehlerfrei bearbeitet werden konnte, sagt dir der Rückgabewert von mysql_query(). Den solltest du nie unausgewertet lassen. Wenn du anschließend noch wissen willst, ob ein Datensatz betroffen war, dann kannst du immer noch mysql_affected_rows() befragen.
echo "Der Datensatz wurde hinzugefügt!";
Wieso "hinzugefügt"? Du machst doch ein UPDATE, kein INSERT.
echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
Die Aussage ist zwar richtig, weil du ja ein UPDATE und kein INSERT machst, aber eigentlich ist sie auch wieder falsch, denn du prüfst nur ob _ein_ Datensatz betroffen ist. Wenn zwei oder mehr betroffen wären, tätest du auch so, als ob keiner bearbeitet wurde (abgesehen davon, dass das bei einem Unique-Index auf die Update-Bedingung nicht der Fall sein kann).
Lo!