与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用
Posted
技术标签:
【中文标题】与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用【英文标题】:SQLite SELECT not working in Ruby when used with regex capture string, but works with string literal 【发布时间】:2011-07-08 20:33:47 【问题描述】:我正在使用以下正则表达式来捕获以匹配 IRC PART 消息:
:(?<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
有效,并输出正确的字符串。但是第二个puts
没有输出任何东西。我知道表格中存在尼克捕获。每当我使用文字字符串而不是 m[:nick]
时,它都可以正常工作。我正在使用sqlite3-ruby Gem 来操作数据库。
这是收到 PART 消息时的完整输出:
>> :mark!~mark@Mark-Szymanskis-MacBook.local PART #testing :mark
mark has parted.
【问题讨论】:
尝试删除记录而不是选择它,如果记录被删除,请检查数据库。 @user482594 那也行不通。 我认为使用#query 会起作用,但它仍然不起作用。 投反对票的人能解释一下吗? 【参考方案1】:我决定使用字符串插值而不是占位符。
db.execute("SELECT * FROM users WHERE nick = '#SQLite3::Database.quote m[:nick]'")
【讨论】:
【参考方案2】:一些数据库,例如 ActiveRecord 允许使用“?”来防止 SQL 注入。作为占位符。我不确定您使用的是什么数据库库,但它可能不支持这种类型的字符串插值。即使有,它可能仍然需要有“?”用单引号括起来。
【讨论】:
围绕 ?用单引号给我一个错误:/Users/mark/.rvm/gems/ruby-1.9.2-p180/gems/sqlite3-1.3.3/lib/sqlite3/statement.rb:41:in 'bind_param': bind or column index out of range (SQLite3::RangeException)
。另外,我说我在我的问题中使用了sqlite-3
ruby 库。
另外,我很确定情况并非如此,因为用文字字符串替换 m[:nick]
效果很好。
您可以尝试通过“#to_s”方法将结果对象显式转换为字符串。它可能是 MatchData 类:m[:nick].to_s,或 "#m[:nick]"
当使用#m[:nick]
将字符串直接放入查询中时,它可以工作。但我宁愿不必这样做以防止 SQL 注入。以上是关于与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用的主要内容,如果未能解决你的问题,请参考以下文章