我有一个表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'
中有一个引号。
鉴于我已经为查询字符串定义使用了双引号,我如何摆脱关于我的值中单引号的错误?
答案 0 :(得分:68)
如果您必须这样做,请使用连接对象上的quote
method:
引用(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);
永远不要尝试处理自己的引用。并且不要尝试使用双引号来引用SQL字符串文字,这就是单引号的用途;双引号用于在大多数数据库中引用标识符(例如表名和列名),但MySQL使用反引号。