【发布时间】:2013-06-03 06:37:13
【问题描述】:
我正在尝试在我的应用程序中注册一个用户。
我有一个带有 3 textfields (username, password and confirmpassword) 和一个 submit 按钮的视图控制器。
按下提交按钮时会调用以下方法:
-(IBAction)addUser
{
NSString *tempUser,*tempPass, *tempConfPass;
tempUser = [[NSString alloc]init];
tempPass = [[NSString alloc]init];
tempConfPass = [[NSString alloc]init];
tempUser = [NSString stringWithFormat:@"%@",_mUserName.text];
tempPass = [NSString stringWithFormat:@"%@",_mPassword.text];
tempConfPass = [NSString stringWithFormat:@"%@",_mConfPassword.text];
signupUser = [[UseDb alloc]init];
flagUser = [signupUser addNewUser:_mUserName.text:_mPassword.text:_mConfPassword.text];
if(flagUser)
{
myAlertViewUser = [[UIAlertView alloc] initWithTitle:@"Error" message:@"User Added"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[myAlertViewUser show];
}
else {
_mStatus.text = @"failed to add user";
myAlertViewUser = [[UIAlertView alloc] initWithTitle:@"Error" message:@"passwords don't match"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[myAlertViewUser show];
}
}
并且这个方法被addUser方法调用:
-(BOOL)addNewUser:(NSString *)newUser :(NSString *)newPassword :(NSString *)confirmPass
{
NSLog(@"%@....%@...%@",newUser, newPassword, confirmPass);
sqlite3_stmt *statement;
const char *dbpath = [_mDatabasePathDb UTF8String];
if (sqlite3_open(dbpath, &_mDb) == SQLITE_OK && [newPassword isEqualToString:confirmPass] && ![newUser isEqualToString:@""] && ![newPassword isEqualToString:@""])
{
self.userName = [NSString stringWithFormat:@"%@",newUser];
self.password = [NSString stringWithFormat:@"%@",newPassword];
NSString *insertSQL = [NSString stringWithFormat:
@"INSERT INTO USERDETAIL VALUES (\"%@\",\"%@\",\"%@\", \"%@\",\"%@\", \"%@\",\"%@\", \"%@\",\"%@\", \"%@\",\"%@\")",self.userName,self.password,@"",@"",@"",@"",@"",@"",@"",@"",@"" ];
NSLog(@"%@",insertSQL);
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(_mDb, insert_stmt, -1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
return YES;
/* mUserName.text = @"";
mPassword.text = @"";
mConfPassword.text = @""; */
}
else {
NSLog(@"failed to add user");
}
sqlite3_finalize(statement);
sqlite3_close(_mDb);
}
}
在addNewUser方法中,if (sqlite3_step(statement) == SQLITE_DONE)总是出来是false,声明在之前有一些价值
sqlite3_prepare_v2(_mDb, insert_stmt, -1, &statement, NULL);
但是在上面的语句执行完之后变成nil。我不明白为什么会这样。
请帮忙。
【问题讨论】:
-
打印出来看看你得到了什么作为 sqlite3_step(statement)?
-
备注:您不检查
sqlite3_prepare_v2的返回值。sqlite3_step()返回什么?如果是 SQLITE_ERROR,sqlite3_errmsg()告诉你什么? -
请注意,您的 INSERT 语句容易发生 SQL 注入 (xkcd.com/327)。您应该使用
sqlite3_bind_XXX()函数将值绑定到准备好的语句。 -
NSLog(@"%d",sqlite3_step(statement));产生 21。这是什么意思?
-
21 是 SQLITE_MISUSE。这可能意味着创建准备好的语句已经失败。您应该检查 sqlite3_prepare_v2() 的返回值!如果失败,请检查 sqlite3_errmsg()!
标签: ios objective-c xcode4.5