在SQL查询中转义单引号

Lee*_*fin 17 sql escaping ruby-on-rails

我有一个表companies,有两列名为nameaddress.通过运行以下代码,新数据将插入到表中:

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

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

ActiveRecord::Base.connection.execute(query);
Run Code Online (Sandbox Code Playgroud)

如果我将my_name值更改"my company name""John's company",我将收到语法错误.这是因为查询变为:

"INSERT INTO companies (name,address) VALUES ('John's company','ABC');"
Run Code Online (Sandbox Code Playgroud)

并且在其中'John's company'有一个引号.

鉴于我已经为查询字符串定义使用了双引号,我怎样才能摆脱关于我的值中单引号的错误?

mu *_*ort 70

如果必须这样做,那么在连接对象上使用该quote方法:

quote(value,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);
Run Code Online (Sandbox Code Playgroud)

永远不要尝试处理自己的报价.并且不要尝试使用双引号来引用SQL字符串文字,这就是单引号的用途; 双引号用于在大多数数据库中引用标识符(例如表名和列名),但MySQL使用反引号.