في هذا الدرس 6تصفّح المواضيع
تمثل واجهة كائنات بيانات PHP (PDO — PHP Data Objects) الطبقة الكائنية القياسية المدمجة في PHP 8.4 للتعامل الاحترافي الآمن مع قواعد البيانات:
- دعم موحد لمختلف المحركات: على عكس الإضافات القديمة المقيدة بمحرك واحد، تتيح لك PDO الاتصال بـ MySQL وMariaDB وPostgreSQL وSQLite وSQL Server بنفس الكود والدوال تماماً مع تغيير نص الاتصال فقط.
- الأمان المدمج والاستثناءات: تدعم PDO الاستعلامات المحضرة الحقيقية ومعالجة الأخطاء عبر كائنات
PDOException.
<?php
// Check available PDO database drivers on your server:
$drivers = PDO::getAvailableDrivers();
echo "Installed PDO Drivers: " . implode(", ", $drivers);
لتحديد نوع قاعدة البيانات وعنوان الخادم الذي ستتصل به واجهة PDO، نكتب نصاً قياسياً يُسمى اسم مصدر البيانات (DSN — Data Source Name):
- بادئة المشغل: يبدأ النص باسم المحرك متبوعاً بنقطتين رأسيتين مثل
mysql:أوpgsql:أوsqlite:. - معاملات الاتصال: أزواج مفتاح وقيمة مفصولة بفاصلة منقوطة تحدد العنوان
hostوالمنفذportواسم القاعدةdbnameوالترميزcharset=utf8mb4الضروري لدعم اللغة العربية والرموز التعبيرية بالكامل.
<?php
declare(strict_types=1);
$host = "127.0.0.1";
$db = "closetag_store";
$dsn = "mysql:host={$host};port=3306;dbname={$db};charset=utf8mb4";
echo $dsn;
يجب دائماً إنشاء كائن الاتصال new PDO($dsn, $username, $password, $options) داخل كتلة try / catch (PDOException $e):
- منع تسريب بيانات الدخول: إذا تعذر الوصول لخادم قاعدة البيانات ولم يتم اصطياد الاستثناء، فقد يتسبب الخطأ غير الملتقط في كشف تفاصيل الاتصال.
- المعالجة الآمنة للعطل: نسجل سبب الخطأ التقني داخلياً عبر
error_log()ونعرض رسالة عامة مهذبة للمستخدم.
<?php
declare(strict_types=1);
try {
$pdo = new PDO("sqlite::memory:");
echo "Database connection established.";
} catch (PDOException $e) {
error_log("PDO Connection Failed: " . $e->getMessage());
echo "Service unavailable.";
}
عند إنشاء اتصال PDO قياسي، نمرر مصفوفة خيارات في المعامل الرابع تضبط ثلاث خصائص أمان وأداء أساسية:
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION: يضمن رمي كائنPDOExceptionفور وقوع أي خطأ في قاعدة البيانات.PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC: يجعل نمط الجلب الافتراضي مصفوفة ترابطية نظيفة مفهرسة بأسماء الأعمدة فقط دون تكرار رقمي.PDO::ATTR_EMULATE_PREPARES => false: يعطل المحاكاة النصية ويلزم خادم قاعدة البيانات بتنفيذ الاستعلامات المحضرة الحقيقية وإرجاع الأعداد الصحيحة والعشرية بأنواعها الأصلية.
<?php
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO("sqlite::memory:", null, null, $options);
echo "Fetch Mode: " . $pdo->getAttribute(PDO::ATTR_DEFAULT_FETCH_MODE);
لتنفيذ أوامر هيكلة الجداول الثابتة (DDL مثل CREATE TABLE) التي لا تحتوي على أي مدخلات من المستخدم ولا تُرجع سجلات نتائج، نستخدم الدالة $pdo->exec(string $sql):
- تنفيذ مباشر للأوامر الثابتة: تنفذ الدالة
exec()الأمر وتُرجع عدد الصفوف المتأثرة كعدد صحيح. - تحذير أمني صارم: لا تمرر أبداً أي متغير قادم من المستخدم داخل
exec()؛ بل استخدم الاستعلامات المحضرة التي سنتعلمها في الدرس القادم.
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec(
"CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL UNIQUE,
created_at TEXT NOT NULL
)"
);
echo "Schema table users created.";
يلخص الجدول المرجعي التالي صيغ DSN وخيارات اتصال PDO القياسية في PHP 8.4:
| الخاصية / نص الاتصال | القيمة القياسية الموصى بها | الوظيفة الهندسية والأمنية |
|---|---|---|
| نص اتصال MySQL | mysql:host=127.0.0.1;dbname=app;charset=utf8mb4 | الاتصال بـ MySQL أو MariaDB بترميز UTF-8 الكامل |
| نص اتصال SQLite | sqlite:/path/db.sqlite أو sqlite::memory: | الاتصال بملف محلي أو قاعدة بيانات سريعة بالذاكرة |
PDO::ATTR_ERRMODE | PDO::ERRMODE_EXCEPTION | رمي استثناء PDOException عند وقوع أي خطأ |
PDO::ATTR_DEFAULT_FETCH_MODE | PDO::FETCH_ASSOC | إرجاع السجلات كمصفوفات ترابطية بأسماء الأعمدة |
PDO::ATTR_EMULATE_PREPARES | false | فرض الاستعلامات المحضرة الحقيقية داخل خادم البيانات |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
تعلمت في هذا الدرس مزايا واجهة PDO الموحدة، وكيفية بناء نص الاتصال DSN بترميز utf8mb4، وتأمين الاتصال داخل كتلة try/catch (PDOException)، وضبط خصائص الأمان الثلاثة، وتنفيذ أوامر هيكلة الجداول عبر $pdo->exec(). الخطوة التالية: انتقل إلى الدرس الرابع والخمسين «الاستعلامات المحضرة وإدراج البيانات بأمان ضد SQL Injection في PHP» لحماية استعلاماتك بالكامل.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 PDO Connection الاتصال بـ PDO
- تعلّم الاتصال الآمن بقواعد البيانات عبر واجهة PDO في PHP بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
- للمراجعة
- 02 Why PDO Over Legacy Extensions تفوق PDO على الإضافات القديمة
- المفهوم الأساسي لقسم تفوق PDO على الإضافات القديمة في لغة PHP الحديثة.
- للمراجعة
- 03 Understanding PDO DSN Connection تشريح نص الاتصال DSN القياسي
- الصياغة البرمجية والتطبيق العملي المباشر لقسم تشريح نص الاتصال DSN القياسي.
- للمراجعة
- 04 Connecting Inside try and catch تأمين اتصال PDO بمعالجة الاستثناء
- قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم تأمين اتصال PDO بمعالجة الاستثناء.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 PHP PHP
- PHP: Hypertext Preprocessor
- لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
- للمراجعة
- 02 CLI CLI
- Command-Line Interface
- واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
- للمراجعة
- 03 FPM FPM
- FastCGI Process Manager
- مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
- للمراجعة
- 04 HTML HTML
- HyperText Markup Language
- لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم تفوق PDO على الإضافات القديمة للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم تشريح نص الاتصال DSN القياسي وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ما الميزة المعمارية الأبرز لواجهة PDO مقارنةً بالإضافات القديمة الخاصة بمحرك واحد؟
توفر PDO واجهة كائنية موحدة تعمل مع مختلف محركات قواعد البيانات (مثل MySQL وPostgreSQL وSQLite).
ما قيمة الترميز (charset) التي يجب تضمينها دائماً في نص اتصال DSN الخاص بـ MySQL لدعم العربية والرموز التعبيرية بالكامل؟
يضمن الترميز charset=utf8mb4 دعم كافة محارف UTF-8 ذات الأربعة بايتات دون اقتطاع.
ما صنف الاستثناء الذي ترميه واجهة PDO عند فشل الاتصال بقاعدة البيانات أو تعذر تنفيذ استعلام؟
ترمي واجهة PDO كائناً من الصنف PDOException.
ضبط الخاصية PDO::ATTR_DEFAULT_FETCH_MODE على القيمة PDO::FETCH_ASSOC يجعل PDO تُرجع السجلات كمصفوفات ترابطية مفهرسة بأسماء الأعمدة.
صواب؛ يُرجع النمط PDO::FETCH_ASSOC مصفوفة ترابطية نظيفة مفهرسة بأسماء الأعمدة فقط.
لماذا يُوصى بضبط الخيار PDO::ATTR_EMULATE_PREPARES => false عند إنشاء اتصال PDO؟
لإيقاف المحاكاة النصية وإلزام خادم قاعدة البيانات باستخدام الاستعلامات المحضرة الحقيقية والأصلية.
أي دالة في كائن PDO تُستخدم لتنفيذ أمر هيكلة ثابت (مثل CREATE TABLE) لا يُرجع صفوف نتائج؟
تُستخدم الدالة $pdo->exec() لتنفيذ أوامر الهيكلة الثابتة التي لا تحتوي على متغيرات خارجية.
يمكنك كتابة $pdo = new PDO("sqlite::memory:"); لإنشاء قاعدة بيانات SQLite مؤقتة وسريعة في الذاكرة لأغراض التجريب والاختبار.
صواب؛ ينشئ المسار sqlite::memory: قاعدة بيانات SQLite فورية داخل الذاكرة العشوائية.
أي خيارين مما يلي ينتميان إلى ثلاثية إعدادات الأمان القياسية لاتصال PDO؟
تفعيل استثناءات الأخطاء ERRMODE_EXCEPTION وضبط نمط الجلب الترابطي FETCH_ASSOC.