【问题标题】:Safely inserting data into SQLite database with apostrophe使用撇号安全地将数据插入 SQLite 数据库
【发布时间】:2011-07-26 21:40:53
【问题描述】:

我正在尝试根据用户提供的文本在 SQLite 数据库中创建一个表。一切正常,除非我尝试在文本中添加撇号(这是新的表名)。经过研究,我确定我所做的不是最佳实践,因为容易被注入:

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

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

感谢您的帮助。

【问题讨论】:

  • 我不建议允许用户或其他一些动态方式命名列。如果有的话,将列命名为 custom1。
  • 嗨,乔,我想让用户在数据库中创建表名,而不是列,这些是不可更改的。我只是不知道在使用撇号时最好的方法。
  • 如果您使用FMDB,那么它将在执行您的 SQL 之前为您处理所有必要的转义(前提是您使用它的 API 进行替换)。我强烈建议您检查一下。

标签: iphone sqlite


【解决方案1】:

来自documentation

字符串常量是通过用单引号 (') 将字符串括起来形成的。字符串中的单引号可以通过将两个单引号放在一行中来编码 - 就像在 Pascal 中一样。

因此:

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

【讨论】:

  • 我用它来插入值,但是当我试图从数据库中检索它时,它给了我空白行。喜欢"Select * From TABLE WHERE Name = 'tom''s'"
  • @User_1191# Do this instead t = ("tom's",) c.execute('SELECT * FROM stocks WHERE symbol=?', t)
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多