我在 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。

有帮助吗?

解决方案

一些注意事项:

  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. 添加 撬宝石 到您的 Gemfile,或者 gem install pry.
  2. 更新您的代码以使用 pry:往上看
  3. binding.pry 线路被击中,您可以询问正在运行的应用程序中的几乎所有内容。
  4. 我会看一下 results 看看它是否是一个数组。只需输入 results 在控制台中,它会打印出该值。还输入 results.class. 。查询可能返回一些特殊的结果集对象,该对象不是数组,但具有访问结果数组的方法。
  5. 如果 results 是一个数组,那么问题很可能出现在 chan_send. 。也许它需要使用类似的东西 putsprint 确保每条消息后都有一个新行。您是否可能部署了不同版本的代码库?我还要添加一个 sleep 1 在每个块中,以确保这与您处理同时到达的消息无关。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top