Vinzenz Mai: Datenbank updaten

Beitrag lesen

Hallo Alex,

wie ich euch vom mitlesen kenne, habt ihr mir mit Sicherheit schon einen Hinweis gegeben, wo das Problem liegt. Nur sprecht ihr in Rätseln für mich. Ich fühl mich einfach nur geprügelt für den schlechten Code ohne in euren Antworten eine Lösung für mein Problem zu sehen.

Dein relevanter Codeabschnitt für Bearbeiten ist der folgende:

  
elseif ($status == "Bearbeiten") {  
 $query = "UPDATE blog SET  
         eintrag = '$eintrag', kurzeintrag = '$kurzeintrag' WHERE id = $id";  
 $sql = mysql_query($query);  
 unset($id, $datum, $eintrag, $kurzeintrag);  
}  

a) Du behandeltst keinen einzigen der Eingabewerte mit
   mysql_real_escape_string().

Was passiert, wenn ein problematisches Zeichen, wie z.B. ein einfaches
   Anführungszeichen in $_POST['eintrag'] oder $_POST['kurzeintrag'] steht?

Logge daher den Inhalt von $sql in einer Datei mit

b) Du überprüfst nicht den Rückgabewert von mysql_query().
   Wie willst Du feststellen, ob die Datenbankoperation erfolgreich war.
   Prüfe und logge daher den Rückgabewert von mysql_query() buw. mysql_error().

Bei unverändertem Code (außer dem Log-Mechanismus) solltest Du nun feststellen
können, wann das Update fehlschlägt und im dazugehörigen SQL-Statement ggf. auch den Fehler finden können. Das ist eine normale Debug-Strategie.

Leicht abgeänderter Code:

  
elseif ($_POST['status'] == "Bearbeiten") {  
    $query = "UPDATE blog SET  
                  eintrag = '" . mysql_real_escape($_POST['eintrag']) . "',  
                  kurzeintrag = ' . mysql_real_escape($_POST['kurzeintrag']) . "'  
              WHERE id = ' . mysql_real_escape($_POST['id']) . "'";  
  
    // [link:http://www.php.net/manual/de/function.sprintf.php@title=sprintf()] ist eine lesbarere Alternative zu solchen  
    // zusammengebauten Zeichenketten:  
    $query = sprintf(  
        "UPDATE blog SET  
            eintrag = '%s',  
            kurzeintrag = '%s'  
        WHERE  
            id = '%s'",  
        mysql_real_escape($_POST['eintrag']),  
        mysql_real_escape($_POST['kurzeintrag']),  
        mysql_real_escape($_POST['id'])  
    );  
    // Beachte, dass Du im SQL-Dialekt von MySQL auch Zahlen in einfache  
    // Anführungszeichen setzen kannst - und bei Benutzereingaben auch solltest.  
  
    if ($success = mysql_query($query)) === false) {  
        // Fehler aufgetreten  
        // Logge geeignet $query und mysql_error();  
        // Gebe Dir eine Rückmeldung, dass ein Fehler aufgetreten ist.  
    }  
    else {  
        // Update erfolgreich durchgeführt  
        // Überflüssig, da nicht umkopiert:  
        // unset($id, $datum, $eintrag, $kurzeintrag);  
        // Du solltest allerdings dem Benutzer (also Dir selbst) eine  
        // Rückmeldung geben  
    }  
}  

Du siehst hier sofort, dass die Daten in der Abfrage aus potentiell gefährlicher Quelle stammen. Die Daten wurden ordnungsgemäß für die SQL-Schnittstelle maskiert, es kann nichts Schlimmes passieren.

Hübscher wäre es mit der verbesserten MySQL-Erweiterung mysqli, die entgegen der Warnung auf der deutschen Handbuchseite nicht mehr experimentell ist, und Prepared Statements, siehe mysqli_prepare(). Beachte, dass die Parameter getrennt vom Statement übermittelt werden und sich MySQL selbst um die fachgerechte Aufbereitung der Parameter kümmert.

Freundliche Grüße

Vinzenz