sql - 在 Swift 中,使用带有撇号的 SQL 查询

标签 sql swift

我有一个用户破坏了我原本可以正常工作的代码,我认为这是因为他的名字有一个撇号。我尝试使用双撇号和反斜杠转义它,但我不断收到 fatal error: unwhile unwrapping an Optional value 时意外发现 nil。

    let querySQL = "SELECT name from member_data ORDER BY RANDOM() LIMIT 1" 
    rightAnswer = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: nil)
    rightAnswer!.next()
    correctName = rightAnswer!.stringForColumn("name")!
    println("Correct answer is \(correctName)") 
      //prints as Optional("Sam O\'Neal")
    let sanitizedName = correctName?.stringByReplacingOccurrencesOfString("'", withString: "\'")   
      //tried many combinations of this
    let wrongAnswerSQLQuery = "SELECT name from member_data where name is not '\(sanitizedName)' LIMIT 3"
    let wrongAnswersResultSet:FMResultSet = memberDatabase!.executeQuery(wrongAnswerSQLQuery, withArgumentsInArray: nil)

最佳答案

存在三个问题:

  1. 您在 SQL 中使用了 C 风格的转义符。 SQLite documentation

    A string constant is formed by enclosing the string in single quotes ('). A single quote within the string can be encoded by putting two single quotes in a row - as in Pascal. C-style escapes using the backslash character are not supported because they are not standard SQL.

    所以用''替换'字符:

    let sanitizedName = correctName?.stringByReplacingOccurrencesOfString("'", withString: "''")
    
  2. 您的 sanitizedName 是可选的,因此您必须将其解包,否则它将显示为 Optional(...):

    let wrongAnswerSQLQuery = "SELECT name from member_data where name is not '\(sanitizedName!)' LIMIT 3"
    
  3. 更好的是,您应该快刀斩乱麻,根本不要使用这样的字符串值构建 SQL 语句。

    相反,您应该在 SQL 中使用 ? 占位符,然后在 withArgumentsInArray 中传递 correctName。那么你根本不必担心做任何这种“ sanitizer ”:

    let wrongAnswerSQLQuery = "SELECT name from member_data where name is not ? LIMIT 3"
    let wrongAnswersResultSet = memberDatabase!.executeQuery(wrongAnswerSQLQuery, withArgumentsInArray: [correctName!])
    

关于sql - 在 Swift 中,使用带有撇号的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857759/

相关文章:

ios - 在 Swift 中检查 isKindOfClass 到字典

mysql - 每个类别选择 5 个子类别

Swift/OSX - 如何在不运行应用程序的情况下授予单元测试核心数据访问权限并运行测试

java - 如何使用 Java NamedParameterJdbcTemplate 查询潜在的空值

mysql - 仅选择存在的列

iOS Swift 复合谓词

ios - Swift iOS 中的屏幕截图?

ios - 在 Sprite 工具包中将文本写成一个圆圈(swift)

mysql - 如何使用 MySQL SELECT 创建具有多个值的虚拟列?

sql插入和更新问题..一条语句中的多个查询