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 回答