Запись в файл команд mysql с рубином

Я использую программу, которая пишет команды sql в файле.

Программа находится в рубине. Я узнал, что он не избегает особых специальных символов.

Я нашел функцию, которая выполняет экранирование, но не совсем корректна.

def escape_for_sql(s)
 s=s.to_s
 if s.nil?
 "''"
 else
 "'"+ s.gsub("'","\'")+"'"
 end
end

Никогда не использовал рубин раньше, так кто-то может предоставить мне правильную функцию или даже лучше сказать мне, есть ли какой-либо встроенный метод?

ps Я не могу установить какой-либо внешний модуль

1 ответ

Предполагая, что вы просто хотите, чтобы этот метод преобразовывал вхождения ' в строке s в \', это должно работать:

def escape_for_sql(s)
 s=s.to_s
 if s.nil?
 "''"
 else
 "'" + s.gsub("'") { %q{\'} } + "'"
 end
end

puts escape_for_sql "hello, this 'is' a string"
# => 'hello, this \'is\' a string'

В исходном методе замена была заключена в двойные кавычки, поэтому обратная косая черта не вставлена.

РЕДАКТИРОВАТЬ

Примечание. Чтобы заменить все специальные символы MySQL, сделайте что-то вроде ниже. Я включил только некоторые специальные символы MySQL - для полного просмотра списка http://dev.mysql.com/doc/refman/5.0/en/string-literals.html. Также обратите внимание, что существуют проблемы с безопасностью при использовании настраиваемого метода экранирования.

def escape_for_sql(s)
 s=s.to_s
 if s.nil?
 "''"
 else
 literals = %w{ % ' " \r \n }
 literals.each do |x|
 s.gsub!(/#{x}/) { '\\' + x }
 end
 "'" + s + "'"
 end
end

licensed under cc by-sa 3.0 with attribution.