Boolace: SQL: Update updated nicht.

Hallo, ich schon wieder.
Die Homepage ist fast fertig, versprochen. Ich hab ein Problem mit der MySQL-Funktion "UPDATE". Ich bin im Moment an einem Admincenter zum bearbeiten/löschen von GB-Einträgen, News, usw. Ich hänge an der GB-Update-Funktion:

Also ich rufe eine edit_gb.php auf in der die zur $id passenden Daten ausgelesen und in <input> Felder gepackt werden. Das funktioniert einwandfrei. Im <form>-Tag habe ich als Ziel "update_gb.php?id=$id" angegeben. So sieht meine gb_update aus:

$verbindung = @mysql_connect("","","");
$sql_statement = "UPDATE gaestebuch SET id = '".$_POST['id']."', datum = '".$_POST['datum']."', name = '".$_POST['name']."', ort = '".($_POST['ort'])."', titel = '".($_POST['titel'])."', eintrag = '".($_POST['eintrag'])."', email = '".($_POST['email'])."', homepage = '".($_POST['homepage'])."' WHERE id ='".$_POST['id']."';";
mysql_db_query("db", $sql_statement, $verbindung);
if (mysql_errno()) die ("Fehler: " . mysql_error());

Doch der Datensatz wird einfach nicht geupdated, Fehlermeldung kommt aber auch keine. Ich erwähnte ja bereits das Java meine Welt ist. Habe die Anweisung so geschrieben wie ich sie in Java schreiben würde und hab sie an PHP-Standarts angepasst (denke ich ;-)). Trotzdem funktioniert es nicht. Ist das nur ein Syntax-Fehler oder lieg ich komplett daneben?

Ich hoffe das ich in dieser genialen Community (schon wieder) Hilfe kriege. Irgendwann bin ich auch soweit, antworten zu posten, *ischschwöre*. Und: Wenn ihr ein Prob in Java habt, bin ich euer Mann :-).

Tausend dank,
Boolace

  1. Hi,

    $sql_statement = "UPDATE gaestebuch SET id = '".$_POST['id']."', datum = '".$_POST['datum']."', name = '".$_POST['name']."', ort = '".($_POST['ort'])."', titel = '".($_POST['titel'])."', eintrag = '".($_POST['eintrag'])."', email = '".($_POST['email'])."', homepage = '".($_POST['homepage'])."' WHERE id ='".$_POST['id']."';";

    unabhängig von deinem Problem: Wenn du nicht vorher $_POST durchgehst, und mysql_real_escape_string darauf anwendest, ist dein Skript gegen SQL-Injections anfällig.

    Schöne Grüße
    Julian

    1. unabhängig von deinem Problem: Wenn du nicht vorher $_POST durchgehst, und mysql_real_escape_string darauf anwendest, ist dein Skript gegen SQL-Injections anfällig.

      Sry, bin etwas langsam zu so später Stunde: $_POST wende ich doch an und wo bzw. wie setzte ich 'mysql_real_escape_string' an, mal davon ab: was bewirkt 'mysql_real_escape_string'?

      Danke.

      1. Hi,

        unabhängig von deinem Problem: Wenn du nicht vorher $_POST durchgehst, und mysql_real_escape_string darauf anwendest, ist dein Skript gegen SQL-Injections anfällig.

        Sry, bin etwas langsam zu so später Stunde: $_POST wende ich doch an und wo bzw. wie setzte ich 'mysql_real_escape_string' an, mal davon ab: was bewirkt 'mysql_real_escape_string'?

        stell dir vor, jemand tippt in das Eingabefeld deines Formulars einen SQL-(Teil-)Befehl. Du baust ihn in deinen ein. Er kann somit die Anfrage und die Inhalte deiner DB manipulieren. Eine genauere Erklärung gibts von den PHP-Menschen.
        mysql_real_escape_string() maskiert die Zeichen, die du in die Abfrage einbaust. So wird verhindert, dass jemand einen Befehl einschmuggeln kann, da alle Sonderzeichen, die dafür notwendig wären, maskiert werden.
        Dein momentanes Skript ist aufjedenfall eine Sicherheitslücke. Wenn du die Post-Werte nur für SQL-Anfragen verwendest, könntest du am Anfang deines Skripts sowas in der Art schreiben:

          
        function mysql_mask($array)  
        {  
            foreach ($array as $key=>$val)  
                if (is_array($array))  
                    $array[$key] = mysql_mask($val);  
                else  
                    $array[$key] = mysql_real_escape_string($val);  
            return($array);  
        }  
        $_POST = mysql_mask($_POST);  
        
        

        (ungetestet)

        Alternativ könntest du auch auf PDO von PHP5 umsteigen, das bietet elegantere Methoden.

        Schöne Grüße
        Julian

        1. echo $begrüßung;

          Vergiss bitte nicht, zu erwähnen, dass vorher noch die eventuell vorhandenen Magic Quotes entfernt werden müssen.

          echo "$verabschiedung $name";

          1. Hi dedlfix,

            echo $begrüßung;

            Vergiss bitte nicht, zu erwähnen, dass vorher noch die eventuell vorhandenen Magic Quotes entfernt werden müssen.

            zu spät ;) Es hat auch nichts mit dem Thema zu tun. Und es ist nicht sicherheitsrelevant. Sollte er damit mal Probleme haben, fällt ihm das sicher schnell auf.

            Schöne Grüße
            Julian

            1. echo $begrüßung;

              Vergiss bitte nicht, zu erwähnen, dass vorher noch die eventuell vorhandenen Magic Quotes entfernt werden müssen.

              zu spät ;) Es hat auch nichts mit dem Thema zu tun. Und es ist nicht sicherheitsrelevant.

              Oh doch. Der Magic-Quotes-Mechanismus soll nämlich genau das automatisch machen, was du hier vorgeschlagen hast. Und magic_quotes_gpc steht immer noch per default auf 1, also eingeschaltet.

              Sollte er damit mal Probleme haben, fällt ihm das sicher schnell auf.

              Oft wenn es bereits zu spät ist und im Gästebuch/Datenbank/Sonstwas unsinnige Backslashes enthalten sind. Man selber testet es nicht ausreichend, wenn man Anfänger ist und irgendwann kommt jemand daher, der einen Apostroph verwendet ...

              echo "$verabschiedung $name";

  2. Moin!

    Im <form>-Tag habe ich als Ziel "update_gb.php?id=$id" angegeben.

    Die ID steht dann in $_GET - auch bei der POST-Formularmethode.

    Verwende doch lieber ein Hidden-Formularfeld, dann passieren solche Überraschungen nicht, und alle Daten sind einheitlich in $_POST (oder $_GET).

    Der Hinweis zum Escaping aller benutzerdefinierten Daten ist UNBEDINGT ERNST ZU NEHMEN!

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!