私のアプリの検索機能を構築しているうちに、FMDB SQLite Wrapper(https://github.com/ccgus/fmdb)を使って問題が発生しました。FMDBの問題とsearchStringの "executeQuery:"の挿入値
このSQLコマンドでデータベースを検索すると、すべて問題ありません。 13個のオブジェクトが返され、それらを使用できます。
FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE '%Daimler%'"];
しかし、私はこのようなユーザー入力からSEARCHQUERYを挿入しようとすると:
FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE (?)", theSearchQuery];
...値はいけないSQLコマンドに挿入されています。私はDBから返されたオブジェクトを取得しません。たとえString(theSearchQuery)が最初の例で書かれたものと同じであっても。
私はあなたの納得のためにFMDBの文書から一部を投稿します。 :)
Data Sanitization
SQLステートメントをFMDBに提供するときは、挿入前に値を「サニタイズ」しないでください。代わりに、標準のSQLiteバインディング構文を使用する必要があります。
INSERT INTO myTable VALUES(?、?、?) ?文字はSQLiteによって挿入される値のプレースホルダとして認識されます。実行メソッドはすべて、適切にエスケープされた可変数の引数(またはNSArrayやva_listなどの引数の表現)を受け入れます。 executeUpdateのデシベル
[::
したがって、あなたがこの(またはこのようなものを)すべきではない[NSStringのstringWithFormat: "INSERT INTO mytableは値(%の@)" @、たくさんの "これは\ました" @ 'bizarre \ "quotes'"]]; 代わりに、あなたが行う必要があります。
[デシベルのexecuteUpdateを: "mytableはVALUES INTO INSERT(?)" @ "奇妙な\」引用「"たくさんの "これは\を持っています" @]。 -executeUpdate:メソッド(またはパラメータとしてva_listを受け入れるバリアント)に指定されたすべての引数は、オブジェクトでなければなりません。次のコードは動作しません(クラッシュします)。
[db executeUpdate:@ "INSERT INTO myTable VALUES(?)"、42] 数字を挿入する適切な方法は、NSNumberオブジェクトのボックスに入れることです。
[db executeUpdate:@ "INSERT INTO myTable VALUES(?)"、[NSNumber numberWithInt:42]]; また、-execute * WithFormat:バリアントを使用してNSStringスタイルの置換を使用することもできます。
[db executeUpdateWithFormat:@ "INSERT INTO myTable VALUES(%d)"、42]; 内部的には、-execute * WithFormat:メソッドが適切なボクシングを行います。 %、%s、%d、%D、%i、%u、%U、%hi、%hu、%qi、%qu、%f、%g、%次のパーセント修飾子は認識されます。 ld、%lu、%lld、および%llu。それら以外の修飾語を使用すると、予測できない結果になります。なんらかの理由でSQL文に%文字が必要な場合は、%%を使用してください。
[OK]を私はこれを解決NSString stringWithFormat:]私はFMDBの挿入を使用する可能性を残しました。 –