2013-02-07 14 views
1

上午我的查詢是特殊字符都沒有得到鑑定的SQLite

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

outlineTitle了單引號,從DB eventhough分貝未獲取數據有數據。如果我把另一個outlineTitle沒有任何特殊字符,它的工作...

請幫我出球員....在此先感謝...

回答

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注入攻擊。

+0

@downvoter - 請解釋反對票。 – rmaddy

+0

如果字符串以'或'結尾怎麼辦? 對我來說,它沒有任何線索來處理這個問題? –

+0

@Dhanunjay這是使用sqlite3_bind_text的一點,它正確地轉義了所有特殊字符。 – rmaddy