【问题标题】:ruby MySQL returns #<Mysql:0x000000016f3780> and not nilruby MySQL 返回 #<Mysql:0x000000016f3780> 而不是 nil
【发布时间】:2013-05-26 18:57:36
【问题描述】:

环境是:

ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
gem: mysql (2.9.1)

我正在尝试用 ruby​​ 从 MySQL 中提取数据。它看起来像这样(在http://www.kitebird.com/articles/ruby-mysql.html 找到)

def read_sql_host(hostname, mac)
hostname = "'" + "#{hostname}" + "'"
mac = "'" + "#{mac}" + "'"
res = dbh.query("SELECT macadd FROM basenode WHERE hostname = #{hostname}")

res.each do |row|
    row = row.collect { |v| v.nil? ? "nil" : v }
    return row[0]
end
dbh.close if dbh
end

现在 - 当我添加时:

puts read_sql_host("node13.abit.dk", "00-11-22-33-44-55")

它返回正确的东西:

[koen@Cerberus cgi-bin]$ ruby use_sql.rb 
50:e5:49:b0:50:1a

但是当我要求某些东西时,它不在数据库中:

puts read_sql_host("node66.abit.dk", "00-11-22-33-44-55")

它只是返回一些我不知道如何更改的东西?

[koen@Cerberus cgi-bin]$ ruby use_sql.rb 
#<Mysql:0x000000022f4818>

根据我的理解,它应该返回“nil”,如每个循环中所述?

任何帮助将不胜感激:>

//M00kaw

【问题讨论】:

    标签: mysql ruby return null


    【解决方案1】:

    循环遍历该行:

    res.each do |row|
        row = row.collect { |v| v.nil? ? "nil" : v }
        return row[0]
    end
    

    但是,当没有行时,.each 将不会执行并且不会返回。您将在下一条语句结束:

    dbh.close if dbh
    

    返回 dbh.close 返回的内容。

    顺便说一句:您的代码看起来像 PHP。我会使用像 Sequel 这样的数据库抽象层,这会让你的事情变得更容易。 Please take a look at the example here, 这应该能说服你:)

    【讨论】:

      【解决方案2】:

      我强烈建议不要使用直接 SQL 生成,而是使用像 Sequel 这样的 ORM。

      ORM 抽象出与数据库通信中最烦人的部分,并允许您编写更容易跨 DBM 移植的代码。

      您的使用:

      res = dbh.query("SELECT macadd FROM basenode WHERE hostname = #{hostname}")
      

      使您的代码受到 SQL 注入攻击。正确使用绑定参数将有助于缓解这种情况。这样的事情是一个很好的起点:

      res = dbh.query("SELECT macadd FROM basenode WHERE hostname = ?", hostname)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多