Question

J'ai codé un bot Ruby IRC qui se trouve sur github (/ninjex/rubot) et qui a des sorties conflictuelles avec MySQL sur un serveur dédié que je viens d'acheter.

Tout d'abord nous avons la connexion à la base de données dans le dossier MySQL (en .gitignore) qui ressemble au bloc de code suivant.

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

Ensuite, nous avons une véritable fonction pour interroger la base de données

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

Sur ma machine locale, lors de l'exécution de la commande :

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

Je reçois le résultat dans IRC sous la forme d'un tableau : ["17", "Bob"] Où 17 est le montant et Bob est l'utilisateur.

Cependant, l'utilisation de cette même fonction sur mon serveur dédié donne un résultat du type : 17Bob J'ai tenté de nombreuses modifications dans le code et essayé d'analyser les données dans sa propre variable, mais il semble que 17Bob se présente sous la forme d'une variable unique, ce qui rend impossible l'analyse en quelque chose comme un tableau, que je pourrais ensuite utiliser pour envoyer les données correctement.

Cela me semble étrange à la fois sur ma machine locale et sur le serveur dédié, car je m'attendais à ce que la sortie envoie d'abord 17 à l'IRC, puis à Bob comme :

17
Bob

Pour toutes les fonctions et sources, vous pouvez consulter mon github /Ninjex/rubot, mais vous devrez peut-être installer quelques gemmes.

Était-ce utile?

La solution

Quelques remarques :

  1. Assurez-vous de nettoyer la requête via get_message.Ou vous vous ouvrez à des choses sérieuses problèmes de sécurité.
  2. Assurez-vous que vous utilisez les mêmes versions de MySQL Gem, Ruby et MySql.Les différences dans l’un de ces éléments peuvent modifier le résultat attendu.
  3. Si vous êtes à bout de nerfs et ne parvenez pas à résoudre le problème sous-jacent, vous pouvez toujours envoyer un délimiteur personnalisé et l'utiliser pour diviser.Malheureusement, cela gâcherait le boîtier qui fonctionne réellement et devra être démonté.

Voici comment j'aborderais le débogage du problème sur la machine dédiée :

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

 results.each {|x| chan_send(x)}
end
  1. Ajouter le levier gemme à votre Gemfile, ou gem install pry.
  2. Mettez à jour votre code pour l'utiliser pry:voir au dessus
  3. Cela ouvrira une console de levier lorsque le binding.pry la ligne est atteinte et vous pouvez interroger presque tout dans votre application en cours d'exécution.
  4. j'y jetterais un oeil results et voyez si c'est un tableau.Tapez simplement results dans la console et il imprimera la valeur.Tapez également results.class.Il est possible que la requête renvoie un objet de jeu de résultats spécial qui n'est pas un tableau, mais qui possède une méthode pour accéder au tableau de résultats.
  5. Si results est un tableau, alors le problème vient probablement de chan_send.Peut-être qu'il faut utiliser quelque chose comme puts contre print pour vous assurer qu'il y a une nouvelle ligne après chaque message.Est-il possible que différentes versions de votre base de code soient déployées ?J'ajouterais également un sleep 1 dans chaque bloc pour garantir que cela n'est pas lié à votre gestion des messages arrivant en même temps.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top