1

データを取得するためにSQLクエリを使用しています..そして私のクエリは

select * from green where outlineDate between '2013-01-01' and '2013-12-31' and outlineTitle = 'That's Alright'

一重引用符を取得しました。これoutlineTitleは、データベースにデータがあるにもかかわらず、データベースからデータを取得していません。outlineTitle特殊文字を使用せずに別のものを配置すると、機能します...

みんな助けてください....よろしくお願いします...

4

1 に答える 1

1

クエリを不適切に作成しています。文字列形式を使用してクエリ文字列を作成しないでください。ほとんどの場合、次のようなことをしています。

NSString *title = ... // some title that might have "special characters"
NSString *query = [NSString stringWithFormat:@"select * ... and outlineTitle='%@'", title];

これは、クエリを作成するための非常に悪い方法です。適切な方法は、プリペアドステートメントを使用することです。

NSString *title = ... // some title that might have "special characters"
sqlite3_stmt *stmt = NULL;
sqlite3_prepare_v2(dbHandle, "SELECT * FROM green WHERE outlineTitle = ?", -1, &stmt, nil);
sqlite3_bind_text(stmt, 1, [title UTF8String], -1, SQLITE_TRANSIENT);

?クエリで使用してから適切なメソッドを使用することによりsqlite3_bind_xxx、すべての値が適切にエスケープされ、引用符で囲まれます。これにより、一重引用符やその他の文字の問題が修正されます。これにより、潜在的なSQLインジェクション攻撃も修正されます。

于 2013-02-07T16:25:11.697 に答える