2012-11-13 37 views
4

我在Objective-C中通過C API使用sqlite。我的應用程序的一個預期功能是用戶可以搜索人名和他們輸入的每個新字符,執行一個使用LIKE的SQL查詢來查找名稱符合匹配條件的所有人。我遇到的問題是參數化LIKE內部的匹配,而不用字面解釋問號。也就是說,我相信目前該應用正在尋找包含?(其中沒有人)的人名。Objective-C sqlite在LIKE子句裏面添加查詢參數

我的代碼如下所示:

const char *sql = "SELECT rowid, name, email FROM person WHERE name LIKE '%?%'"; 
sqlite3_stmt *sqlStatement; 
if(sqlite3_prepare_v2(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { 
    NSLog(@"Problem preparing getFilteredPeopleStubs statement."); 
} 
if(sqlite3_bind_text(sqlStatement, 1, [searchText UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK){ 
    NSLog(@"Problem binding search text param."); 
} 

基本上,searchText是我的名字來自何處,但在那一刻,我相信它只是在尋找的人的名字中包含?,因爲'%?%'中的單引號。有沒有解決這個問題,仍然讓我使用參數化查詢(防止SQL注入),並實現我後?

回答

4

%字符轉換爲searchText,像(原諒雙關語)這樣的:

const char *sql = "SELECT rowid, name, email FROM person WHERE name LIKE ?"; 
sqlite3_stmt *sqlStatement; 
if(sqlite3_prepare_v2(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { 
    NSLog(@"Problem preparing getFilteredPeopleStubs statement."); 
} 
NSString *bindParam = [NSString stringWithFormat:@"%%%@%%", searchText]; 
if(sqlite3_bind_text(sqlStatement, 1, [bindParam UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK){ 
    NSLog(@"Problem binding search text param."); 
}