1

sqlite3 を使用してログイン資格情報を保存する iphone アプリケーションのログイン画面を作成しようとしています。

以下は、認証を処理するために使用している関数です。

-(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 =@"ERROR!";
        }
    }
}

そして、これはデータベースの私のスキーマです:

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

login.textorの詳細を渡す方法に問題があると思いますpassword.text。それによるとNSLog、正しい値を渡しますが、それが正しい入力であるかどうかのチェックに失敗しているようです。status.text = Congratulations何を入力しても、すべてが適切であると考えているようです。

これを修正する方法がわかりません。私が得られる助けをいただければ幸いです。必要に応じて、さらに情報を提供できます。前もって感謝します!

4

1 に答える 1

1

あなたが投稿したコードから、私はいくつかのことを明確にしたいと思います。その後、どのように進めるかを提案します。データベース操作を実行するために使用される 4 つの主な sqlite 関数があります。

  1. sqlite3_open : データベース接続を開くには
  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");
      }
   }
 }
于 2012-06-28T18:32:29.073 に答える