عنوان صفحة أطول من عموده
في 9 أغسطس 2026، تعذّر عرض عشرين صورةً من صور العدادات. لم تُرسم خطأً، ولم تُرسم ببطء — بل لم يحصل الزائر على أي شيء في المكان الذي كان يجب أن يكون فيه العداد.
كان السبب عنوان صفحة يتجاوز طوله 255 حرفًا. ويُقتطع الآن عند الكتابة، ولم تعد صورة العداد تعتمد على طول العنوان الذي تُبلَّغ به.
السلسلة
العمود الذي يخزن الصفحة التي وصلت إليها الزيارة هو varchar(255). وقد وصل العنوان أطول من ذلك. ففشلت عملية الإدراج بالخطأ SQLSTATE 22001، أي أن البيانات أطول من العمود، وهو ما أدى في هذا الكود إلى رمي استثناء.
وكتابة الإحصائيات تحدث قبل رسم الصورة. لذا لم يتسبب الاستثناء في فقدان صف واحد من الإحصائيات فحسب. بل أجهض الطلب، وكان هذا الطلب هو الذي يُنتج صورة العداد. فالصفحة ذات العنوان الطويل عطّلت عدادها بنفسها، بصمت، لكل زائر.
العناوين الطويلة ليست أمرًا غريبًا. معرض صور بمسارات متداخلة، أو متجر أضافت منصة إعلانية إلى عناوينه قرابة اثني عشر معاملًا للتتبع، أو صفحة نتائج بحث — أيٌّ منها يتجاوز 255 حرفًا بلا عناء.
الإصلاح، والإصلاح الذي لم يُختر
يُقتطع العنوان الآن إلى عرض العمود قبل الإدراج. فيضيع من قائمة الصفحات عشرون حرفًا من عنوان URL طويل جدًا؛ ولا يتغير شيء آخر.
كان البديل توسيع العمود. ورُفض ذلك: فلا يوجد عرض لا يمكن تجاوزه، واختيار رقم أكبر لا يفعل سوى إبعاد الفشل نفسه إلى حيث يصعب التعرف عليه عند وقوعه. يجب أن يكفّ الفشل عن أن يكون قاتلًا، لا أن يصبح أندر.
كان تغليف الإدراج بـ try/catch سيعالج العَرَض الظاهر أيضًا، لكنه كان سيكون أسوأ: فالعداد سيُرسم، والصف سيختفي بصمت، وستفتقد قائمة الصفحات بالضبط الصفحات ذات العناوين الأكثر تعقيدًا، إلى الأبد، دون أي أثر في أي سجل.
أمران جديران بالتذكر
المُدخلات الخارجية يجب أن تُقتطع إلى عرض العمود، لا أن يُؤمَل أن تتسع لها. فأي شيء يصل من الخارج — عنوان صفحة، أو مصدر إحالة، أو معرّف متصفح (user agent)، أو عنوان نصي — يكون طوله كما قرر شخص آخر، ولقاعدة البيانات رأي في ذلك تعبّر عنه بالرفض.
اعرف ما الذي يقع بعد نقطة الفشل ويتأثر بها. كان هذا خللًا في الإحصائيات ضمن خدمة إحصائيات، وكان الضرر الظاهر صورة مفقودة. فالكتابة والعرض تشاركا طلبًا واحدًا؛ ولم يكن في الكود ما يشير إلى ارتباطهما، ولا ما يحذّر من أن فشل الإدراج سيأخذ الصورة معه.
عشرون صورةً معطلة في يوم واحد عدد صغير. وقد اكتُشف الخلل أثناء قراءة السجلات بحثًا عن أمر مختلف تمامًا، وهذه هي الطريقة المعتادة لاكتشاف مثل هذه الأخطاء، والسبب في مواصلة قراءتها.