انتقل إلى محتوى الدرس
الدرس 82
دورة PHP

استعلامات الجلب والفلترة والترتيب عبر PDO في PHPPHP PDO Selecting Filtering and Sorting Data

تعلّم استعلامات الجلب والفلترة والترتيب عبر PDO في PHP بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
2
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

عند البحث عن سجل مفرد (مثل جلب بيانات مستخدم عبر معرفه الأساسي id أو بريده الإلكتروني الفريد)، ننفذ استعلام SELECT محضراً ثم نستدعي الدالة $stmt->fetch():

  • إرجاع الصف أو false: مع تفعيل النمط PDO::FETCH_ASSOC، تُرجع الدالة fetch() مصفوفة ترابطية تمثل السجل المطابق، أو تُرجع القيمة المنطقية false إذا لم يُعثر على السجل.
  • التحقق قبل قراءة الحقول: افحص دائماً if ($user !== false) قبل قراءة مفاتيح المصفوفة لتجنب أخطاء الوصول لسجل غير موجود.
مخطط يقارن بين دوال الجلب الثلاث fetch و fetchAll و fetchColumn في واجهة PDO بلغة PHP 8.4
PHP
<?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
<?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
<?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
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
<?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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم جلب سجل مفرد بدالة fetch للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم جلب كافة السجلات بدالة fetchAll وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ماذا تُرجع الدالة $stmt->fetch() عندما لا يطابق استعلام SELECT أي سجل في قاعدة البيانات؟

تُرجع الدالة $stmt->fetch() القيمة المنطقية false عند عدم العثور على أي سجل مطابق.

02

ماذا تُرجع الدالة $stmt->fetchAll() عندما لا توجد أي صفوف مطابقة لاستعلام SELECT؟

تُرجع الدالة $stmt->fetchAll() مصفوفة فارغة [] عند عدم وجود نتائج.

03

كيف يجب ربط رمز البحث %search% الخاص بمعامل LIKE داخل استعلام PDO محضر؟

نكتب LIKE :q في جملة SQL، ونضيف علامات % إلى قيمة المتغير داخل مصفوفة PHP: ["q" => "%" . $search . "%"].

04

بما أن المعاملات النائبة في SQL لا تقبل أسماء الأعمدة أو الجداول، يجب التحقق من اسم عمود الترتيب الديناميكي في ORDER BY عبر قائمة بيضاء أو تعبير match في PHP.

صواب؛ يجب دائماً مطابقة أسماء أعمدة الترتيب الديناميكية مع قائمة مسموحة مسبقاً في PHP.

05

أي دالة في كائن PDOStatement تُعد الأنسب لقراءة الناتج الرقمي المفرد للاستعلام SELECT COUNT(*) FROM users؟

تُرجع الدالة $stmt->fetchColumn() قيمة العمود الأول من السجل مباشرة كقيمة مفردة.

06

استخدام الحلقة while ($row = $stmt->fetch()) يعالج النتائج الكبيرة صفاً تلو الآخر دون تحميل الجدول بأكمله دفعة واحدة في ذاكرة PHP.

صواب؛ سحب الصفوف واحداً تلو الآخر عبر fetch() يحافظ على استهلاك منخفض وثابت للذاكرة.

07

ماذا تُرجع الدالة $stmt->fetchAll(PDO::FETCH_COLUMN) عند استدعائها؟

تُرجع مصفوفة أحادية البعد تضم قيم العمود الأول من جميع الصفوف المسترجعة.

08

أي عبارتين مما يلي تقارنان بدقة بين الدوال fetch() و fetchAll() و fetchColumn()؟

تُرجع fetch() صفاً واحداً أو false، بينما تُرجع fetchAll() مصفوفة بجميع الصفوف أو مصفوفة فارغة [].