Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中,使用带撇号的SQL查询_Sql_Swift - Fatal编程技术网

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

在Swift中,使用带撇号的SQL查询,sql,swift,Sql,Swift,我有一个用户正在破坏我的工作代码,我想这是因为他的名字有一个撇号。我曾尝试使用双撇号和反斜杠来转义它,但我一直遇到致命错误:在展开可选值时意外发现nil let querySQL = "SELECT name from member_data ORDER BY RANDOM() LIMIT 1" rightAnswer = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: nil) rightAns

我有一个用户正在破坏我的工作代码,我想这是因为他的名字有一个撇号。我曾尝试使用双撇号和反斜杠来转义它,但我一直遇到
致命错误:在展开可选值时意外发现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)

有三个问题:

  • 您正在SQL中使用C样式的转义。警察说

    字符串常量是通过将字符串括在单引号(')中形成的。字符串中的一个单引号可以通过将两个单引号放在一行中进行编码,就像在Pascal中一样。不支持使用反斜杠字符的C样式转义,因为它们不是标准SQL

    因此,将
    '
    字符替换为
    '

  • 您的
    sanitizedName
    是可选的,因此您必须将其展开,否则它将显示为
    可选(…)

  • 更好的是,您应该省去麻烦,而不是像这样用字符串值构建SQL语句

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


  • 啊,太好了!值得一提的是,我确实尝试将撇号加倍,但没有成功(以防其他人尝试)。第三种解决方案显然是最好的——谢谢!是的,如果你走那条路的话,你必须同时做可选的折叠和展开。但正如您所说,使用
    占位符的方法是最好的。
    let sanitizedName = correctName?.stringByReplacingOccurrencesOfString("'", withString: "''")
    
    let wrongAnswerSQLQuery = "SELECT name from member_data where name is not '\(sanitizedName!)' LIMIT 3"
    
    let wrongAnswerSQLQuery = "SELECT name from member_data where name is not ? LIMIT 3"
    let wrongAnswersResultSet = memberDatabase!.executeQuery(wrongAnswerSQLQuery, withArgumentsInArray: [correctName!])