Problem mit Hochkomma beim lesen aus MySQL DB - Wie verhindern?



  • Hallo Zusammen,
    ich habe ein kleines Problem mit einem Hochkomma beim Lesen von Daten aus einer MySQL Datenbank. Für den MySQL-Zugriff nutze ich die MyDac Komponenten.

    Ein Beispiel wäre folgendes:

    sql_select = "Select * from artikeldaten where lieferscheinnummer = '"+DataModule1->sql_lieferschein_anzeigen->FieldByName("lieferscheinnummer")->AsString+"' order by position";
    DataModule1->sql_artikeldaten->SQL->Clear();
    DataModule1->sql_artikeldaten->SQL->Add(sql_select);
    DataModule1->sql_artikeldaten->Open();
    

    Das klappt auch sehr gut, bis ein Hochkomma ins Spiel kommt.
    Es kann sein, dass in der Artikelbezeichnung so ein Hochkomme vor kommt. Dann bricht das Programm mit dem Hinweis auf einen Fehler in der MySQL Syntax ab.

    Wie kann ich das umgehen? Beim Insert konnte ich das z.B. mit "\'" auffangen. Aber wie mache ich das beim auslesen?

    Für Hilfe, danke im voraus.



  • Niemals SQL-Statements per String-Verknüpfung erstellen! Das eröffnet SQL-Injections Tür und Tor. Benutz lieber prepared Statements:

    /* '?' is the supported placeholder syntax */
      pstmt = con->prepareStatement("INSERT INTO test(id) VALUES (?)");
      for (int i = 1; i <= 10; i++) {
        pstmt->setInt(1, i);
        pstmt->executeUpdate();
      }
      delete pstmt;
    

    http://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-complete-example-2.html



  • Danke für den Hinweis. Werde ich mir mal anschauen.
    In deinem Beispiel geht es aber nur um Insert oder sehe ich das falsch?



  • Das geht mit jedem SQL-Statement, auch solche ohne Parameter. Der Link sollte auch noch andere Beispiele bereithalten.



  • Hab ich eben auch gesehen. Danke schön.

    Aber wie umgehe ich damit mein Problem mit den Hochkomma?



  • Das wird dann automatisch von der Datenbankkomponente passend übermittelt (d.h. mit einem Escape-Charakter versehen).
    Probiere es einfach aus...



  • Aus dem Link, zwei Kapitel vorher:

    prep_stmt = con->prepareStatement("INSERT INTO test(id, label) VALUES (?, ?)");
    
    prep_stmt->setInt(1, 1);
    prep_stmt->setString(2, "a"); // <--- hier kann alles im String stehen, was du willst. Jedes beliebige Sonderzeichen. Das wird dann automatisch für den Server umgewandelt.
    prep_stmt->execute();
    

Anmelden zum Antworten