You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift插入API返回数据到数据库时出现语法错误求助

解决SQL插入语句的语法错误问题

问题分析

你遇到的near "Wall": syntax error错误,根本原因不是特殊字符,而是字符串类型的字段值没有用单引号包裹。比如你的sourceName是"The Wall Street Journal",直接通过NSString(format:)拼接后,SQL语句会变成:

insert into newsData (sourceName, authorName, title, description, url, urlToImage, publishedAt) values (The Wall Street Journal, Joanne Chiu, ...)

数据库解析时会把The当成关键字,后面的Wall就成了无效语法,自然报错。

而且这种直接拼接字符串的写法还存在严重的SQL注入风险,绝对不推荐在生产环境使用。

解决方案:使用参数化查询(Prepared Statements)

正确的做法是用参数化查询,让数据库自己处理字符串的引号和转义,同时避免注入风险。下面给你两种常见的实现方式:

方式1:使用原生SQLite API(Objective-C)

// 假设你已经有一个打开的SQLite数据库指针db
const char *insertSql = "insert into newsData (sourceName, authorName, title, description, url, urlToImage, publishedAt) values (?, ?, ?, ?, ?, ?, ?)";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, insertSql, -1, &stmt, NULL) == SQLITE_OK) {
    // 绑定参数,注意索引从1开始
    sqlite3_bind_text(stmt, 1, [sourceName UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 2, [authorName UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 3, [title UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 4, [description UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 5, [url UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 6, [urlToImage UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 7, [publishedAt UTF8String], -1, SQLITE_TRANSIENT);
    
    if (sqlite3_step(stmt) != SQLITE_DONE) {
        NSLog(@"插入失败:%s", sqlite3_errmsg(db));
    }
    sqlite3_finalize(stmt);
} else {
    NSLog(@"准备语句失败:%s", sqlite3_errmsg(db));
}

方式2:使用FMDB(更简洁的第三方库)

如果你用FMDB来简化SQLite操作,代码会更清晰:

// 假设db是FMDatabase实例,且已打开
BOOL success = [db executeUpdate:@"insert into newsData (sourceName, authorName, title, description, url, urlToImage, publishedAt) values (?, ?, ?, ?, ?, ?, ?)",
                sourceName, authorName, title, description, url, urlToImage, publishedAt];
if (!success) {
    NSLog(@"插入失败:%@", [db lastError]);
}

为什么不能直接拼接字符串?

除了语法错误,直接拼接用户输入(或API返回的不确定内容)会导致SQL注入攻击。比如如果某个字段值包含' OR 1=1 --,会篡改你的SQL逻辑,带来安全隐患。参数化查询从根源上解决了这个问题。

内容的提问来源于stack exchange,提问作者Meenor Ranpura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:08:13