2012-06-28 144 views
1

我正在嘗試爲使用sqlite3存儲登錄憑據的iphone應用程序創建登錄屏幕。Xcode登錄屏幕sqlite3數據庫身份驗證問題

以下是我用來處理身份驗證功能:

-(void) enter 
{ 
    const char *dbpath = [databasePath UTF8String]; 
    sqlite3_stmt *statement; 

    if (sqlite3_open(dbpath, &DBLogin) == SQLITE_OK) 
    { 
     NSLog(@"Connected to Database"); 
     NSString *querySQL = [NSString stringWithFormat:@"SELECT id FROM User WHERE id=\"%@\"",login.text]; 
     NSString *s = password.text; 
     const char *query_stmt = [querySQL UTF8String]; 
     NSLog(@"String is %s",query_stmt); 
     NSLog(@"Pass is %@",s); 
     if (sqlite3_prepare_v2(DBLogin,query_stmt, -1, &statement, NULL) ==!SQLITE_NULL) 
     { 
      NSLog(@"Executed Correctly"); 
      querySQL = [NSString stringWithFormat:@"SELECT password FROM User WHERE password=\"%@\"",password.text]; 
      query_stmt = [querySQL UTF8String]; 
      const char *f= [login.text UTF8String]; 
      NSLog(@"String is %s",query_stmt); 
      NSLog(@"Pass is %@",s); 
      // const char *l = [login.text UTF8String]; 
      // sqlite3_bind_text(statement, 1, query_stmt, -1, SQLITE_STATIC); 
      if (sqlite3_prepare_v2(DBLogin,query_stmt, -1, &statement, NULL) == !SQLITE_NULL) 
      { 
       if(sqlite3_bind_text(statement, 1,f , -1, SQLITE_STATIC)) 
        status.text= @"Congratulations"; 
      } 
      else 
      { 
       NSLog(@"error"); 
      } 
     } 
     else 
     { 
      NSLog(@"Failed"); 
      status.text [email protected]"ERROR!"; 
     } 
    } 
} 

,這是我的數據庫模式:

CREATE TABLE User (id varchar(20) PRIMARY KEY, password varchar(20));

我覺得有什麼不對的我通過的方式是通過login.textpassword.text的細節。根據NSLog它傳遞正確的值,但它似乎沒有檢查它是否是正確的輸入。它似乎認爲一切都很好,無論我輸入什麼,都會顯示status.text = Congratulations

我不知道如何解決這個問題,並希望得到任何幫助。如果需要,我可以提供更多信息。提前致謝!

+0

爲什麼你只是如果密碼存在檢查數據庫中,而不是檢查,如果密碼正確針對特定用戶的方式嗎? –

+0

我必須能夠使用數據庫中的數據對用戶進行身份驗證。我不知道如何檢查密碼是否對用戶正確,所以任何幫助,將不勝感激。 – user1431272

+0

用戶數據在安裝應用程序時如何首次進入數據庫?它是隨應用程序提供的,他們被告知用戶名/密碼,或者他們在第一次運行應用程序時是否輸入用戶名/密碼?如果他們進入另一臺設備會發生什麼情況 - 您是否希望用戶名和密碼也可以使用?還有許多其他問題需要您決定 –

回答

1

從您發佈的代碼中,我想爲您清楚幾件事情,然後將提出如何繼續。有用於執行數據庫操作

  1. sqlite3_open 4個主要源碼功能:要打開一個數據庫連接
  2. sqlite3_prepare_v2:編譯查詢成字節代碼程序
  3. sqlite_bind:要通過的輸入值查詢
  4. sqlite3_step:評估/執行編譯語句。

所以從你的代碼張貼以上,

  1. 你還沒有執行步驟4.因此,它很明顯,你有沒有執行的查詢都沒有。
  2. 您使用NSString的stringWithFormat方法完全形成了查詢(包括輸入參數),因此不需要使用sqlite_bind函數。
  3. 您用來認證用戶的邏輯也有點混亂。

這裏是爲了實現你所需要的

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 
    const char *sql = "select * from User where id = ? and password = ?"; 
    sqlite3_stmt *selectstmt; 
    if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 
    sqlite3_bind_text(selectstmt, 1, [login.text UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(selectstmt, 2, [password.text UTF8String], -1, SQLITE_TRANSIENT); 
     while(sqlite3_step(selectstmt) == SQLITE_ROW) { 

      NSLog(@"Successful login"); 
     } 
    } 
} 
+0

您編寫的代碼會編譯,但是當我輸入正確的用戶名和密碼時,它不會輸入while循環。 sqlite3_step(selectstmt)返回的代碼是101,這意味着SQLITE = DONE。基於這個是我的數據庫或其他編碼問題有什麼問題嗎? – user1431272

+0

SQLITE_DONE表示語句已成功執行。代碼沒有問題。我懷疑數據庫中是否有記錄。你能否確認你的數據庫是否有關於你正在搜索的用戶的信息? – Swathi

+0

是的,我可以確認數據庫中有記錄,我在登錄和密碼文本字段中輸入,但由於某種原因,它不會進入while循環來說成功登錄。 – user1431272