【问题标题】:How to escape for MYSQL queries from Ruby on Rails?如何逃避 Ruby on Rails 的 MYSQL 查询?
【发布时间】:2012-07-20 14:53:53
【问题描述】:

在 MYSQL 数据库中搜索 Rails 2.3.14 应用程序时,我需要适当地转义搜索字符串,以便搜索包含单引号(撇号)的字符串。最好的方法是什么?我正在使用mysql gem,以防万一。

【问题讨论】:

    标签: mysql ruby-on-rails escaping


    【解决方案1】:

    Rails quotes strings 如下:

    # Quotes a string, escaping any ' (single quote) and \ (backslash) characters.
    def quote_string(s)
      s.gsub(/\\/, '\&\&').gsub(/'/, "''") # ' (for ruby-mode)
    end
    

    【讨论】:

      【解决方案2】:

      当使用mysql gem 时,您将获得Mysql.escape_string() 方法。使用如下:

      search_terms = Mysql.escape_string("it's working!")
      conditions = [ "table1.name LIKE '%#{search_terms}%'" ]
      # use conditions for MYSQL query as appropriate
      

      【讨论】:

      • postgres 哪里有这样的东西??
      【解决方案3】:

      您可以使用 ActiveRecord 的 quote 方法(例如 ActiveRecord::Base.connection.quote("string with ' apostrophe")),但 ActiveRecord 的查询方法已经为您转义了 SQL。例如:

      a = "string with ' apostrophe"
      ModelName.where("field1 = ?", a)
      

      将“带有'撇号的字符串”更改为“带有''撇号的字符串”

      【讨论】:

      • 这对短查询很有用,但对于更复杂的查询,更直接地使用 SQL 实际上会更容易。我正在研究一个在五个不同的表中搜索的案例,并且很难使用这种语法来跟踪哪个变量与查询的哪个部分匹配。
      • 查看范围。它们使您可以将查询分解为逻辑块,然后根据需要将它们链接起来。干净多了
      • 我们确实有范围。另外:有问题的应用程序还使用原始 SQL 查询而不是 Rails SQL 方法作为性能考虑因素,因此我不会将此代码切换回 ActiveRecord 方法。
      • 我仍然会使用 ActiveRecord 的引用方法来与数据库无关
      • 我的问题是执行like 查询。 scope :like, -> (filter) { where("namespace like ? OR resource like ? OR owner like ?", some_strings)}。如果% 没有被转义,那么我猜用户可以执行有趣的查询。
      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 2012-12-16
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多