2011-03-31 124 views
5

我想根据用户提供的文本在SQLite数据库中创建一个表。一切工作正常,除了当我试图在文本内添加一个撇号(这是新的表名)。经过研究,我确定我在做什么是很容易受到注入是不是最好的做法:用撇号安全地插入SQLite数据库的数据

const char *sqlStr = [[NSString stringWithFormat:@"CREATE Table '%@' ('Name' 'char(50)','ID' 'integer')",theString]UTF8String]; 

所以我试图找到一种方法,以允许包含在表名撇号,安全地插入值存入数据库。我已经阅读过有关绑定值的信息,但是可以使用'CREATE TABLE'语句吗?或者仅当您将数据插入到已经存在的表中时?

感谢您的帮助。

+0

我不会建议允许用户或命名列的其他一些动态的方式。如果有什么名称的列custom1。 – Joe 2011-03-31 13:35:02

+0

嗨乔,我想让用户在数据库中创建表名称,而不是列,这些不会改变。使用撇号时,我只是不知道这样做的最佳方式。 – Ryan 2011-03-31 13:44:06

+1

如果您使用[FMDB](http://github.com/ccgus/FMDB),那么它将在执行您的SQL(提供您使用它的API进行替换)之前为您处理所有必要的转义。我*高度*建议您检查一下。 – 2011-03-31 15:19:05

回答

10

documentation

字符串常量被包围在单引号(')的字符串形成。字符串中的单引号可以通过将两个单引号放在一行中进行编码 - 就像在Pascal中一样。

这样:

[theString stringByReplacingOccurrencesOfString:@"'" withString:@"''"]; 
+0

我已经用它来插入值,但是当我试图从数据库中检索它时,它给了我空行。像''Select *从TABLE WHERE Name ='tom''s'“' – 2017-06-26 10:45:33