Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Update Problem

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Update Problem

    Hallo

    Ich habe wieder eine Frage zu ein kleinen Problem das ich nicht wegbekomme, und zwar probier ich bei einer Seite ( user editieren) ein Update set zu schreiben, bekomme allerdings trotz richtiger Ausgabe der Variablen zu den Spalten eine Fehlermeldung .

    Hier der Code :
    PHP-Code:
    if ($_POST['abgesendet'] == "1")
    {
    echo 
    "Eintrag geändert";
    $aendern "UPDATE user Set
    user = '
    $username',
    nickname = '
    $nickname',
    passwort = '
    $passwort',
    mail = '
    $mail',
    vorname = '
    $vorname',
    nachname = '
    $nachname',
    geburstdatum = '
    $geburtsdatum',
    icq = '
    $icq',
    msn = '
    $msn',
    adminkommentar = '
    $adminkommentar',
    level = '
    $level',
    WHERE id = 
    $id";
    $update mysql_query($aendern)
        OR die(
    "Error: $aendern <br>".mysql_error());

    Die Fehlermeldung dazu ist folgende:
    PHP-Code:
    You have an error in your SQL syntaxcheck the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 19' at line 12 
    Hab das schon mal neugeschrieben und probiert den Fehler zu finden aber es passt eigentlich alles ( zum. aus meiner Sicht )

    Würd mich um eine hilfreiche Antwort freuen

  • #2
    Du darfst vor einer WHERE Bedinung kein , mehr setzen.

    Also die Zeile:
    Code:
    level = '$level',
    muss so lauten
    Code:
    level = '$level'
    Ausserdem ist dein Script anfällig auf SQL Injection!

    Kommentar


    • #3
      OK danke werd mir das Thema zu SQL Injections auch noch anschauen

      Kommentar


      • #4
        Gibts irgendwelche Tutorial zu SQL INjections oder eine kurze Anleitung

        Kommentar


        • #5
          Das weiß ich jetzt nicht genau, aber auf der verlinkten Seite in #2 sind auch Gegenmaßnahmen-Beispiele...

          Aber Google hilft da auch weiter: Let me google that for you

          Kommentar


          • #6
            Gut danke schon ma

            Kommentar


            • #7
              Dann bitte noch das Thema als [Erledigt] markieren. Danke.

              Kommentar


              • #8
                Eine Frage vielleicht noch an dich

                habe jetzt herausgefudnen das gegen injection mysql escape helfen soll

                ist das so richtig wie ich das gemacht hab ... ?
                PHP-Code:
                if ($_POST['abgesendet'] == "1")
                {
                echo 
                "Eintrag geändert";
                $aendern "UPDATE user Set
                user = '
                $username',
                nickname = '
                $nickname',
                passwort = '
                $passwort',
                mail = '
                $mail',
                vorname = '
                $vorname',
                nachname = '
                $nachname',
                geburstdatum = '
                $geburtsdatum',
                icq = '
                $icq',
                level = '
                $level'
                WHERE id = 
                $id";

                mysql_real_escape_string($id);

                $update mysql_query($aendern)
                    OR die(
                "Error: $aender <br>".mysql_error());

                Kommentar


                • #9
                  Nein das ist völlig falsch.

                  Schlag die Funktion doch mal im Manual nach.

                  Du kannst nur die Eingaben Escapen, andernfals - so wie du das gemacht hast - wird aus einer funktionsfähigen Abfrage eine unbrauchbare...

                  Kommentar


                  • #10
                    Du übergibst mysql_real_escape_string() eine potentiell für das SQL-Statement gefährliche Zeichenkette und erhälst als Rückgabewert eine abgesicherte Zeichenkette zurück. Diese kannst Du dann gefahrlos in Deinem SQL Statement verwenden. Und das musst Du für alle Parameter machen, die als Zeichenkette in das Statement einfließen.

                    PHP-Code:
                    <?php
                    if ( isset($_POST['abgesendet']) && '1'==$_POST['abgesendet'] )
                    {
                      
                    $mysql mysql_connect('..''..''..') or die(mysql_error());
                      
                    mysql_select_db('..'$mysql) or die(mysql_error());
                      
                    $aendern "
                        UPDATE
                          user
                        SET
                          user = '" 
                    mysql_real_escape_string($_POST['username'], $mysql) . "',
                          nickname = '" 
                    mysql_real_escape_string($_POST['nickname'], $mysql) . "',
                          passwort = '" 
                    mysql_real_escape_string($_POST['passwort'], $mysql) . "',
                          mail = '" 
                    mysql_real_escape_string($_POST['mail'], $mysql) . "',
                          vorname = '" 
                    mysql_real_escape_string($_POST['vorname'], $mysql) . "',
                          nachname = '" 
                    mysql_real_escape_string($_POST['nachname'], $mysql) . "',
                          geburstdatum = '" 
                    mysql_real_escape_string($_POST['geburstdatum'], $mysql) . "',
                          icq = '" 
                    mysql_real_escape_string($_POST['icq'], $mysql) . "',
                          level = '" 
                    mysql_real_escape_string($_POST['level'], $mysql) . "'
                        WHERE
                          id = '" 
                    mysql_real_escape_string($_POST['id'], $mysql) . "'
                      "
                    ;
                      
                    $update mysql_query($aendern$mysql)
                        or die(
                    "Error: $aender <br />".mysql_error());
                        
                      echo 
                    'Anzahl geänderter Datensätze: 'mysql_affected_rows($mysql), "<br />\n";
                    }

                    Kommentar


                    • #11
                      Ok Super klasse

                      Hab dazu jetzt ein paar Fragen damit ich den Sinn hinter paar Sachen verstehe

                      1 Frage :
                      PHP-Code:
                      if ( isset($_POST['abgesendet']) && '1'==$_POST['abgesendet'] ) 
                      das ist doch genau das selbe wie

                      PHP-Code:
                      if ($_POST['abgesendet'] == "1"
                      weil isset überprüft ob eine Variable übergeben worden ist, daher aber nur 1 übergeben werden kann das doch meine if abfrage genau das selbe oder irre ich mich ?

                      2 Frage :
                      Daher die ID nicht im Formular abgefragt wird daher es ein auto increment feld ist, kann ich das wahrscheinlich auch so schreiben
                      PHP-Code:
                            id '" . mysql_real_escape_string($id, $mysql) . " 
                      3 Frage :
                      Die Seite user_editieren.php liegt im Admin Center und es wird per Session abgefragt ob er berechtigt ist das zu sehen, braucht man da trotzdem den mysql_real_escape_string ? weil so denk ich mir zumindest kann er ja gar nicht auf die Seite zugreifen und somit kann er ja auch keine SQL Injection machen ... falsch ?

                      Ansonsten vielen Dank für deine Hilfe ghab das so eingebaut und hat super geklappt ....

                      Kommentar


                      • #12
                        Frage 1: Es kann auch sein, dass der Parameter garnicht gesendet wird. Dann erzeugt PHP für if ($_POST['abgesendet'] == "1") eine E_NOTICE-Meldung "undefined index abgesendet".

                        Frage 2: Nein, wenn Du mysql_real_escape_string verwendest, musst Du den Parameter als Zeichenkette an MySQL übergeben, also in Anführungszeichen. Sonst musst Du sicherstellen, dass es sich wirklich um eine Zahl handelt. Zum Beispiel per "... id=".(int)$_POST['id']; Dann kann zwar auch keine Injection entstehen, aber es gibt bei MySQL Ganzzahl-Typen die größere Zahlen aufnehmen können als der php-Integer.

                        Frage 3: Ja, sql injections müssen nicht absichtlich böse sein. Ohne mysql_real_escape_string (oder eine vergleichbare Funktion) kannst Du keine ' in die Datenbank eintragen. Sämtliche O'Connors der Welt werden Dir dafür dankbar sein mysql_real_escape_string ist bei mysql_query nicht optional.

                        Kommentar


                        • #13
                          Gut danke für die Hilfe

                          Kommentar

                          Lädt...
                          X