gpt4 book ai didi

ios - 如何在 Flutter 中使用 sqflite 插入特殊字符?

转载 作者:IT王子 更新时间:2023-10-29 07:00:25 25 4
gpt4 key购买 nike

我想在 Flutter 中用 sqflite 保存 html 字符串。

但是在html String中有很多特殊字符,比如'?','=','&'……

它会抛出如下错误:DB Error: 1 "near "?": syntax error"。

我用的是iOS模拟器,所以是基于FMDB的。

这是我的代码:

await database.execute("INSERT INTO ChapterCache(bookName,chapterName,content) select '$bookName','$chapterName','$content' where not exists (select * from ChapterCache where bookName = '$bookName' and chapterName='$chapterName')");

最佳答案

我不确定您的查询应该做什么,它看起来有点奇怪,尤其是第一个 select 语句。我想您只想在数据库不存在的情况下向数据库中插入新行。

总的来说,你的所作所为是非常危险的!黑客可以使用 SQL 注入(inject)轻松劫持您的数据库。

要解决您的问题并消除 SQL 注入(inject)的危险,您必须在插入查询中使用准备好的语句 (? 占位符,然后将值作为单独的列表提供。这将还允许您将特殊字符插入数据库。

sqflite 会自动为您执行此操作。向数据库中插入新行的最安全方法:

final values = <String, dynamic>{
'bookName': bookName,
'chapterName': chapterName,
'content': content,
};

await database.insert('ChapterCache', values, conflictAlgorithm: ConflictAlgorithm.ignore);

如果该行不存在,这将插入该行,如果它已经存在,则不执行任何操作(忽略)。


另外,您可能想为您的表设置一个复合主键:

CREATE TABLE `ChapterCache` (
`bookName` text NOT NULL,
`chapterName` text NOT NULL,
`content` text NOT NULL,
PRIMARY KEY(`bookName`, `chapterName`)
)

这将确保 bookName-chapterName 的每个组合只存在一行。


现在,如果您想编写自己的 SQL 查询来执行与上面的 insert 调用完全相同的操作,那么您可以安全地执行此操作:

await database.execute(
"INSERT OR IGNORE INTO `ChapterCache` (`bookName`, `chapterName`, `content`) VALUES (?, ?, ?)",
[bookName, chapterName, content],
);

关于ios - 如何在 Flutter 中使用 sqflite 插入特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51935560/

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