gpt4 book ai didi

mysql - 在插入数据库之前清理字符串

转载 作者:行者123 更新时间:2023-11-29 05:28:39 25 4
gpt4 key购买 nike

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

"sqlite near "t": syntax error"

我不知道这是什么意思:-(

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

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

为了解决这个问题,我使用 [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);

问题是它将值插入到它不应该插入的列中。它有点到处都是。知道这里出了什么问题吗?

最佳答案

听起来您执行的查询不正确。没有必要先“ sanitizer ”任何东西。确保您不使用字符串格式来构建查询。相反,请正确使用 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 - 在插入数据库之前清理字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17201133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com