2014-01-09 35 views
0

我编写了一个Ruby IRC bot,它在github上(/ ninjex/rubot),它在我刚刚购买的专用服务器上与MySQL有一些冲突的输出。Ruby MySQL输出在不同的服务器上冲突

首先,我们连接到MySQL文件夹(在.gitignore中)与以下代码块类似的数据库。

@con = Mysql.new('localhost', 'root', 'pword', 'db_name') 

然后我们有一个实际的功能来查询数据库

def db_query 
que = get_message # Grabs query from user i.e,./db_query SELECT * FROM words 
results = @con.query(que) # Send query through the connection i.e, @con.query("SELECT * FROM WORDS") 
results.each {|x| chan_send(x)} # For each row returned, send it to the channel via 
end 

在我的本地机器上,运行命令时:

./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'

我收到在IRC输出像时尚一样的数组:["17", "Bob"]其中17是金额,Bob是用户。

然而,在使用上我的专用服务器的测试结果相同功能,在这样的输出:17Bob我试图在代码中的许多变化,以及尝试将数据解析到它自己的变量,但它似乎17Bob来了作为一个单一的变量,使得它不可能解析成数组,然后我可以使用它来正确地发送数据。

这似乎很奇怪,我,我的本地计算机和专用服务器上,因为我期待的输出,首先发送17到IRC,然后鲍勃喜欢:

17 
Bob 

对于所有的功能和源你可以检查我的github/Ninjex/rubot,但是你可能需要安装一些宝石。

+0

我为您创建了一个拉请求https://github.com/Ninjex/Rubot/pull/1,它公开了一些ruby语言,可以用来简化代码。它不完全是主题,但应鼓励你多一点探索标准库。 –

+0

是的,大部分我在Ruby中首次编码时并不熟悉的成语。我承认,当Ruby对我而言是新手时,我开始了这个项目,而我则是从PHP编程而来的。然而,我不知道Ruby不需要返回关键字,很好。 感谢您的全力帮助,我期待修复大量多余的代码,并在本周末转换为mysql2。 – Singularity

+0

如果您有任何疑问,请打我。我很乐意向您指出正确的方向。 –

回答

1

的几个注意事项:

  1. 确保您通过get_message消毒查询。或者你正在打开一些严重的security problems
  2. 确保您使用的是相同版本的MySQL gem,ruby和MySql。这些差异可能会改变预期产出。
  3. 如果您处于智慧结局并无法解决潜在问题,您始终可以发送自定义分隔符并将其用于分割。不幸的是,这将会破坏实际工作中需要被剥离的案例。

这是我怎么会接近专用机器上调试的问题:

def db_query 
que = get_sanitized_message 
results = @con.query(que) 
require 'pry' 
binding.pry 

results.each {|x| chan_send(x)} 
end 
  1. 添加pry gem到你的Gemfile,或gem install pry
  2. 更新您的代码以使用pry:见上
  3. binding.pry线被击中这将打开一个撬控制台,您可以查询在运行的应用程序几乎所有的东西。
  4. 我会看看results,看看它是否是一个数组。只需在控制台中键入results,它将打印出该值。还输入results.class。有可能查询返回一些不是数组的特殊结果集对象,但它有访问结果数组的方法。
  5. 如果results是一个数组,那么问题很可能在chan_send。也许它需要使用类似puts vs print以确保每封邮件后都有一个新的行。是否有可能部署了不同版本的代码库?我还会在每个块中添加一个sleep 1,以确保这与您处理同时到达的消息无关。
+0

谢谢,我实际上有这个特定的命令(db_query)作为管理员功能,仅限我使用。 get_message实际上是从另一个叫做send_data的函数中抽取出来的,该函数可以去除各种*行(g,k,b等)。一切都很好的消毒或相应的限制。它引起了我的注意,我的本地机器是32位,而专用是64位。在交互式ruby会话中,通常情况下都会产生输出。我一定会检查每个安装的所有版本。还是非常奇怪的伊莫。 – Singularity

+0

好的,我试图以上: ''[1]撬(主)> results.class => Mysql的:: Result'' ''[2]撬(主)>导致 =>#< Mysql :: Result:0x7f42b20f5680>'' 我知道查询结束为Mysql :: Result而不是实际的Array。回显数据的方法是通过result.each {| row |放行}''或类似的。睡觉也没有帮助。我甚至尝试制作一个新变量,并将结果中的值连接到通过逗号分隔的这个变量,但没有运气。它只是被解释为价值,即使它来自两行。 Hmph ... – Singularity

+0

你使用哪个mysql gem?看起来你可以通过使用':as =>:array'来查询返回一个数组。查看:https://github.com/brianmario/mysql2#usage –

相关问题