尝试将数据插入到我的sqlite数据库时出现以下错误:

"sqlite near "t": syntax error"

我不知道这是什么意思:-(
背景:我正在使用mysql_real_escape_string来“清理”来自在线表单的数据(表单会提示用户将其信息输入文本字段并按“提交”)——这非常有效:它允许接受所有单引号和双引号字符,并将其输入数据库而不出错。
接下来,我的iPhone应用程序会查询这个数据库并解析传入的数据,有趣的是,然后我会得到“和”所有的地方(比如:不要或“奥德赛”而不是“不”或“奥德赛”)
为了解决这个问题,我使用了[stringVar stringByReplacingOccurrencesOfString:@"\\" withString:@""]-所以我基本上是用没有空格的斜线替换所有斜线-这非常有效(我得到:不要+“奥德赛”。)
但是,当我现在尝试去写这个新下载和分析的数据到我的设备上的sqlite数据库-应用程序崩溃。我很肯定这和所有的单双引号,斜线,还有谁知道还有什么关系。
为了测试,我创建了一些不包含任何这些复杂字符的快速虚拟数据,将其插入数据库(在运行时),一切正常-应用程序没有崩溃,设备上的sqlite数据库显示一切正常-所以我很确定我的sqlite数据库没有问题,我的sql语句等。一定是下载的数据/字符串仍然以某种方式损坏。
不用说,我不是SQL专家——我基本上只知道最起码的一点,并且在学习的过程中努力学习。我已经研究过这个问题,并认为我找到了mysql_real_escape_string的解决方案,但似乎只有一种方法有效——除了我需要往返解决方案。
有什么建议吗?
======================================
编辑1-这是我正在使用的代码-一个混合的建议和我在这本iPhone书里发现的东西:
NSString *sqlString = [NSString stringWithFormat:@"INSERT OR REPLACE INTO '%@' ('%@', '%@', '%@', '%@') VALUES (?, ?, ?, ?)", tableName, @"Title", @"Source", @"Date", @"StoryCopy"];

NSLog(@"The sql string is = '%@'", sqlString);
const char *sql = [sqlString UTF8String];
sqlite3_stmt *stmt;
int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
if (rc == SQLITE_OK) {
    sqlite3_bind_text(stmt, 0, [sTitle UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 1, [sSource UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 2, [sDate UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 3, [sCopy UTF8String], -1, SQLITE_TRANSIENT);
}

if (sqlite3_step(stmt) != SQLITE_DONE) {
    NSAssert(0, @"Error updating table!!!");
}

sqlite3_finalize(stmt);

问题是它将值插入到不应该插入的列中。到处都是。有什么问题吗?

最佳答案

听起来您的查询执行不正确。没有必要先“消毒”任何东西。确保不使用字符串格式来构建查询。相反,正确使用sqlite3_bind_xxx函数。
例子:

sqlite3_stmt *stmt;
int rc = sqlite3_prepare_v2(dbHandle, "INSERT INTO table_name (field1, field2) VALUES (?, ?)", -1, &stmt, nil);
if (rc == SQLITE_OK) {
    sqlite3_bind_text(stmt, 1, [someValue UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 2, [otherValue UTF8String], -1, SQLITE_TRANSIENT);
}

其中someValueotherValueNSString对象。文本可以包含任何Unicode文本。使用sqlite_bind_text可以转义需要转义的任何字符。
稍后,当您使用sqlite3_column_text从查询中读取值时,将返回原始文本。

关于mysql - 插入数据库之前先对字符串进行 sanitizer ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17201133/

10-12 21:28
查看更多