2016-05-14 10 views
0

シンプルなdbの原油に暴力を使用していますが、入力パラメータに一重引用符が含まれているとサイレントエラーの問題があります。例:ユーザーテーブルのO'BrienまたはO'Neillの姓私は二重引用符を使用してクエリ内の一重引用符をエスケープしようとしましたが、これはサイレントフェイルを削除しますが、データベースエントリには姓 "O''Brien"と "O''Neill"が含まれています。一重引用符を逃れるための正しい方法は何ですか?Anorm:エスケープシングルクォート

コードが(すみませんSOでの書式タブでご負担ください)のようになります。

def insertNewUser(user: User): \/[Exception, UUID] = DB.withConnection { implicit connection => 
val updatedRowCount = 
    SQL"""insert into user(id, email, first_name, surname) 
     values (${user.id}::uuid, ${user.email}, ${sanitiseSqlQueryInput(user.firstName)}, 
     ${sanitiseSqlQueryInput(user.surname)})""".executeUpdate() 
updatedRowCount match { 
    case 1 => 
    log.debug(s"New user is successfully created [userId=${user.id.toString}]") 
    \/-(user.id) 
    case _ => -\/(new Exception(s"""Fail to create new user [id=${user.id.toString}] [email=${user.email}] [user=$user]""")) 
}} 

def sanitiseSqlQueryInput(s: String): String = s.replace("'", "''") 

感謝を事前に!

まだコメントできないので、私の反応が制限されることがあります。

答えて

2

SQL補間器を使用する必要はありません。 Anormは準備された文を作成します。結果res0におけるパラメータマッピング注:

scala> val name = "O'Neill" 
name: String = O'Neill 

scala> SQL"""SELECT ${name}""" 
res0: anorm.SimpleSql[anorm.Row] = SimpleSql([email protected],Map(_0 -> ParameterValue(O'Neill)),<function1>,false) 
                       ^
                   // --------------| 

は、あなたは、単に書くことができます。

SQL""" 
    insert into user (id, email, first_name, surname) values 
    (${user.id}, ${user.email}, ${user.firstName}, ${user.surname}) 
    """.executeUpdate() 
関連する問題