проблема с входом в sqlite

#iphone #objective-c #sqlite

#iPhone #objective-c #sqlite

Вопрос:

Друг, я действительно так признался, что мне делать. Вот мой код.

@синтезировать имя пользователя, пароль; -(недействительно)createDatabaseIfNeeded {

 BOOL success;
NSError *error;

 //FileManager - Object allows easy access to the File System.
 NSFileManager *FileManager = [NSFileManager defaultManager];

 //Get the complete users document directory path.
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

 //Get the first path in the array.
 NSString *documentsDirectory = [paths objectAtIndex:0];

    //Create the complete path to the database file.
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"Journeymapper.sql"];

    //Check if the file exists or not.
    success = [FileManager fileExistsAtPath:databasePath];

    //If the database is present then quit.
    if(success) return;

    //the database does not exists, so we will copy it to the users document directory]
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Journeymapper.sql"];

    //Copy the database file to the users document directory.
    success = [FileManager copyItemAtPath:dbPath toPath:databasePath error:amp;error];

    //If the above operation is not a success then display a message.
    //Error message can be seen in the debugger's console window.
    if(!success)
        NSAssert1(0, @"Failed to copy the database. Error: %@.", [error localizedDescription]);
}

-(void)check
{

    //Get the database and connect to it.

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"Journeymapper.sql"];



    //open the database
    if(sqlite3_open([dbPath UTF8String], amp;database) == SQLITE_OK)
    {
        //const char *sql ="select Username@'%@',Password@'%@' from userinformation";
        NSString *sql = [[NSString alloc] initWithFormat:@"select * from UserInformation where UserName='%@' and Password='%@' ",Username.text,Password.text];
        sqlite3_stmt *selectSatement;


        //Preoare the select Statment
        int returnValue = sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL);
        NSLog(@"%i",returnValue);
        if( sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL) == SQLITE_OK)
        {

            NSString *user1 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectSatement, 0)];
            NSLog(@"%@",user1);
        }
    }
}

-(IBAction)Login
{
    [self check];
}
  

проблема в том, что здесь:-Я не уверен, почему sqlite3_prepare_v2 не проходит встреча SQLITE_OK .

 if( sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL) == SQLITE_OK)
  

Мы высоко ценим любую помощь в этом.

Комментарии:

1. Journeymapper.sql я думаю, вам следует использовать sqlite вместо sql

2. Что возвращается из вызова sqlite3_prepare_v2()? Точная возвращаемая ошибка должна дать вам подсказку. Смотрите sqlite.org/capi3ref.html#sqlite3_errcode Также обратите внимание, что вам действительно следует привязать заполнители (UserName=? и Password=?, затем установите их значения с помощью функций sqlite3_bind_*). Это позволит избежать проблем с экранированием и, следовательно, SQL-инъекции.

3. Он не показывает мне никаких ошибок, приложение запущено, но оно не проверяет qlite3_prepare_v2(), где мой UIAlertView или NSLog для отображения результатов, возвращаемых вызовом sqlite3_prepare_v2(), и указывает:-Точка останова выходит из цикла

4. Есть ли какой-либо другой способ сделать это, если да, пришлите мне пример кода

5. Не просто вставляйте свой код в вопрос. Вам нужно переформатировать его, чтобы заменить табуляции пробелами, а также форматирование кода запускается, только если вы сделаете отступ на четыре пробела.

Ответ №1:

Почему вы пытаетесь подготовить инструкцию дважды? Вы должны использовать sqlite3_step() для оценки вашего подготовленного заявления.


Кстати, ваш код уязвим для атак с использованием SQL-инъекций. Вместо замены строки use и пароля в инструкцию select вам следует использовать sqlite3_bind() для привязки ваших параметров к подготовленной инструкции.

Комментарии:

1. можете ли вы привести мне пример, как это использовать

2. @user420220: В прикрепленном сообщении в блоге приведен пример примерно на полпути вниз. icodeblog.com/2008/08/19 /…

3. как можно использовать sqlite3_bind () с sqlite_exec(). Как я могу передать два запроса «один для пароля и одно имя пользователя», а затем как я могу сравнить это с моими «user.text и password.text», которые вводит пользователь.

4. @user420220: Сообщение в блоге и ваш код между ними отвечают на все вопросы. Боюсь, у меня нет времени писать для вас вашу программу.

5. Спасибо за ответ. Но у меня также есть один вопрос: можно ли пометить карту фотографией