Ina: Querys sicher in Datenbank eintragen

Hallo,

zuerst mal eine Anmerkung, bei solch einer Frage weiss ich nie welche Kategorie ich hier wählen soll, Datenbank oder PHP?

$x = "INSERT INTO $tblname values('$id','$contxt','$tme')";
sqlite_query($db,$x);

### Das funktioniert ohne Probleme. ###

$x = "INSERT INTO $tblname values('$id','$contxt','$tme')";
$x = sqlite_escape_string($x);
sqlite_query($db,$x);

### Das leider nicht: ###
 Warning: sqlite_query() [function.sqlite-query]: near "id10": syntax error in...

$x = "INSERT INTO $tblname values("$id","$contxt","$tme")";
$x = sqlite_escape_string($x);
sqlite_query($db,$x);

### So widerum würde es gehen ###

Jetzt habe ich es zwar nicht mit MYSQL getestet, aber ich denke da passiert das Gleiche mit "mysql_real_escape_string"

Die Frage ist also, warum darf ich keine einfachen Anführungszeichen benutzen, bzw. muss ich wirklich jedesmal Mal, beim Erzeugen  eines Query-String, manuell das noch escapen, damit ich dann "sqlite_escape_string" nutzen kann?

Ina

  1. Hi,

    Die Frage ist also, warum darf ich keine einfachen Anführungszeichen benutzen, bzw. muss ich wirklich jedesmal Mal, beim Erzeugen  eines Query-String, manuell das noch escapen, damit ich dann "sqlite_escape_string" nutzen kann?

    Nein, im Gegenteil.

    sqlite_escape_string bzw. mysql_real_escape_string gehoeren nicht auf die komplette Query angewendet, sondern nur auf die Daten, die du dort dynamisch einsetzt - diese Funktionen sind schliesslich genau dafuer da, dafuer zu sorgen, dass seitens der DB-Engine keinerlei Unklarheiten darueber auftauchen koennen, ob etwas nun als Teil der SQL-*Anweisungen*, oder der Daten zu betrachten ist.

    MfG ChrisB

  2. Hello,

    Die Frage ist also, warum darf ich keine einfachen Anführungszeichen benutzen, bzw. muss ich wirklich jedesmal Mal, beim Erzeugen  eines Query-String, manuell das noch escapen, damit ich dann "sqlite_escape_string" nutzen kann?

    nein, aber du hast die Funktion des Escapens falsch verstanden. Das Escaping wird auf Werte angewendet, die potenziell störende/gefährliche Seiteneffekte haben können. Die Maskierung sorgt dafür, dass die Datenbank den jeweiligen Wert als genau das ansieht: einen Wert, nicht einen Befehl.
    Du sollst also NICHT das gesamte SQL-Statement maskieren (denn dadurch verliert es die Eigenschaft ein SQL-Statement zu sein), sondern die Variablen, die du dort hineinpackst. Dadurch ist sichergestellt, dass der _Inhalt_ der Variablen, nicht den Rest deines SQL-Statements zerstört.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Vegetarier essen meinem Essen das Essen weg.
  3. Hi,

    $x = "INSERT INTO $tblname values('$id','$contxt','$tme')";
    sqlite_query($db,$x);

    Das funktioniert ohne Probleme.

    Nein. Das funktioniert nur zufällig  (bis durch irgendwelche Aktionen auf der Datenbank wie z.B. drop column + add column die Reihenfolge der Spalten nicht mehr mit dem übereinstimmt, was Du hier vermutest.

    Besser:

    $x = "INSERT INTO $tblname (id, context, tme) VALUES ('$id','$contxt','$tme')";

    also mit expliziter Angabe der Spalten, die Du füllen willst.

    $x = "INSERT INTO $tblname values('$id','$contxt','$tme')";
    $x = sqlite_escape_string($x);

    Das ist Unsinn, es müssen die einzutragenden Werte einzeln behandelt werden, nicht die komplette Query.

    Das leider nicht:

    Warning: sqlite_query() [function.sqlite-query]: near "id10": syntax error in...

    Kein Wunder, s.o.

    $x = "INSERT INTO $tblname values("$id","$contxt","$tme")";
    $x = sqlite_escape_string($x);
    sqlite_query($db,$x);

    So widerum würde es gehen

    Nur zufällig, weil Deine Werte zufällig kein kritisches Zeichen enthalten.

    Die Frage ist also, warum darf ich keine einfachen Anführungszeichen benutzen, bzw. muss ich wirklich jedesmal Mal, beim Erzeugen  eines Query-String, manuell das noch escapen, damit ich dann "sqlite_escape_string" nutzen kann?

    Du mußt, wie bereits erwähnt, die Werte mit sqlite_escape_string behandeln, nicht die komplette Query.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. Dank an euch, perfekte Antworten.

    Jeder Wert also einzeln,hmmm, muss einem ja auch gesagt werden;-)

    Ina

    1. echo $begrüßung;

      Jeder Wert also einzeln,hmmm, muss einem ja auch gesagt werden;-)

      Du solltest dich über die Arbeitsweise dieser Funktion informieren und die Art und Weise, wie Stringwerte in SQL-Querys im Allgmeinen und speziell bei SQLite eingefügt werden. Außerdem ist es immer günstig, wenn man Kontrollausgaben macht, um zu sehen, was die verwendete Funktion aus den Eingabedaten gemacht hat. Dies sollte man vor allem dann machen, wenn einem eine Funktion und deren Arbeitsweise noch nicht vertraut ist.

      echo "$verabschiedung $name";