如何在 Flutter 中使用 sqflite 插入特殊字符?
How to insert special character with sqflte in Flutter?
我想在 Flutter 中使用 sqflite 保存 html 字符串。
但html字符串中有很多特殊字符,如'?','=','&'......
它会抛出类似这样的错误: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')");
我找到了一种从字符串中删除这些特定 HTML 标签并使其成为平面文本的方法。
可以参考
我想这正是你想要的
您可以删除这些标签并将字符串插入数据库
我不确定你的查询应该做什么,它看起来有点奇怪,尤其是第一个 select 语句。我想你只想在数据库不存在的情况下向数据库中插入一个新行。
总的来说,你的所作所为是很危险的!黑客可以使用 SQL 注入轻松劫持您的数据库。
要解决您的问题,并消除 SQL 注入的危险,您必须使用准备好的语句(?
插入查询中的占位符,然后将值作为单独的列表提供.这也将允许您将特殊字符插入到数据库中。
sqflite 会自动为您执行此操作。向数据库中插入新行的最安全方法:
final values = <String, dynamic>{
'bookName': bookName,
'chapterName': chapterName,
'content': content,
};
await database.insert('ChapterCache', values, conflictAlgorithm: ConflictAlgorithm.ignore);
如果该行不存在,这将插入该行,如果它已经存在,则不执行任何操作(忽略)。
此外,您可能想为 table:
设置复合主键
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],
);
我想在 Flutter 中使用 sqflite 保存 html 字符串。
但html字符串中有很多特殊字符,如'?','=','&'......
它会抛出类似这样的错误: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')");
我找到了一种从字符串中删除这些特定 HTML 标签并使其成为平面文本的方法。
可以参考
我想这正是你想要的
您可以删除这些标签并将字符串插入数据库
我不确定你的查询应该做什么,它看起来有点奇怪,尤其是第一个 select 语句。我想你只想在数据库不存在的情况下向数据库中插入一个新行。
总的来说,你的所作所为是很危险的!黑客可以使用 SQL 注入轻松劫持您的数据库。
要解决您的问题,并消除 SQL 注入的危险,您必须使用准备好的语句(?
插入查询中的占位符,然后将值作为单独的列表提供.这也将允许您将特殊字符插入到数据库中。
sqflite 会自动为您执行此操作。向数据库中插入新行的最安全方法:
final values = <String, dynamic>{
'bookName': bookName,
'chapterName': chapterName,
'content': content,
};
await database.insert('ChapterCache', values, conflictAlgorithm: ConflictAlgorithm.ignore);
如果该行不存在,这将插入该行,如果它已经存在,则不执行任何操作(忽略)。
此外,您可能想为 table:
设置复合主键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],
);