bernd: mysql_query richtig escapen

Sehr geehrte Damen und Herren,

Ich mache gerade ein Formular, über welches Daten in eine Datenbank eingespeist werden sollen.

Nun scheitere ich bisher an dem mysql_query für die Datenübergabe vom Formular an die mysql datenbank.

$eingabe = mysql_query("insert into kunden values("$_POST['geschlecht'],$_POST['name'],$_POST['vorname'],'25'"),$connect);

Mach ich was beim escapen falsch und muss ich die Felder angeben vor values, oder nur wenn es bestimmte Felder sind???

mit besten Grüßen

Bernd

  1. Mahlzeit,

    $eingabe = mysql_query("insert into kunden values("$_POST['geschlecht'],$_POST['name'],$_POST['vorname'],'25'"),$connect);

    Richtiger und IMHO besser (weil übersichtlicher):

      
    $query = sprintf("INSERT INTO kunden VALUES ('%s', '%s', '%s', '25')",  
                     htmlspecialchars($_POST['geschlecht']),  
                     htmlspecialchars($_POST['name']),  
                     htmlspecialchars($_POST['vorname']));  
    $eingabe = mysql_query($query, $connect);
    

    Mach ich was beim escapen falsch

    Ja.

    und muss ich die Felder angeben vor values, oder nur wenn es bestimmte Felder sind???

    Nur wenn Du nicht alle Felder mit Werten füllen willst (weil das DBMS dann ja nicht weiß, welche Du meinst). Wenn in alle Felder etwas reinschreiben willst, kannst Du auch nur die Werte in der Reihenfolge, in der die Felder in der Tabelle existieren, angeben - das DBMS ordnet das dann automagisch richtig zu.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Tach auch,

      danke für die Antwort, es klappt auch aber ich versteh die Technik noch nich ganz.

      Lies mir erstmal sprintf durch auf php.net durch.

      Richtiger und IMHO besser (weil übersichtlicher):

      $query = sprintf("INSERT INTO kunden VALUES ('%s', '%s', '%s', '25')",
                       htmlspecialchars($_POST['geschlecht']),
                       htmlspecialchars($_POST['name']),
                       htmlspecialchars($_POST['vorname']));
      $eingabe = mysql_query($query, $connect);

        
        
      
      > Nur wenn Du nicht alle Felder mit Werten füllen willst (weil das DBMS dann ja nicht weiß, welche Du meinst). Wenn in alle Felder etwas reinschreiben willst, kannst Du auch nur die Werte in der Reihenfolge, in der die Felder in der Tabelle existieren, angeben - das DBMS ordnet das dann automagisch richtig zu.  
        
      sowas hatte ich vermutet.Danke  
        
      meld mich später hier nochmal.  
        
      mbg bernd  
      
      
      1. Moin!

        Tach auch,

        danke für die Antwort, es klappt auch aber ich versteh die Technik noch nich ganz.

        Bitte unbedingt beachten: https://forum.selfhtml.org/?t=171387&m=1121861

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
    2. Moin!

      $query = sprintf("INSERT INTO kunden VALUES ('%s', '%s', '%s', '25')",
                       htmlspecialchars($_POST['geschlecht']),
                       htmlspecialchars($_POST['name']),
                       htmlspecialchars($_POST['vorname']));
      $eingabe = mysql_query($query, $connect);

      
      >   
      >   
      > > Mach ich was beim escapen falsch  
      >   
      > Ja.  
        
      Du aber auch. htmlspecialchars ist die FALSCHE Escapefunktion!!!  
        
      Korrekt ist mysql\_real\_escape\_string(). Oder das entsprechende Äquivalent von mysqli.  
        
      
      > > und muss ich die Felder angeben vor values, oder nur wenn es bestimmte Felder sind???  
      >   
      > Nur wenn Du nicht alle Felder mit Werten füllen willst (weil das DBMS dann ja nicht weiß, welche Du meinst). Wenn in alle Felder etwas reinschreiben willst, kannst Du auch nur die Werte in der Reihenfolge, in der die Felder in der Tabelle existieren, angeben - das DBMS ordnet das dann automagisch richtig zu.  
        
      Es ist immer eine sehr SCHLECHTE Idee, ein SQL-Statement ohne Angabe der konkret gemeinten DB-Felder zu schreiben, weil man sich damit in die Abhängigkeit vom DB-Layout begibt. Wird durch die kleinste Änderung am Layout was verändert, muß man alle Querys nochmal abändern, selbst wenn sie eigentlich gar nicht betroffen wären, andernfalls erhält man großen Datenmüll.  
        
      Abgesehen davon ist es auch immer eine sehr gute Idee, wenn man sich durch explizites Aufführen der DB-Felder im Query vor Augen führt, welche Felder da tatsächlich benutzt werden. Das verhindert viele Bugs schon von vornherein, beispielsweise wenn die DB sich über einen falschen Datentyp beschwert, und man unabsichtlich irgendein altes Layout im Kopf hatte, dessen Feldreihenfolge schon lange nicht mehr stimmt.  
        
       - Sven Rautenberg
      
      -- 
      "Love your nation - respect the others."
      
      1. Mahlzeit,

        Mach ich was beim escapen falsch

        Ja.

        Du aber auch. htmlspecialchars ist die FALSCHE Escapefunktion!!!

        Argl - war mit meinen Gedanken noch woanders. Richtig ist natürlich mysql_real_escape_string().

        Korrekt ist mysql_real_escape_string(). Oder das entsprechende Äquivalent von mysqli.

        Ja, hast recht. Ich sollte weniger multitasken - Männer können sowas ja nicht. :-)

        Abgesehen davon ist es auch immer eine sehr gute Idee, wenn man sich durch explizites Aufführen der DB-Felder im Query vor Augen führt, welche Felder da tatsächlich benutzt werden. Das verhindert viele Bugs schon von vornherein, beispielsweise wenn die DB sich über einen falschen Datentyp beschwert, und man unabsichtlich irgendein altes Layout im Kopf hatte, dessen Feldreihenfolge schon lange nicht mehr stimmt.

        Kam vielleicht nicht so rüber - aber ich sehe das genauso. Lieber EINMAL Mehrarbeit beim Programmieren (und anschließend läuft aber alles, wie es soll), als STÄNDIG Fehler beheben müssen (weil sich die Feldreihenfolge geändert hat, neue Felder dazugekommen sind o.ä.).

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|