Выключение единой цитаты в SQL-запросе

У меня есть таблица companies, которая имеет два столбца с именем name и address. Запустив следующий код, новые данные вставляются в таблицу:

my_name = "my company name"
my_address = "ABC"

query = "INSERT INTO companies (name,address) VALUES ('#{my_name}','#{my_address}');"

ActiveRecord::Base.connection.execute(query);

Если я изменяю значение my_name от "my company name" до "John company", я получу синтаксическую ошибку. Это происходит потому, что запрос становится:

"INSERT INTO companies (name,address) VALUES ('John company','ABC');"

и 'John company' содержит в себе одну кавычку.

Учитывая, что я уже использовал двойную кавычку для определения строки запроса, как я могу избавиться от этой ошибки в отношении одиночной кавычки в моем значении?

Ответы

Ответ 1

Если вы должны сделать это таким образом, используйте quote метод для объекта соединения:

quote (значение, column = nil)
Выводит значение столбца, чтобы предотвратить атаки SQL-инъекций.

Так что-то вроде этого:

my_name    = ActiveRecord::Base.connection.quote("John O'Neil")
my_address = ActiveRecord::Base.connection.quote("R'lyeh")

query = "INSERT INTO companies (name,address) VALUES (#{my_name}, #{my_address})"

ActiveRecord::Base.connection.execute(query);

Никогда не пытайтесь обрабатывать свои собственные цитаты. И не пытайтесь использовать двойные кавычки для цитирования строкового литерала SQL, для чего нужны одинарные кавычки; двойные кавычки предназначены для цитирования идентификаторов (таких как имена таблиц и столбцов) в большинстве баз данных, но MySQL использует обратные ссылки для этого.