Badboy46: String escapen für SQL Insert

Hallo,

ich hab mir hier eine Funktion gebastelt

function _db_insert($tabelle, $spalte, $wert){
  global $db;
  $spalte1 = '';
  $wert1 = '';
  foreach ($spalte as $text) $spalte1 .= $text.',';
  foreach ($wert as $text) $wert1 .= '''.$db->escapeSimple($text).'',';
  $spalte = substr($spalte1, 0, strlen($spalte1)-1);
  $wert = substr($wert1, 0, strlen($wert1)-1);
  $sql = sprintf ('INSERT INTO %s (%s) VALUES (%s)', _DBTAB.$tabelle, $spalte, $wert);
  $result = $db->query($sql);
  if(DB::isError($result)){
    die($result->getMessage());
    exit();
  }
}

wenn ich mir da $sql ausgeben lasse, kommt soetwas bei raus

INSERT INTO user (_username_r, _username, _password, _email, _reg_email, _reg_date, _last_login, _rang, _fehlversuche, _fehlversuchzeit) VALUES ('kay'"aad','kay'"aad','200820e3227cf69c1756a6b531e7e0d2','kay@xxx.de','kay@xxx.de','1090147928','1090147928','user','0','1090147928')

wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
kay'"aad statt so kay'"aad

kann mir einer sagen, warum das so ist?

$spalte und $wert sind arrays
$db = http://pear.php.net/manual/de/package.database.php

Kay

  1. wenn ich die eine Zeile so schreibe

    foreach ($wert as $text) $wert1 .= '''.$db->escapeSimple($db->escapeSimple($text)).'',';

    klappt es.
    Mmuss ich das verstehen, warum ich die 2mal escapen muss?

  2. Hallo,

    Moin!

    ich hab mir hier eine Funktion gebastelt

    function _db_insert($tabelle, $spalte, $wert){

    Kleine Frage nebenbei: Warum beginnt der Name der Funktion mit einem Unterstrich? AFAIK ist so etwas doch eigentlich PHP intern vorbehalten.

    wenn ich mir da $sql ausgeben lasse, kommt soetwas bei raus:

    »»

    INSERT INTO user (_username_r, _username, _password, _email, _reg_email, _reg_date, _last_login, _rang, _fehlversuche, _fehlversuchzeit) VALUES ('kay'"aad','kay'"aad','200820e3227cf69c1756a6b531e7e0d2','kay@xxx.de','kay@xxx.de','1090147928','1090147928','user','0','1090147928')

    »»

    Sieht gut aus, alle "gefährlichen" Zeichen escaped, selbst Zahlen in Hochkomma, sehr schön.

    wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
    kay'"aad statt so kay'"aad

    Ist klar, weil phpMyAdmin bei der Ausgabe automatisch die Backslashes entfernt. Mit 'kay'"add' sorgst du ja nur dafür, dass MySQL wirklich kay'"add in die Datenbank einträgt, statt nach kay\ einen Syntaxfehler (den nächsten Backslash) zu melden. Also: In der Datenbank steht, was auch die Ausgabe zeigt, in der Tat kay'"add. Willst du hingegen selbst die Backslashes auch dort _in der Datenbank_ stehen haben, musst diese natürlich ebenfalls escapen. Im Gegensatz zu PHP, Perl, ... unterscheidet SQL nicht bei den Quotes, ob Backslashes aufgelöst werden oder nicht.

    Kay

    Gruß, Robert

    1. Hallo

      ich hab mir hier eine Funktion gebastelt

      function _db_insert($tabelle, $spalte, $wert){

      Kleine Frage nebenbei: Warum beginnt der Name der Funktion mit einem Unterstrich? AFAIK ist so etwas doch eigentlich PHP intern vorbehalten.

      also das mit den _ am anfang klappt einwandfrei
      falls ich doch mal ein Funktionsname von PHP erwische, läuft mein Script weiter, wie ich das möchte ;)

      wenn ich mir da $sql ausgeben lasse, kommt soetwas bei raus:
      »»
      INSERT INTO user (_username_r, _username, _password, _email, _reg_email, _reg_date, _last_login, _rang, _fehlversuche, _fehlversuchzeit) VALUES ('kay'"aad','kay'"aad','200820e3227cf69c1756a6b531e7e0d2','kay@xxx.de','kay@xxx.de','1090147928','1090147928','user','0','1090147928')
      »»

      Sieht gut aus, alle "gefährlichen" Zeichen escaped, selbst Zahlen in Hochkomma, sehr schön.

      das wird ja auch generiert :)

      wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
      kay'"aad statt so kay'"aad

      Ist klar, weil phpMyAdmin bei der Ausgabe automatisch die Backslashes entfernt. Mit 'kay'"add' sorgst du ja nur dafür, dass MySQL wirklich kay'"add in die Datenbank einträgt, statt nach kay\ einen Syntaxfehler (den nächsten Backslash) zu melden. Also: In der Datenbank steht, was auch die Ausgabe zeigt, in der Tat kay'"add. Willst du hingegen selbst die Backslashes auch dort _in der Datenbank_ stehen haben, musst diese natürlich ebenfalls escapen. Im Gegensatz zu PHP, Perl, ... unterscheidet SQL nicht bei den Quotes, ob Backslashes aufgelöst werden oder nicht.

      das es zu keinen bösen Überraschungen kommen kann, wenn nur ' und " statt ' udn " in der MySQL Tabelle steht?

      1. Hallo

        Nabend!

        Kleine Frage nebenbei: Warum beginnt der Name der Funktion mit einem Unterstrich? AFAIK ist so etwas doch eigentlich PHP intern vorbehalten.

        also das mit den _ am anfang klappt einwandfrei

        Dann ist ja gut, ich wollte nur darauf hinweisen.

        falls ich doch mal ein Funktionsname von PHP erwische, läuft mein Script weiter, wie ich das möchte ;)

        Soso

        INSERT INTO user (_username_r, _username, _password, _email, _reg_email, _reg_date, _last_login, _rang, _fehlversuche, _fehlversuchzeit) VALUES ('kay'"aad','kay'"aad','200820e3227cf69c1756a6b531e7e0d2','kay@xxx.de','kay@xxx.de','1090147928','1090147928','user','0','1090147928')
        »»

        Sieht gut aus, alle "gefährlichen" Zeichen escaped, selbst Zahlen in Hochkomma, sehr schön.

        das wird ja auch generiert :)

        Wahrscheinlich mit einer dieser *sql_escape_string Funktionen, recht praktische Dinger.

        wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
        kay'"aad statt so kay'"aad

        Ist klar, weil phpMyAdmin bei der Ausgabe automatisch die Backslashes entfernt. [...] In der Datenbank steht, was auch die Ausgabe zeigt, in der Tat kay'"add. Willst du hingegen selbst die Backslashes auch dort _in der Datenbank_ stehen haben, musst diese natürlich ebenfalls escapen. Im Gegensatz zu PHP, Perl, ... unterscheidet SQL nicht bei den Quotes, ob Backslashes aufgelöst werden oder nicht.

        das es zu keinen bösen Überraschungen kommen kann, wenn nur ' und " statt ' udn " in der MySQL Tabelle steht?

        Was für böse Überraschungen? MySQL ist es vollkommen gleichgültig was in der Datenbank steht, siehe z.B. die BLOB-Felder. Das Escapen ist nur für die Abfragen notwendig, damit MySQL weiß, wo jeder Wert beendet ist.

        HTH, Robert

        1. Hallo

          das es zu keinen bösen Überraschungen kommen kann, wenn nur ' und " statt ' udn " in der MySQL Tabelle steht?

          Was für böse Überraschungen? MySQL ist es vollkommen gleichgültig was in der Datenbank steht, siehe z.B. die BLOB-Felder. Das Escapen ist nur für die Abfragen notwendig, damit MySQL weiß, wo jeder Wert beendet ist.

          hm... soweit sogut...
          wenn ich mit addslashes dei Werte eintragen sehen die erst so aus ' in der Datenbank aber so '

          wenn ich die Daten jetzt auslese, brauche ich doch kein stripslashes mehr, oder? denn die Daten sind ja in der Datenbank nicht mit ' gespeichert, oder versteh ich das falsch

          Kay