0

我在 github (/ninjex/rubot) 上编写了一个 Ruby IRC 机器人,它在我刚购买的专用服务器上与 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,然后 Bob 喜欢:

17
Bob

对于所有功能和来源,您可以查看我的 github /Ninjex/rubot,但是您可能需要安装一些 gem。

4

1 回答 1

1

几点注意事项:

  1. 确保您正在通过 清理查询get_message。或者您正面临一些严重的安全问题
  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. 也许它需要使用类似putsvsprint的东西来确保每条消息后都有一个新行。您是否可能部署了不同版本的代码库?我还将sleep 1在每个块中添加一个,以确保这与您处理同时到达的消息无关。
于 2014-01-09T15:00:56.870 回答