2013-05-26 40 views
0

環境是:紅寶石的MySQL返回#<MySQL的:0x000000016f3780>,而不是零

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

我想在紅寶石從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") 

返回正確的事情:

[[email protected] 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") 

它只是返回一些東西,我不知道如何改變?

[[email protected] cgi-bin]$ ruby use_sql.rb 
#<Mysql:0x000000022f4818> 

按照我的理解,它應該返回「nil」,如每個循環中所述?

任何幫助,將不勝感激:>

// M00kaw

回答

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,這應該說服你:)

+0

感謝您的解釋:> 我會看看續集! – M00kaw

1

我強烈建議不要使用直接的SQL生成,而是使用ORM像Sequel

ORM將與數據庫交談最煩人的部分抽象出來,並允許您編寫更易於跨DBM移植的代碼。

您使用的:

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

打開你的代碼,SQL注入攻擊。正確使用綁定參數將有助於緩解這一點。這樣的事情是一個很好的起點:

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

感謝您的提示:> – M00kaw