2014-10-27 68 views
0

我對IOS編程非常陌生,我在從數據庫中檢索一些數據時遇到問題。這是我在應用程序上完成的簡單登錄頁面。我需要檢查用戶名是否存在,它似乎失敗,在下面的行sqlite3_step(語句)== SQLITE_ROW,我似乎也在我寫我的SQL查詢說「數據參數不使用格式字符串「。下面是我的代碼如何使用WHERE子句從sqlite中檢索數據iOS 8

sqlite3_stmt *statement; 
    const char *dbpath = [_databasePath UTF8String]; 

    if(sqlite3_open(dbpath, &_db) == SQLITE_OK){ 

     NSString *query = [NSString stringWithFormat:@"SELECT USERNAME,PASSWORD FROM UserInfo WHERE USERNAME = \"%%@\"", self.txtUsername.text]; 
     const char *query_statement = [query UTF8String]; 

     if(sqlite3_prepare_v2(_db, query_statement, -1, &statement, NULL) == SQLITE_OK){ 
      if(sqlite3_step(statement) == SQLITE_ROW){ 

       NSString *username = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 
       NSString *password = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)]; 

       if([username isEqualToString:self.txtUsername.text] && [password isEqualToString:self.txtPassword.text]) 
       { 
        [self showUIAlertWithMessage:@"Successfully logged in" andTitle:@"Message"]; 
        [self shouldPerformSegueWithIdentifier:@"Login" sender:self]; 
       } 
      } 
      else{ 

       [self showUIAlertWithMessage:@"Username not found" andTitle:@"Message"]; 
      } 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(_db); 
    } 
+0

1)不要只檢查返回代碼爲「OK」,但是採集如果不良記錄他們,還會記錄調用sqlite3_errmsg的結果。 2)在調試時NSLog你的查詢字符串。 3)在命令窗口中使用sqlite3來測試你的查詢字符串,直到你熟悉它們。 – 2014-10-27 12:05:13

回答

1

格式說明了NSString%@而不是%%@(實際上是實現了description方法的任何NSObject派生類)。

使用%%轉義說明符,因此它會在您的情況下生成文字序列%@

注意:考慮使用綁定變量,這將避免可能的SQL注入攻擊。

注2:此測試是多餘的,因爲該數據庫將已經做到了:

[username isEqualToString:self.txtUsername.text] 
+0

謝謝@trojanfoe。字符串文字修復仍然沒有運氣。在同一行代碼失敗,當我調試查詢看起來像SELECT USERNAME,PASSWORD FROM UserInfo WHERE USERNAME =「」。它似乎沒有從我的文本框 – 2014-10-27 11:54:19

+1

@ Mr.Noob OK中提取值,因此該字段在IB中爲空或未正確連接。 – trojanfoe 2014-10-27 12:05:37

相關問題