繁体   English   中英

在 rails 中提供准备好的语句

[英]Provide prepared statement in rails

我正在使用 rails-4.2.1 并试图在单个查询中从两个表主题和选修主题表中获取数据。 由于 rails 4 不支持 UNION ,我写了一个原始的 sql 查询。 我想在两个表中按名称搜索。 我的代码如下

query = "(SELECT id as id, name as name, reference as reference from subjects where name like '#{search}') UNION (SELECT id as id, name as name, null as reference from elective_subjects where name like '#{search}')"

@subjects =  ActiveRecord::Base.connection.execute(query)

它正在工作,但是当我在搜索中提供 ' 时,查询会中断。 那么我怎样才能使它成为一个准备好的声明。 这样可以避免sql注入

这个问题太老了,不再关心了,但我认为这是一个有效的问题,所以这里是答案:

query = "(SELECT id as id, name as name, reference as reference from subjects where name like $1) 
         UNION
         (SELECT id as id, name as name, null as reference from elective_subjects where name like $1)"

binds = [ActiveRecord::Relation::QueryAttribute.new('name', search, ActiveRecord::Type::Text.new)]

result = ApplicationRecord.connection.exec_query(query, 'SQL', binds, prepare: true)

@subjects = result.rows

这就是在 rails 中创建和使用准备好的语句的方式。

我已经通过使用以下语句转义搜索字符串解决了这个问题。

search = Mysql2::Client.escape(search)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM