يتم قطع اتصال MDB2 وينسى إعداد مجموعة الأحرف عند إعادة الاتصال

StackOverflow https://stackoverflow.com/questions/81061

  •  09-06-2019
  •  | 
  •  

سؤال

لقد قمنا مؤخرًا بتصحيح خطأ غريب.تم التوصل إلى حل، لكنه ليس مرضيا تماما.

نحن نستخدم IntSmarty لتوطين موقعنا الإلكتروني، وتخزين السلاسل المترجمة في قاعدة بيانات باستخدام برنامج التغليف الخاص بنا.في أداة التدمير الخاصة به، يقوم IntSmarty بحفظ أي سلاسل جديدة قد تكون لديه، مما يؤدي إلى استدعاء قاعدة البيانات.

نستخدم مثيل Singleton لـ MDB2 لإجراء استعلامات ضد MySQL، وبعد الاتصال استخدمنا وظيفة SetCharset() لتغيير مجموعة الأحرف إلى UTF-8.لقد وجدنا أن السلاسل التي تم حفظها بواسطة IntSmarty تم تفسيرها على أنها ISO-8859-1 عند إجراء الإدخالات النهائية.لقد ألقينا نظرة فاحصة على سجل الاستعلامات، ووجدنا أنه تم قطع اتصال MySQL قبل استدعاء أداة التدمير الخاصة بـ IntSmarty.ثم تمت إعادة إنشائه، ولكن لم يتم إصدار استعلام "SET NAMES utf8" على الاتصال الجديد.أدى ذلك إلى تفسير السلاسل المحفوظة على أنها ISO-8859-1 بواسطة MySQL.

يبدو أنه لا توجد خيارات لتعيين مجموعة الأحرف الافتراضية على MDB2.كان حلنا لهذه المشكلة هو تغيير تكوين خادم MySQL، وذلك عن طريق إضافة

init-connect='SET NAMES utf8'

إلى my.cnf.هذا لا يحل إلا مشكلة أن مجموعة شخصياتنا هي نفسها دائمًا.

لذا، هل هناك أي طريقة يمكنني من خلالها منع انقطاع الاتصال قبل تشغيل جميع الاستعلامات؟هل يمكنني فرض تدمير مثيل MDB2 بعد كل شيء آخر؟

يعمل تشغيل الاتصالات المستمرة، ولكنه ليس الحل المطلوب.

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

المحلول

من وثائق PHP5:

سيتم استدعاء الأسلوب المدمر بمجرد إزالة كافة المراجع إلى كائن معين أو عند تدمير الكائن بشكل صريح أو بأي ترتيب في تسلسل الاغلاق.

وثائق PHP

(التأكيد على الألغام)

ما يحدث على الأرجح هو أن البرنامج النصي الخاص بك لا يدمر الكائن بشكل صريح، وبالتالي عندما يصل PHP إلى نهاية البرنامج النصي، فإنه يبدأ في تنظيف الأشياء بأي ترتيب يبدو عليه - وهو ما في حالتك، وهو إغلاق رابط قاعدة البيانات أولاً .

إذا قمت بتدمير كائن IntSmarty بشكل صريح قبل النهاية الفعلية للبرنامج النصي، فمن المفترض أن يحل ذلك مشكلتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top