在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)
有三个问题:
'
字符替换为'
:
sanitizedName
是可选的,因此您必须将其展开,否则它将显示为可选(…)
:
?
占位符,然后在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!])