人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Adobe AIR2.0でのSQLite使用について質問です。

DBのテーブル上を検索する際にLIKEを使ったSELECT文を作ろうと思いましたが、parametersプロパティを使用した場合の「あいまいな検索」のコーディングの仕方が判りません。

例えば、任意のカラムを対象に、「Google」と「Yahoo」というレコードがあったとします。普通検索エンジンで「oo」と打つと、両方ヒットすると思います。

これを、決め打ちでやるのであれば、

SELECT * FROM tableName WHERE columnName LIKE “%oo%”

となりますが、

SELECT * FROM tableName WHERE columnName LIKE “%?%”

として、パラメータを

SQLStatement.parameters[0] = "oo";

のようにparametersを使用すると、インデックスだったら「?の近くが違う」とか、名前での引数だったら「:paramの近くが違う」とか、エラーが出てしまいます。

SELECT * FROM tableName WHERE columnName LIKE “%” + searchWord.text + “%”

という風にステートメント文を動的に構築してやれば大丈夫なのですが、これはセキュリティ的にいかがなものかと・・・。

もしご存知の方がいらっしゃればご教授いただきたいと思います。よろしくお願いします。

●質問者: Hiiragi3
●カテゴリ:コンピュータ インターネット
✍キーワード:2.0 Adobe AIR dB Google SELECT
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● yamaneroom
●35ポイント

>これはセキュリティ的にいかがなものかと・・・

入力キーワードをきちんとエスケープしてやれば問題ない。

http://rubyist.g.hatena.ne.jp/edvakf/20090504/1241385507

◎質問者からの返答

なるほど・・・。

SELECT * FROM tableName WHERE columnName LIKE ? ESCAPE '$'

SQLStatement.parameters[0] = "%" + escapeFunc(searchWord.text) + "%";

っていう感じにして、escapeFuncの中で「%」と「_」を指定したエスケープ文字でエスケープさせて、ステートメントに合体させるという感じでしょうか。

function escapeFunc(originalString: String): String

{

return originalString.replace(/([%|_])/g, "$$$1");

}

これで無事できました。ありがとうございます。他にも案がありましたら、是非教えていただきたいと思いますのでよろしくお願いします。


2 ● うぃんど
●35ポイント ベストアンサー

%も一緒に送るようにしてやると良いでしょう

sqlStatement.text = "SELECT * FROM tableName WHERE columnName LIKE ?";
sqlStatement.parameters[0] = "%oo%";

いくつものパラメータが存在する場合や将来のメンテナンスや再利用を考慮して、何がしか命名しておくほうが良いかもしれません

sqlStatement.text = "SELECT * FROM tableName WHERE columnName LIKE :searchStr";
sqlStatement.parameters[":searchStr"] = "%oo%";
◎質問者からの返答

ふむふむ、ステートメント上で必ずしも%を付ける必要はなく、むしろparametersの方でつければ大丈夫ということですね。なるほど。

なんとなく見えてきました。今までステートメントに何が何でも%を入れて、parametersの中には必ず「入力された文字」のみを入れなければならないと思い込んでいましたが、そういうことはないのですね。言われてみれば確かにその通りかー・・・。

となると、この方法なら、自前エスケープ関数は必要ないんですかね。そのためのparametersプロパティですし。

sqlStatement.text = "SELECT * FROM tableName WHERE columnName LIKE ?";

sqlStatement.parameters[0] = "%" + searchWord + "%";

っていう感じで。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ