سؤال

لقد قمت بترميز روبوت Ruby IRC الموجود على github (/ninjex/rubot) والذي به بعض المخرجات المتعارضة مع 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 هو المبلغ وبوب هو المستخدم.

ومع ذلك، فإن استخدام هذه الوظيفة نفسها على الخادم المخصص الخاص بي يؤدي إلى نتائج مثل: 17Bob لقد حاولت إجراء العديد من التغييرات في الكود، بالإضافة إلى محاولة تحليل البيانات إلى متغير خاص بها، ولكن يبدو أن 17Bob يظهر كمتغير واحد، مما يجعل من المستحيل تحليله إلى شيء مثل المصفوفة، والذي يمكنني بعد ذلك استخدامه لإرسال البيانات بشكل صحيح.

يبدو هذا غريبًا بالنسبة لي على كل من جهازي المحلي والخادم المخصص، حيث كنت أتوقع أن يرسل الإخراج أولاً 17 إلى IRC ثم بوب مثل:

17
Bob

بالنسبة لجميع الوظائف والمصدر، يمكنك التحقق من github /Ninjex/rubot الخاص بي، ولكن قد تحتاج إلى تثبيت بعض الأحجار الكريمة.

هل كانت مفيدة؟

المحلول

بعض الملاحظات:

  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.ربما يحتاج إلى استخدام شيء من هذا القبيل puts ضد print للتأكد من وجود سطر جديد بعد كل رسالة.هل من الممكن أن يكون لديك إصدارات مختلفة من قاعدة التعليمات البرمجية الخاصة بك منشورة؟وأود أيضا أن أضيف أ sleep 1 داخل كل كتلة للتأكد من أن هذا لا يرتبط بتعاملك مع الرسائل التي تصل في نفس الوقت.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top