在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's company"
,我将收到语法错误。 这是因为查询变为:
"INSERT INTO companies (name,address) VALUES ('John's company','ABC');"
而'John's company'
有一个引号。
鉴于我已经为查询字符串定义使用了双引号,我怎样才能摆脱关于我的值中单引号的错误?
如果必须这样做,那么在连接对象上使用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);
永远不要尝试处理自己的报价。 并且不要尝试使用双引号来引用SQL字符串文字,这就是单引号的用途; 双引号用于在大多数数据库中引用标识符(例如表名和列名),但MySQL使用反引号。