У меня есть строка в Ruby формы: "Henry string"
Каждый gsub
и tr
который я пробовал, дают мне такие формы, как "Henry\\ string"
, "Henry\\\\ string"
и т.д.
Все это ускользает от обратных косых черт, но оставляет меня с невыраженной одиночной цитатой.
Я пробовал:
"Henry string".gsub("'","\\\\'")
с переменным числом \
"Henry string".gsub(/'/) {|x| "\\\\#{x}"}
"Henry string".gsub(/'/) {|x| "\\\\#{x}"}
снова с переменным числом \
"Henry string".gsub(/'/) {|x| "\\#{x}"}.gsub(/\\/) {|x| "#{x}"}
Я думаю, мне нужно нечетное число \
полностью избежать "(для загрузки в MySQL), но я не могу понять, как это получить.
При вставке в базу данных, например MySQL, важно использовать подготовленные операторы с значениями-заполнителями. Я сделал это смелым, потому что это очень важно для понимания. Все, что требуется, - это один маленький промах, и вы создали отверстие для инъекций SQL, которое любой может использовать, и это может быть чрезвычайно вредным.
Экранирование строки может показаться поверхностно простым, но это не так. Там много причудливых краевых дел, которые вам нужно прикрыть, детали которых слишком сложны, чтобы упомянуть здесь в кратком ответе.
Простое решение - не беспокоить экранирование вообще, вместо этого писать запросы этой формы:
INSERT INTO table_name (column_name) VALUES (?)
Где ?
представляет данные, которые вы вставляете. Вы можете использовать их, например, с драйвером mysql2
следующим образом:
stmt = @client.prepare("INSERT INTO table_name (column_name) VALUES (?)")
stmt.execute("Henry string")
Если этот драйвер позаботится о правильном кодировании значений, вам не придется беспокоиться об этом.
Вы также можете использовать что-то вроде Sequel или ActiveRecord, которые еще больше упрощают работу.
@client.escape
а не @client.escape
делать это вручную с помощью String#gsub
чтобы вы @client.escape
это правильно.