أهم أخطاء مطوري PHP المبتدئين — الجزء 4: التعامل مع البيانات
نواصل سلسلة المقالات لمن يدرسون PHP ويريدون كتابة كود بجودة أعلى. في هذا الجزء سنناقش ثلاثة أخطاء حرجة تتعلق بمعالجة بيانات المستخدمين، التخزين المؤقت، والكتابة الصارمة للأنواع. إذا كنت في مرحلة تعلم PHP، ستساعدك هذه الأمثلة على تجنب المشكلات النمطية في المشاريع الحقيقية.
1. الثقة في البيانات من المصفوفات الشاملة (Superglobals)
أحد أكثر الأخطاء شيوعًا لمطوري PHP المبتدئين هو استخدام البيانات من $_GET أو $_POST أو $_REQUEST دون تحقق أو تصفية. هذا طريق مباشر لهجمات XSS وحقن SQL.
المنهج الخاطئ
<?php// خطير! يمكن للمستخدم إرسال سكريبت$name = $_POST['username'];echo "مرحبًا، $name!";?>المنهج الصحيح
<?php// نستخدم التصفية والهروب$name = htmlspecialchars(strip_tags(trim($_POST['username'] ?? '')), ENT_QUOTES, 'UTF-8');echo "مرحبًا، " . $name . "!";?>ماذا تفعل؟ عالج دائمًا البيانات الواردة. للتعامل مع قاعدة البيانات استخدم الاستعلامات المحضرة (PDO أو MySQLi)، وللإخراج استخدم htmlspecialchars(). هذا أساس الأمان في البرمجة باستخدام PHP.
2. عدم وجود تخزين مؤقت للاستعلامات الثقيلة
كثير من المبتدئين ينفذون نفس استعلام SQL أو عملية حسابية معقدة في كل مرة يتم فيها تحديث الصفحة. هذا يقتل الأداء، خاصة إذا كان هناك العديد من الاستعلامات.
مثال المشكلة
<?php// في كل مرة نطلب البيانات من قاعدة البيانات$users = $db->query("SELECT * FROM users WHERE active = 1")->fetchAll();foreach ($users as $user) { echo $user['name'];}?>الحل مع التخزين المؤقت
<?php// نستخدم تخزينًا مؤقتًا بسيطًا في ملف$cacheFile = 'cache/users_active.cache';$cacheTime = 300; // 5 دقائق
if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) { $users = unserialize(file_get_contents($cacheFile));} else { $users = $db->query("SELECT * FROM users WHERE active = 1")->fetchAll(); file_put_contents($cacheFile, serialize($users));}
foreach ($users as $user) { echo $user['name'];}?>للمشاريع الأكثر تعقيدًا استخدم Memcached أو Redis. هذا سيسرع تعلم PHP من حيث فهم بنية التطبيقات عالية التحميل.
3. تجاهل الكتابة الصارمة للأنواع (Strict Typing)
PHP لغة ذات كتابة ديناميكية، لكن منذ الإصدار 7.0 أصبح من الممكن تفعيل الوضع الصارم. المبتدئون غالبًا ينسون هذا، مما يؤدي إلى أخطاء غير متوقعة.
الموقف النمطي
<?phpfunction calculateSum($a, $b) { return $a + $b;}
echo calculateSum(10, '5'); // النتيجة: 15 (تحولت السلسلة النصية إلى رقم)?>التصحيح
<?phpdeclare(strict_types=1); // تفعيل الوضع الصارم
function calculateSum(int $a, int $b): int { return $a + $b;}
// echo calculateSum(10, '5'); // خطأ فادح: Uncaught TypeErrorecho calculateSum(10, 5); // 15?>الكتابة الصارمة للأنواع تساعد في اكتشاف الأخطاء في مرحلة التطوير، وليس في الإنتاج. نوصي جميع مبتدئي PHP بالتعود فورًا على تحديد أنواع الوسائط والقيم المُعادة.
مكافأة: التعامل مع الجلسات دون تحقق
خطأ شائع آخر هو الكتابة في الجلسة دون التحقق من وجود المفتاح. هذا قد يسبب تحذيرات.
<?phpsession_start();
// خطأ: إذا لم يكن المفتاح موجودًا، سنحصل على تحذير$_SESSION['counter'] = $_SESSION['counter'] + 1;
// الصحيح$_SESSION['counter'] = ($_SESSION['counter'] ?? 0) + 1;?>