2014-06-07 43 views
0

我開始熟悉iOS上的SQLite。我試圖做簡單的用戶註冊,但年齡值(NSInteger)總是變成一些大的負數,如-1073752692。 這是我的註冊代碼:SQLite插入錯誤的值。 iOS Dev

- (User*) registerUser:(NSString *) firstname 
       lastname:(NSString *) lastname 
        age:(NSInteger) Age 
       email:(NSString *) email 
       password:(NSString *) password 
       picture:(NSString *) picture 
{ 
    User* user = nil; 
    NSString *sql = [NSString stringWithFormat:@"INSERT INTO User (firstname, lastname, age, email, password, picture) VALUES (\"%@\", \"%@\", \"%d\", \"%@\", \"%@\", \"%@\")", firstname, lastname, Age, email, password, picture]; 

    sqlite3_stmt *insert; 
    int result = sqlite3_prepare_v2(self.db, [sql UTF8String], -1, &insert, NULL); 
    if (result == SQLITE_OK) { 
     sqlite3_step(insert); 
     user = [[User alloc]init]; 
     user.firstname = firstname; 
     user.lastname = lastname; 
     user.age = Age; 
     user.password = password; 
     user.picture = picture; 
     NSLog(@"Successful registration!"); 

    } else { 
     NSLog(@"Error: insert prepare statement failed: %s.", sqlite3_errmsg(self.db)); 
    } 
    sqlite3_finalize(insert); 
    return user; 

} 

我想不出爲什麼會發生這種事。我曾經和Postgres一起工作過很多次,從來沒有遇到過這樣的問題。

謝謝。

+0

爲什麼您的年齡變量大寫?看起來像一個類型。 – NCFUSN

+0

嗨,謝謝,我把它寫成大寫(沒有明顯的理由:) – sermilion

+0

請注意,你只是NSLogged你的'sql'值你會看到問題出在哪裏。 –

回答

2

documentation說,你不應該使用NSInteger%d

在任何情況下,爲了防止類似和SQL注入攻擊的格式問題,您應該使用參數(含"將使你的代碼的打擊了任何字符串):

NSString *sql = @"INSERT INTO User(firstname,lastname,age,email,password,picture)" 
       " VALUES (?,?,?,?,?,?)"; 
int result = sqlite3_prepare_v2(self.db, [sql UTF8String], -1, &insert, NULL); 
if (result == SQLITE_OK) { 
    sqlite3_bind_text(insert, 1, [firstname UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(insert, 2, [lastname UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_int (insert, 3, Age); 
    sqlite3_bind_text(insert, 4, [email UTF8String],  -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(insert, 5, [password UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(insert, 6, [picture UTF8String], -1, SQLITE_TRANSIENT); 
    result = sqlite3_step(insert); 
    ... 

(你還需要檢查返回值爲sqlite3_step。)