SQLite SELECT не работает в Ruby при использовании со строкой захвата regex, но работает со строковым литералом - PullRequest
1 голос
/ 09 июля 2011

Я использую следующее регулярное выражение для захвата, чтобы соответствовать сообщению 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.

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Я решил использовать интерполяцию строк вместо заполнителей.

 db.execute("SELECT * FROM users WHERE nick = '#{SQLite3::Database.quote m[:nick]}'")
0 голосов
/ 09 июля 2011

Некоторые библиотеки баз данных, такие как ActiveRecord, позволяют предотвращать инъекцию SQL с помощью «?» в качестве заполнителя. Я не уверен, какую библиотеку базы данных вы используете, но она может не поддерживать этот тип интерполяции строк. Даже если это так, возможно, ему все еще нужно иметь "?" в кавычках.

...