Mysql UPDATE syntax in Php Datei



  • Hallo,

    Vieleicht könnt ihr mir sagen was hier nicht stimmt:

    <?php
    require ('config.php');
    
    $username = $_POST['username'];
    $passwort = md5($_POST['passwort']);
    
    $abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_array($ergebnis);
    if($row['passwort'] == $passwort)
        {
    $update =    "UPDATE
        login
    SET
        online = 1,
    WHERE
        username = '$username'";
    
    mysql_query($update);
    
        echo 'klappt!';
        }
    else 
    {
    echo 'Klappt nicht!';
    }
    ?>
    

    Er bringt mit immer die Meldung klappt allerdings wird nichts neues in der DB eingetragen 😕 😕 😕

    mfg



  • 1. Google mal nach SQL-Injection .
    2. Wieso sollte er etwas neues Eintragen? Google mal den Unterschied zwischen INSERT und UPDATE .
    3. Google mal nach mysql_error() .



  • Hallo,

    SQL injektion ist mir ein Begriff und kommt alles wenn alles soweit funktioniert!
    In der DB steht bei online 0 und die soll auf 1 gesetzt werden

    ich möchte einfach nur Wissen warum er das nicht "updatet" habe ich ein falschen Syntax genommen?

    mfg



  • árn[y]ék schrieb:

    3. Google mal nach mysql_error() .



  • Ja das kenn ich auch...
    habe da jetzt den syntax eingebaut

    und es liegt am WHERE syntax

    WHERE
        username = '$username'
    

    Allerdings verstehe ich nicht was ich da falsch gemacht habe

    EDIT:
    Die FEHLERMELDUNG:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE username = 'kimserver'' at line 5
    


  • Dann schau dir nochmal die SQL-Syntax an.
    Achte insbesondere mal darauf, ob da nicht vielleicht irgendwo ein Komma in deiner Abfrage ist, wo keines hingehört ...

    😉



  • Hallo,

    Ehrlich gesagt komme ich überhauot nicht weiter der code sieht jetzt so aus:

    <?php
    require ('config.php');
    error_reporting(E_ALL);
    
    $username = $_POST['username'];<!--Hier sagt er mir das er ein fehler hat (at line 5 -->
    $passwort = md5($_POST['passwort']);
    
    $abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_array($ergebnis);
    if($row['passwort'] == $passwort)
        {
    $update =    "UPDATE
        login
    SET
        online = '1',
    WHERE
        username = $username";
    
    mysql_query($update);
    
        echo 'klappt!';
        echo 'Fehler: '. mysql_error();
        }
    else 
    {
    echo 'Klappt nicht!';
    }
    ?>
    

    bitte helft mir noch einwenig auf die Sprünge

    EDIT: Dazu nochmal die Fehlermeldung:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE username = kimserver' at line 5
    


  • árn[y]ék schrieb:

    Dann schau dir nochmal die SQL-Syntax an.
    Achte insbesondere mal darauf, ob da nicht vielleicht irgendwo ein Komma in deiner Abfrage ist, wo keines hingehört ...

    😉

    !!

    online = 1, <-



  • Hallo,

    so schnell geht es schief

    ein kleiner fehler riesen auswirkung ja das habe ich komplett übersehen danke!

    es funktioniert jetzt endlich richtig!



  • Hallo,

    noch 2 Anmerkungen.
    1. PHP-Kommentare sehen so "//" oder so "/* */" aus, niemals so "<!-- -->". Letzteres ist HTML und würde in deinem Code den Fehler "Parse error: syntax error, unexpected '<' in blabla.php on line x".
    2. Wieso machst du in deinem SQL-Statement eine LIKE-Abfrage die am Ende eh nur auf "=" hinausläuft? LIKE ist meines Erachtens nach langsamer als "=".

    VlG



  • Da LIKE Volltext-Suche ist, ist dies auch wirklich langsamer! Um wie viel kommt darauf an ob das Feld, nach dem gesucht wird, Indexiert ist 🙂

    Nebenbei zählt die Aussage, ich kümmere mich um SQL-Injection wenn alles fertig ist sowas von überhaupt nicht. Entweder man macht es von Anfang an richtig und maskiert entsprechend mit mysql_real_escape_string() oder man lässt es sein, bzw. vergisst dann den ein oder anderen Parameter oder das ein oder andere Statement zu prüfen.

    Dabei auch noch zu erwähnen, wie es dir in jedem guten PHP Forum auch geraten würde: Lass die Finger von der mysql Extension und nutz die mysqli. Diese bietet dir "prepared statements", wodurch man SQL-Injections schon ganz gut verhindern kann. Außerdem wird diese auch noch weiterentwickelt, die normale mysql Extension wird nicht mehr entwickelt und Sicherheitslücken/Fehler, wenn überhaupt nur langsam geschlossen.



  • Hallo,

    Also ich gehe Schritt für Schritt vor und da ich die Datein immer errst Lokal teste bevor ich sie irgendwann online setzte baue ich die SQLinjektion immer erst zum Schluss ein aber bevor man sich hier Streitet jeder macht es anders und ich werde zu dem Thema sql injektion nix mehr sagen 😉

    mfg

    Edit:

    und ausserdem wird von dem Benutzer da keine angabe gemacht bei dem UPDATE befehl daher denke ich das ich da keine sql injektion benötige



  • Dazu brauchst du nichts sagen, aber lass dir vielleicht eines gesagt sein:
    Mit diesem Verfahren wirst du bei nur etwas komplexeren Skripten und natürlich in jedem halbwegs anspruchsvollen Umfeld gehörig auf die Schnauze fliegen 😉



  • derdefeckter schrieb:

    und ausserdem wird von dem Benutzer da keine angabe gemacht bei dem UPDATE befehl daher denke ich das ich da keine sql injektion benötige

    Bitte was?
    Schau dir deinen Code nochmal an. Wenn du mir dann wirklich sagst, da gäbe es kein Einfallstor, deine komplette Datenbank mit einem Einzeiler zu hacken, dann lies dich dringend noch einmal in die Thematik ein!!!

    P.s. Aus deiner Artikulation und deiner Verwendung des Begriffs glaube ich inzwischen, dass du überhaupt keine Ahnung hast, was eine SQL Injection überhaupt ist ...



  • Ja das war ein fehler von mir 🤡

    der username wird da ja verwendet also sql injektion werde ich mich schnell drum kümmern kleine fehler riesen auswirkung

    naja wie schon in anderen posts erwähnt ich lasse mich gerne eines besseren belehren! ob ich es dann auch amche ist ne andere sache...

    naja danke erstmal

    EDIT:

    Doch SQLINJEKTION ist mir ein Begriff in früheren Posts wurde ich da auch drauf hingewiesen seitdem verwende ich da fast überall zumindest bei jedem sql befehl



  • Eine SQL-Injection ist der Vorgang, eine Sicherheitslücke in der Datenbankschnittstelle einer Anwendung ausnutzen. Man kann keine "SQL-Injection" haben, benötigen oder verwenden. Man kann eine Sicherheitslücke in seinem Code haben, die zur Möglichkeit führt, eine SQL-Injection am Code vorzunehmen. Und man kann via SQL-Injection fremde Datenbanken manipulieren ("hacken").

    Vermutlich meinst du nicht "ich verwende SQL-Injections" sondern "ich escape meine Parameter". Oder so etwas ...



  • Ja so meinte ich es eigentlich also ich habe den code nochmal bearbeitet und sieht jetzt so aus:

    $abfrage = "SELECT username, passwort, userlevel FROM login WHERE username LIKE '$username' LIMIT 1",
     mysql_real_escape_string($username);
    

    so ich denke damit sollte es klappen

    EDIT:
    achso hier auch nochmal:

    $update =    "UPDATE
        login
    SET
        online = '1'
    WHERE
        username = '$username'",
        mysql_real_escape_string($username);
    


  • Autsch. Das wird vom Interpreter übersetzt? Dieser Komma-Operator war mir noch nie ganz geheuer ...

    Das ist so Unsinn, was du machst.

    So in etwa muss es richtig heißen:

    ?php 
    require ('config.php'); 
    error_reporting(E_ALL); 
    
    $username = $_POST['username'];<!--Hier sagt er mir das er ein fehler hat (at line 5 --> 
    $passwort = md5($_POST['passwort']); 
    
    $abfrage = "SELECT username, passwort FROM login WHERE username ='".mysql_real_escape_string($username)."' LIMIT 1"; 
    $ergebnis = mysql_query($abfrage); 
    $row = mysql_fetch_array($ergebnis); 
    if($row['passwort'] == $passwort) 
        { 
    $update =    "UPDATE 
        login 
    SET 
        online = '1' 
    WHERE 
        username = '".mysql_real_escape_string($username)."'"; 
    
    mysql_query($update); 
    
        echo 'klappt!'; 
        } 
    else 
    { 
    echo 'Klappt nicht!'; 
    } 
    ?>
    


  • okeee also hatte eben noch gegooglet gehabt um mir denn syntax noch mal genau anzugucken und habe dort das gefunden:

    [url]
    http://www.hpserver.de/php/function.mysql-real-escape-string.html
    [/url]
    da habe ich mir von beispiel 1 übernommen

    naja wie gesagt da lasse ich mich gerne des besseren belehren und werde es sofort ändern



  • Im Beispiel wird aber auch sprintf verwendet, um den String zu formatieren! Was du dort siehst ist quasi ein Workaround für Prepared Statements.

    Kopiere niemals einfach irgendwelche Mini-Bestandteile aus fremdem Code heraus, wenn du keinen Schimmer hast, wie sie im Kontext funktionieren 😉


Anmelden zum Antworten