2017-10-14 3 views
0

私はようでクエリを取得し、このようにしてみてくださいしたい:FMDBクエリのテキストと同様の使い方iOS Swift 4?

let name = "pp" //apple 

let db = openDB() 
    do { 
     var queryString = "select * from products where name like '%?%' and deleted = 0 order by id desc" 
     let rs = try db.executeQuery(queryString, values:[name]) 
     var arr:Array<Product> = [] 
     while rs.next() { 
     arr.append(parseProductDB(rs)) 
     } 
     closeDB(db) 
} catch { 
     print("failed: \(error.localizedDescription)") 
     closeDB(db) 
} 

が、それは動作しません。

答えて

0

sql文のパラメータを?このように、SQLのワイルドカード文字を使用して渡された値をラップ:

let name = "%pp%" 
... 
var queryString = "select * from products where name like ? and deleted = 0 order by id desc" 

理由はSQLiteの中で、おそらく他のすべてのSQLエンジンにパラメータがその値との情報を入力から成る完全なエンティティです。だから'%?%'のような引用符( ')内のパラメータをラップすることは決して必要ではなく、実際には間違った方法です。 likeオペレータは、必要に応じてSQLワイルドカード文字を含む可能性のあるオペランドとしての文字列式だけを想定しています。だから、ワイルドカード文字(%、_など)が埋め込まれた文字列式を作成し、必要に応じてステートメントに渡すだけでよい。

希望します。

+0

は、それは本当にあなたのために働いたのですか?私も前に同じ問題に直面した –

+0

@JitendraModi私のために働いていない。 –

+0

私はそれが動作していないが、この解決策が私の問題を解決することができる場合は知っている。私も/%pp /%のようにしようとしましたが、目的の出力が得られませんでした。回答や解決策が見つかったら、私のような人のためにここに投稿してください。 @reza_khalafi –

0

ただ、この方法を試してください。

let db = openDB() 
do { 
    var queryString = 
    queryString = String(format:"select * from products where name like '%%%@%%' and deleted = 0 order by id desc",name) 
    let rs = try db.executeQuery(queryString, values:nil) 
    var arr:Array<Product> = [] 
    while rs.next() { 
    arr.append(parseProductDB(rs)) 
    } 
    closeDB(db) 

} catch { 
      print("failed: \(error.localizedDescription)") 
      closeDB(db) 
} 
+0

@JitendraModiこれを試してください。それは作品です。 –

+0

でも、動作していても、コードのように常にパラメータを使用してください。これにより、コードの潜在的なスクリプトインジェクションに対する脆弱性が緩和され、データベースでより速く実行される準備済みのクエリ文を作成する機会が与えられます。 –

関連する問題