【发布时间】:2015-06-12 17:56:39
【问题描述】:
我自己搜索了一个 Rails 4 应用程序。现在我需要为用户提供不同的列进行搜索。我在视图的搜索表单中创建了一个下拉菜单,如下所示:
<%= form_tag manage_accounts_administrator_path, :method => 'get', :id => "search-form" do %>
<%= text_field_tag :search, params[:search], placeholder: 'Search Accounts' %>
<%= select_tag("search_criteria", options_for_select([['by account number', '1'],['by customer id', '2'],['by customer name (ex: Jane Doe)', '3']])) %>
<%= submit_tag "Search", :name => nil %>
<% end %>
然后在对应的控制器方法中,我是这样做的:
def manage_accounts
# criteria from the "Search by" select menu
if params[:search]
case (params[:search_criteria])
when 1
@criteria = id
when 2
@criteria = customer_id
when 3
@criteria = customer.firstname + ' ' + customer.lastname
end
@accounts = Account.where("#{@criteria} LIKE ?", "%#{params[:search]}%").page(params[:page]).per(15)
@table_heading = "Account Search Results"
else
@accounts = Account.order('id').page(params[:page]).per(15)
@table_heading = "Listing All Accounts"
end
respond_to do |format|
format.js
format.html {render 'manage_accounts'}
end
end
上面案例块中@criteria 变量的三个可能值代表“帐户”模型的字段。如您所见,我期望发生的是使用“where”方法进行查询。这个语法是错误的,我得到了错误:
ActiveRecord::StatementInvalid in Administrators#manage_accounts Mysql2::Error: 你的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在第 1 行的 'LIKE '%722586388%')' 附近使用:SELECT COUNT(*) FROM
accountsWHERE (LIKE '%722586388%')
显然我做错了。 如何插入 @criteria 变量,类似于插入搜索参数的方式? 错误告诉我的是该变量被完全转义。我已经尝试(猜测)了几十种不同的标点组合,但都无济于事。如果语法正确,我觉得这会起作用。
另外,我了解到这是一种不好的做法,因为它会使应用容易受到 SQL 注入的攻击。 那么,我应该如何以安全的方式编写此声明?
谢谢
它是带有 MySQL2 gem 的 rails 4.1.8,我是菜鸟。
【问题讨论】:
标签: sql ruby-on-rails ruby rails-activerecord mysql2