我有一个表公司,它有两列名称和地址.通过运行以下代码,将新数据插入到表中:
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值从“我的公司名称”更改为“John’s company”,我将收到语法错误.这是因为查询变成:
"INSERT INTO companies (name,address) VALUES ('John's company','ABC');"
和“约翰公司”内有单引号.
解决方法
如果你必须这样做,那么在连接对象上使用
quote
method:
quote(value,column = nil)
Quotes the column value to help prevent sql injection attacks.
所以这样的事情
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使用反引号.