1

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

"sqlite near "t": syntax error"

我不知道这意味着什么:-(

背景:我mysql_real_escape_string用来“清理”来自在线表单的数据(表单提示用户将他们的信息输入到文本字段中并按“提交”) - 这非常有效:它允许所有单一和双引号字符被接受并无错误地输入数据库。

接下来,我的 iPhone 应用程序查询这个数据库并解析传入的数据 - 有趣的是,我得到 \" 和 \' 到处都是(如:don\'t 或 \"The Odyssey\" 而不是不要或“奥德赛”)

为了解决这个问题,我使用[stringVar stringByReplacingOccurrencesOfString:@"\\" withString:@""]- 所以我基本上用无空格替换所有斜线 - 这非常有效(我得到:不要 +“The Odyssey”。)

但是,当我现在尝试将这个新下载和解析的数据写入我的设备上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);

问题在于它将值插入到不应插入的列中。它有点到处都是。有什么想法吗?

4

1 回答 1

3

听起来您执行查询不正确。没有必要先“消毒”任何东西。确保您不使用字符串格式来构建您的查询。相反,请正确使用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);
}

wheresomeValueotherValueNSString对象。文本可以包含任何 Unicode 文本。的使用sqlite_bind_text负责转义任何需要转义的字符。

稍后,当您使用 读取查询中的值时sqlite3_column_text,您将返回原始文本。

于 2013-06-19T21:12:48.167 回答