Quickie - ersetzen Sie alle vorkommen von '(Apostroph) mit " (zwei Apostrophe) in einen AnsiString (C++)

StackOverflow https://stackoverflow.com/questions/463816

  •  19-08-2019
  •  | 
  •  

Frage

Ich denke, Sie können erraten, das problem, das ich habe.Ich bin das einfügen von Dateinamen in einer sql-Datenbank in C++ Builder.Einige Dateien haben einen Apostroph in Ihrem Namen.Das bricht die sql-insert-Abfrage.der übliche Weg, dies zu beheben, ist zu verdoppeln und Apostrophe Sie wollen Teil des Feldes Wert.

Zum Beispiel, wenn ich hinzufügen möchten 'george' Feld "Eigentümer" der sql-Abfrage wäre "insert into Tabelle (owner) values ('george"s')"

Ich bin ok mit, die bit.Ich habe gerade brauchen, um das einzelne Apostrophe ersetzt durch doppelte ersetzt.AnsiString scheint nicht zu haben eine integrierte Funktion dafür.Gibt es eine einfache Möglichkeit, es zu tun, ohne eine ganze neue header-Datei?

War es hilfreich?

Lösung

Eigentlich bekam ich die Antwort von mir...

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

(so gibt es eine eingebaute Funktion replace in AnsiString afterall)

Edit:Added code tags, damit wir unterscheiden können zwischen den unterschiedlichen Zitate

Andere Tipps

Ich habe nicht verwendet AnsiString, aber grundsätzlich würde ich Folgendes tun:

  • Reverse-finden Sie einfache Anführungszeichen in Ihrem string
  • Schauen Sie Links und rechts neben der aktuellen single quote index
  • Wenn es nicht ein einziges Zitat es gibt schon ein einzelnes Zitat einfügen, nachdem Sie Ihre aktuelle index
  • Weiterhin Loopen, bis Sie auf index 0.

Der übliche Weg dies zu tun, ist die Verwendung von prepared statements im Gegensatz zu der Erstellung Ihrer eigenen sql.Look up SQL-Injection für ein Grund, warum dies schlecht ist.Im Grunde, wenn irgendwo in Ihrer app, und Sie vergessen haben, verdoppeln Sie die Zitate in eine sql-Anweisung, und ein Angreifer kann irgendwie senden Sie eine Wert in die sql-Anweisung, Ihre Datenbank gehackt wird.(Siehe dieser xkcd-comic für ein humorvolles Beispiel dafür, was passieren kann.)

In C++ Builder, die Sie suchen für die AnsiQuotedStr Funktion SysUtils.Seine inverse ist AnsiExtractQuotedStr.Sie sind nicht Methoden der AnsiString geben Sie sich selbst, denn Sie brauchen nicht intime Kenntnis des Typ ' s internals.

Was jedoch noch wichtiger ist, Sie sollten mit parametrisierte Abfragen.Wenn die Komponenten, die Sie verwenden für die access-Datenbank nicht jene unterstützen, dann erhalten Sie ein anderes Datenbank-Bibliothek.Es gibt keinen Mangel an Datenbank Entscheidungen, so Sie sich leisten können, wählerisch zu sein über die Funktionen und parametrisierte Abfragen sollten in der Nähe der Spitze der Liste.

Beachten Sie, dass Sie trotz Ihrer Namen, die AnsiX Funktionen akzeptieren UnicodeString Parameter, die nicht AnsiString, in Delphi und C++ Builder 2009.

Was passiert, wenn Sie ersetzen es gerne, dass

item = StringReplace( item, "'", "\'", TReplaceFlags() );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top