2012-06-28 2 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.text 또는 password.text의 세부 사항을 전달하고있다. NSLog에 따르면 올바른 값을 전달하지만 올바른 입력인지 여부를 확인하지 못하는 것 같습니다. 모든 것이 좋다고 생각하는 것 같습니다. status.text = Congratulations 내가 무엇을 입력해도 상관 없습니다.

이 문제를 해결하는 방법에 대해 알지 못해서 도움을 얻을 수있어서 감사하겠습니다. 필요한 경우 더 많은 정보를 제공 할 수 있습니다. 미리 감사드립니다!

+0

을 필요 달성하는 방법은? –

+0

데이터베이스의 데이터로 사용자를 인증 할 수 있어야합니다. 암호가 사용자에게 맞는지 확인하는 방법을 잘 모르겠습니다. 그래서 도움을 주시면 감사하겠습니다. – user1431272

+0

사용자 데이터는 앱을 설치할 때 데이터베이스에 어떻게 저장됩니까? 앱과 함께 제공되며 사용자 이름/비밀번호가 알려 지거나 처음 앱을 실행할 때 사용자 이름/비밀번호를 입력합니까? 그들이 다른 장치를 사용하면 어떻게됩니까? 사용자 이름과 암호를 사용하기를 원하십니까? 당신이 결정해야 할 많은 다른 질문이 있습니다 –

답변

1

게시 한 코드를 통해 몇 가지 사항을 명확하게 작성한 다음 진행 방법을 제안합니다. 받는 입력 값을 통과 : 데이터베이스 연결을

  • sqlite3_prepare_v2를 열려면 : 바이트 코드 프로그램
  • sqlite_bind에 쿼리를 컴파일하기 위해 데이터베이스 조작을

    1. sqlite3_open을 수행하는 데 4 개 주 SQLite는 기능이있다 쿼리
    2. 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