2011-07-15 7 views
4

私のアプリの検索機能を構築しているうちに、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文に%文字が必要な場合は、%%を使用してください。

+0

[OK]を私はこれを解決NSString stringWithFormat:]私はFMDBの挿入を使用する可能性を残しました。 –

答えて

7
NSString *search_text = [NSString stringWithFormat:@"%%%@%%", theSearchQuery]; 

FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE ?", search_text]; 
4

stringWithFormatでクエリを作成しないよう強くお勧めします。 FMDBがあなたにデータのサニタイズを使用させようとする理由は十分です。しかし、FMDBはあなたの入力をボクシングするので、次のコードで囲み括弧は必要なく、問題を引き起こす可能性があります。

[db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE (?)", theSearchQuery]; 

FMDBがあなたの議論を内部的にどのようにボックス化しているかわからないので、単純な親子関係のない引数を追加してください。

[db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE ?", theSearchQuery]; 

これはまだ提案executeQueryWithFormatを使用しようと動作しない場合:FMDBの方法:私は余分[全体SQLコマンドを用意し :

[db executeQueryWithFormat:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE %@", theSearchQuery]; 
+0

ありがとうございました!それは動作しません。私は余分なStringを前もって準備していましたが、今は動作しています...なぜ疑問符が私のために働いていないのか知らないのです。 git hubについての説明は非常に明確で、従いやすいですが、とにかく感謝しています! –

+1

stringWithFormatを使用せずに、ワイルドカード文字を置換に組み込む他の方法はありません。この場合LIKEをどこで使用しているのですか?この場合、マッチ文字列を囲むことを期待している%文字をどのように入れようとしますか? – wkhatch

+0

私はあなたが正しいかどうかは分かりませんが、SQLで%-signを使用したい場合は%%を使用できます。 –