Экранирование одной цитаты в запросе SQL - PullRequest
17 голосов
/ 18 ноября 2011

У меня есть таблица 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's company", я получу синтаксическую ошибку.Это связано с тем, что запрос становится следующим:

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

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

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

1 Ответ

69 голосов
/ 18 ноября 2011

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

цитата (значение, столбец = ноль)
Заключает в кавычки значение столбца, чтобы помочь предотвратить атаки с использованием 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 использует для этого обратные ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...