Quickie-AnsiString内のすべての '(アポストロフィ)を' '(2つのアポストロフィ)に置き換えます(C ++)
-
19-08-2019 - |
質問
私が抱えている問題を推測できると思います。 C ++ BuilderでSQLデータベースにファイル名を挿入しています。一部のファイルには、名前にアポストロフィが含まれています。これにより、SQL挿入クエリが破損します。これを修正する通常の方法は、フィールド値の一部にしたいアポストロフィを2つ重ねることです。
たとえば、フィールド 'owner'に 'george's'を追加する場合、SQLクエリは<!> quot; insert into table(owner)values( 'george''s ')<!> quot;
そのビットで大丈夫です。単一のアポストロフィを二重のアポストロフィに置き換えるだけです。 AnsiStringには、このための組み込み関数がないようです。まったく新しいヘッダーファイルをインクルードすることなくそれを行う簡単な方法はありますか?
解決
実際、私は自分で答えを得ました...
item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );
(したがって、AnsiString afterlには組み込みのreplace関数があります)
編集:異なる引用符を区別できるようにコードタグを追加しました
他のヒント
AnsiStringを使用したことはありませんが、基本的には次のことを行います。
- 文字列内の単一引用符を逆に検索
- 現在の単一引用符インデックスの左右を見る
- 単一引用符がまだない場合は、現在のインデックスの後に単一引用符を挿入します
- インデックス0に達するまでループを続けます。
これを行う通常の方法は、独自のSQLを生成するのではなく、準備されたステートメントを使用することです。これが悪い理由の1つとして、 SQLインジェクションを調べてください。基本的に、アプリ内のどこかで、SQLステートメントの引用符を二重にするのを忘れると、攻撃者が何らかの方法でそのSQLステートメントに値を送信でき、データベースがハッキングされます。 (起こりうることのユーモラスな例については、このxkcdコミックを参照してください。)
C ++ Builderでは、AnsiQuotedStr
でSysUtils
関数を探しています。その逆はAnsiExtractQuotedStr
です。これらは、タイプの内部に関する詳細な知識を必要としないため、AnsiString
タイプ自体のメソッドではありません。
さらに重要なことは、パラメータ化されたクエリを使用することです。データベースアクセスに使用しているコンポーネントがそれらをサポートしていない場合は、別のデータベースライブラリを入手してください。データベースの選択肢が不足しているわけではないため、機能にこだわりを持つことができ、パラメータ化されたクエリはリストの最上部近くにあるはずです。
名前にかかわらず、DelphiおよびC ++ Builder 2009では、AnsiX
関数はUnicodeString
ではなく<=>パラメーターを受け入れることに注意してください。
そのように置き換えるとどうなりますか
item = StringReplace( item, "'", "\'", TReplaceFlags() );