2011-07-08 6 views
1

私はIRC PARTメッセージを一致させるためにキャプチャするために、次の正規表現を使用しています:正規表現のキャプチャ文字列で使用した場合のSQLite SELECTはRubyで動作していないが、文字列で動作しますリテラル

:(?<nick>[a-zA-Z\d<\-\[\]\\^{}_]+)!(.+)@(.+) PART (?<chan>[#&][^\x07\x2C\s]{0,200}) :(.+) 

それは正しくグループと一致し、キャプチャ

part_regex.match resp do |m| 
    puts "#{m[:nick]} has parted." 
    puts db.execute("SELECT * FROM users WHERE nick = ?", m[:nick]) 
end 

最初puts作品を、そして正しい文字列を出力します、このコードが実行されるためとき。しかし、2番目のputsは何も出力しません。私はニックのキャプチャがテーブルに存在することを知っています。 m[:nick]の代わりにリテラル文字列を使用するときはいつでもうまく動作します。私はデータベースを操作するためにsqlite3-ruby Gemを使用しています。

>> :[email protected] PART #testing :mark 
mark has parted. 
+0

レコードを選択する代わりに削除し、レコードが削除されているかどうかを確認してください。 – user482594

+0

@ user482594それでもうまくいきません。 –

+0

私は#queryを使用するとうまくいくと思いましたが、まだそれはありません。 –

答えて

0

などのActiveRecordを使用してSQLインジェクションの防止を可能にするなど、一部のデータベースライブラリ、「は?」:それはPARTメッセージを受信するたびにここで

はフル出力でありますプレースホルダとして。どのデータベースライブラリを使用しているのかよく分かりませんが、このタイプの文字列補間をサポートしていない可能性があります。たとえそれがあっても、それでも "?"一重引用符で囲まれています。

+0

?一重引用符で '/Users/mark/.rvm/gems/ruby-1.9.2-p180/gems/sqlite3-1.3.3/lib/sqlite3/statement.rb:41:in 'bind_param'というエラーが表示されます。範囲外のバインドまたはカラムインデックス(SQLite3 :: RangeException) 'また、私は私の質問に 'sqlite-3' ruby​​ライブラリを使用していると述べました。 –

+0

また、 'm [:nick]'をリテラル文字列に置き換えると完全に動作するので、これは当てはまりません。 –

+1

「#to_s」メソッドを使用して、結果のオブジェクトをStringに明示的にキャストすることができます。クラスMatchData:m [:nick] .to_s、または "#{m [:nick]}" –

1

プレースホルダの代わりに文字列補間を使用することにしました。

db.execute("SELECT * FROM users WHERE nick = '#{SQLite3::Database.quote m[:nick]}'") 
関連する問題