في هذا الدرس 6تصفّح المواضيع
عند البحث عن سجل مفرد (مثل جلب بيانات مستخدم عبر معرفه الأساسي id أو بريده الإلكتروني الفريد)، ننفذ استعلام SELECT محضراً ثم نستدعي الدالة $stmt->fetch():
- إرجاع الصف أو
false: مع تفعيل النمطPDO::FETCH_ASSOC، تُرجع الدالةfetch()مصفوفة ترابطية تمثل السجل المطابق، أو تُرجع القيمة المنطقيةfalseإذا لم يُعثر على السجل. - التحقق قبل قراءة الحقول: افحص دائماً
if ($user !== false)قبل قراءة مفاتيح المصفوفة لتجنب أخطاء الوصول لسجل غير موجود.
<?php
$pdo = new PDO("sqlite::memory:", null, null, [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$pdo->exec("CREATE TABLE users (id INT, name TEXT)");
$pdo->exec("INSERT INTO users VALUES (10, 'Mona')");
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE id = :id");
$stmt->execute(["id" => 10]);
$user = $stmt->fetch();
echo ($user !== false) ? $user["name"] : "Not found";
لجلب كافة السجلات المطابقة دفعة واحدة كمصفوفة تضم مصفوفات ترابطية (لعرض جدول منتجات أو قائمة مقالات مثلاً)، نستدعي الدالة $stmt->fetchAll():
- إرجاع مصفوفة فارغة
[]عند عدم التطابق: على عكس الدالةfetch()التي تُرجعfalse، تُرجع الدالةfetchAll()دائماً مصفوفة (وتكون مصفوفة فارغة[]إذا لم توجد نتائج). - الجاهزية المباشرة لحلقة
foreach: يمكنك المرور على ناتجfetchAll()مباشرة داخل حلقةforeachبأمان.
<?php
$pdo = new PDO("sqlite::memory:", null, null, [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$pdo->exec("CREATE TABLE items (name TEXT)");
$pdo->exec("INSERT INTO items VALUES ('Keyboard'), ('Mouse')");
$stmt = $pdo->prepare("SELECT name FROM items");
$stmt->execute();
$items = $stmt->fetchAll();
echo count($items) . " items loaded.";
لتصفية السجلات بأمان باستخدام جملة الشرط WHERE (سواء للمقارنة الرقمية أو البحث النصي بالمعامل LIKE)، نمرر جميع قيم الفلترة كمعاملات مربوطة في الاستعلام المحضر:
- الطريقة الصحيحة لمعامل البحث
LIKE: ندمج علامتي النسبة المئوية%مع النص داخل مصفوفةexecute(["q" => "%" . $term . "%"])، ولا نضع علامات تنصيص حول:qداخل جملة SQL. - تحديد الأعمدة المطلوبة صراحةً: اذكر أسماء الأعمدة التي تحتاجها فعلياً بدلاً من
SELECT *لتقليل استهلاك الذاكرة والشبكة.
<?php
$pdo = new PDO("sqlite::memory:", null, null, [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$pdo->exec("CREATE TABLE books (title TEXT, price INT)");
$pdo->exec("INSERT INTO books VALUES ('PHP 8 Guide', 40), ('CSS Grid', 30)");
$stmt = $pdo->prepare("SELECT title FROM books WHERE title LIKE :q AND price >= :min");
$stmt->execute(["q" => "%PHP%", "min" => 25]);
echo $stmt->fetch()["title"];
يُستخدم أمر الترتيب ORDER BY مع أمر تحديد العدد LIMIT / OFFSET لفرز النتائج وتقسيم الصفحات (Pagination) بكفاءة:
- تحديد عدد صفوف الصفحة: يحدد
LIMITأقصى عدد للسجلات المسترجعة، بينما يحددOFFSETنقطة البداية. - تأمين اسم عمود الترتيب الديناميكي: بما أن العناصر النائبة في SQL مخصصة للقيم فقط ولا تصلح لأسماء الأعمدة، يجب فحص اسم عمود الترتيب القادم من المستخدم عبر تعبير
matchأو قائمة بيضاء صارمة في PHP.
<?php
$sortInput = "price_desc";
$orderBy = match ($sortInput) {
"price_desc" => "price DESC",
default => "id ASC",
};
$sql = "SELECT id, price FROM products ORDER BY {$orderBy} LIMIT :limit";
echo $sql;
عندما يحتاج الاستعلام إلى قيمة مفردة واحدة فقط من السجل الأول — مثل حساب عدد الصفوف SELECT COUNT(*) أو مجموع المبيعات SUM(total) — نستخدم الدالة المختصرة $stmt->fetchColumn():
- إرجاع القيمة مباشرة: تُرجع الدالة قيمة العمود الأول (رقم
0افتراضياً) مباشرة كقيمة مفردة دون وضعها داخل مصفوفة، أو تُرجعfalseعند عدم وجود صفوف. - اختصار استعلامات الإحصاء: تغنيك عن كتابة اسم مستعار للدالة
COUNT(*)وفك مصفوفة النتيجة.
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec("CREATE TABLE orders (status TEXT, total INT)");
$pdo->exec("INSERT INTO orders VALUES ('paid', 100), ('paid', 250)");
$stmt = $pdo->prepare("SELECT SUM(total) FROM orders WHERE status = :st");
$stmt->execute(["st" => "paid"]);
$revenue = (int) $stmt->fetchColumn();
echo "Total Paid Revenue: " . $revenue;
يقارن الجدول المرجعي التالي بين دوال وأنماط جلب البيانات في PDO بلغة PHP 8.4:
| الدالة / النمط | القيمة المُرجعة عند التطابق | القيمة عند عدم وجود نتائج | الاستخدام الأمثل |
|---|---|---|---|
$stmt->fetch() | صف واحد (array) | false | البحث عن سجل مفرد بالمعرف أو البريد |
$stmt->fetchAll() | مصفوفة بجميع الصفوف | [] (مصفوفة فارغة) | عرض الجداول والقوائم ومجموعات البيانات |
$stmt->fetchColumn() | قيمة مفردة مباشرة | false | دوال الإحصاء COUNT(*) و SUM() |
PDO::FETCH_ASSOC | ["col" => $val] | ثابت نمط الجلب | النمط القياسي لإرجاع مصفوفة ترابطية نظيفة |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس جلب السجل المفرد عبر $stmt->fetch()، وجلب قوائم السجلات عبر $stmt->fetchAll()، وتصفية النتائج بأمان عبر WHERE وLIKE، وترتيب النتائج وتحديد عددها، وقراءة الإحصائيات المفردة عبر $stmt->fetchColumn(). الخطوة التالية: انتقل إلى الدرس السادس والخمسين والأخير «تحديث وحذف السجلات وإدارة المعاملات البنكية في PDO» لإتقان أوامر التحديث والحذف والمعاملات الذرية.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 PDO Select استعلامات الجلب
- تعلّم استعلامات الجلب والفلترة والترتيب عبر PDO في PHP بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
- للمراجعة
- 02 Fetching Single Row with fetch جلب سجل مفرد بدالة fetch
- المفهوم الأساسي لقسم جلب سجل مفرد بدالة fetch في لغة PHP الحديثة.
- للمراجعة
- 03 Fetching All Rows with fetchAll جلب كافة السجلات بدالة fetchAll
- الصياغة البرمجية والتطبيق العملي المباشر لقسم جلب كافة السجلات بدالة fetchAll.
- للمراجعة
- 04 Filtering Rows with WHERE Bindings تصفية النتائج بشرط WHERE الآمن
- قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم تصفية النتائج بشرط WHERE الآمن.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات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 محلياً ونفّذ المثال البرمجي المشروح في قسم جلب سجل مفرد بدالة fetch للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم جلب كافة السجلات بدالة fetchAll وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ماذا تُرجع الدالة $stmt->fetch() عندما لا يطابق استعلام SELECT أي سجل في قاعدة البيانات؟
تُرجع الدالة $stmt->fetch() القيمة المنطقية false عند عدم العثور على أي سجل مطابق.
ماذا تُرجع الدالة $stmt->fetchAll() عندما لا توجد أي صفوف مطابقة لاستعلام SELECT؟
تُرجع الدالة $stmt->fetchAll() مصفوفة فارغة [] عند عدم وجود نتائج.
كيف يجب ربط رمز البحث %search% الخاص بمعامل LIKE داخل استعلام PDO محضر؟
نكتب LIKE :q في جملة SQL، ونضيف علامات % إلى قيمة المتغير داخل مصفوفة PHP: ["q" => "%" . $search . "%"].
بما أن المعاملات النائبة في SQL لا تقبل أسماء الأعمدة أو الجداول، يجب التحقق من اسم عمود الترتيب الديناميكي في ORDER BY عبر قائمة بيضاء أو تعبير match في PHP.
صواب؛ يجب دائماً مطابقة أسماء أعمدة الترتيب الديناميكية مع قائمة مسموحة مسبقاً في PHP.
أي دالة في كائن PDOStatement تُعد الأنسب لقراءة الناتج الرقمي المفرد للاستعلام SELECT COUNT(*) FROM users؟
تُرجع الدالة $stmt->fetchColumn() قيمة العمود الأول من السجل مباشرة كقيمة مفردة.
استخدام الحلقة while ($row = $stmt->fetch()) يعالج النتائج الكبيرة صفاً تلو الآخر دون تحميل الجدول بأكمله دفعة واحدة في ذاكرة PHP.
صواب؛ سحب الصفوف واحداً تلو الآخر عبر fetch() يحافظ على استهلاك منخفض وثابت للذاكرة.
ماذا تُرجع الدالة $stmt->fetchAll(PDO::FETCH_COLUMN) عند استدعائها؟
تُرجع مصفوفة أحادية البعد تضم قيم العمود الأول من جميع الصفوف المسترجعة.
أي عبارتين مما يلي تقارنان بدقة بين الدوال fetch() و fetchAll() و fetchColumn()؟
تُرجع fetch() صفاً واحداً أو false، بينما تُرجع fetchAll() مصفوفة بجميع الصفوف أو مصفوفة فارغة [].