MySql Query :: Как решить проблему с данными в данных при запуске запроса - PullRequest
0 голосов
/ 28 сентября 2010

Я сталкиваюсь с такой проблемой, в которой есть в данных. при поиске не показывает данные. Я хочу удалить проблему SQL-инъекции Код ::

@search_condition = ""
          if !search_text.nil?
            search_field = search_text.split("-")
            @search_condition  =  "( address_books.organization_name like '#{search_text}%' or  address_books.business_name like '#{search_text}%' or address_books.federal_tax_id like '#{search_text}%' or address_books.city like '#{search_text}%' or address_books.zip like '#{search_text}%' ) "  if search_field.length == 1

            if search_text.include? "-"
              if search_field.length <= 1
                @search_condition  = " ( address_books.organization_name like '%" + search_field[0] + "%'  "
                @search_condition  += " or address_books.business_name like '%" + search_field[1] + "%'  "
                @search_condition  += " or address_books.federal_tax_id like '%" + search_field[2] + "%'  "
                @search_condition  += " or address_books.city like '%" + search_field[3] + "%'  "
                @search_condition  += " or address_books.zip like '%" +  search_field[4] + "%' ) "

Ответы [ 2 ]

1 голос
/ 28 сентября 2010

Вам нужно заменить все данные вставки? и сохранить все данные, чтобы заменить это? в массиве

@search_condition = ""
          if !search_text.nil?
            search_field = search_text.split("-")
            if search_field.length == 1
              @search_condition  =  "( address_books.organization_name like ? or  address_books.business_name like ? or address_books.federal_tax_id like ? or address_books.city like ? or address_books.zip like ? ) "  
              @search_condition_datas = ["#{search_text}%", "#{search_text}%", "#{search_text}%", "#{search_text}%", , "#{search_text}%"]
            if search_text.include? "-"
              if search_field.length <= 1
                @search_condition  = " ( address_books.organization_name like ? "
                @search_condition  += " or address_books.business_name like ?"
                @search_condition  += " or address_books.federal_tax_id like ?"
                @search_condition  += " or address_books.city like ?"
                @search_condition  += " or address_books.zip like ?"
                @search_condition_datas = ["%#{search_text[0]}%", "%#{search_text[1]}%", "%#{search_text[2]}%", "%#{search_text[3]}%", , "%#{search_text[4]}%"]

И после вы можете искать с

User.find(:all, :conditions => [@search_condition] | @search_conditions_datas)

Этот код может быть изменен после. Это действительно безобразно.

0 голосов
/ 28 сентября 2010

Вот возможный рефакторинг с использованием Arel / Rails 3 / REE 2010-02

class AddressBook < ActiveRecord::Base

  def self.search(search_text)
    unless search_text.nil?
      t = arel_table
      results = scoped

      search_fields = search_text.split("-")
      search_fields.map! {|f| "%#{f}" } unless search_fields.length == 1
      results = results.where(
        t[:organization_name].matches("#{search_fields[0] || search_text}%").
        or(t[:business_name].matches("#{search_fields[1] || search_text}%")).
        or(t[:federal_tax_id].matches("#{search_fields[2] || search_text}%")).
        or(t[:city].matches("#{search_fields[3] || search_text}%")).
        or(t[:zip].matches("#{search_fields[4] || search_text}%"))
      )
    end
    results
  end

end

Вот сгенерированные SQL:

ree-1.8.7-2010.02 > AddressBook.search("something")
  AddressBook Load (0.1ms)  SELECT "address_books".* FROM "address_books" WHERE ((((("address_books"."organization_name" LIKE 'something%' OR "address_books"."business_name" LIKE 'something%') OR "address_books"."federal_tax_id" LIKE 'something%') OR "address_books"."city" LIKE 'something%') OR "address_books"."zip" LIKE 'something%'))
 => [] 


ree-1.8.7-2010.02 > AddressBook.search("1-2-3-4-5")
  AddressBook Load (0.2ms)  SELECT "address_books".* FROM "address_books" WHERE ((((("address_books"."organization_name" LIKE '%1%' OR "address_books"."business_name" LIKE '%2%') OR "address_books"."federal_tax_id" LIKE '%3%') OR "address_books"."city" LIKE '%4%') OR "address_books"."zip" LIKE '%5%'))
 => [] 

Очевидно, что в зависимости от ваших потребностей и способа поиска вы можете обновить его.Суть в том, что с помощью Arel вы можете просто сохранять цепочки предложений для отношения до точки, где оно фактически запрашивается.Я думаю, это намного чище, чем создание строки условий или массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...