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

Dynamic IN Clauses with Placeholders بناء شرط IN الديناميكي بالمعاملات المحضرة

ابنِ فلاتر بحث ديناميكية بـ LIKE وIN، وأمّن الترتيب بـ ORDER BY، ونفّذ تقسيم الصفحات Pagination عبر LIMIT وOFFSET في PDO.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

لا يمكن لمعامل محضر واحد (WHERE id IN (:ids)) أن يربط مصفوفة كاملة؛ بل يجب توليد سلسلة من علامات ? تطابق عدد عناصر المصفوفة ديناميكياً.

  • استخدم التعبير implode(", ", array_fill(0, count($ids), "?")) لبناء نص المعاملات الموضعية بأمان مثل "?, ?, ?".
  • افحص أولاً أن مصفوفة $ids ليست فارغة، لأن كتابة WHERE id IN () فارغة تسبب خطأ نحوياً في SQL.
  • مرّر المصفوفة المفهرسة array_values($ids) مباشرة إلى $stmt->execute() لربط كل علامة ? بقيمتها بالترتيب.

تولّد array_fill(0, 3, "?") ثلاث علامات استفهام ليقوم الشرط IN (?, ?, ?) بربط المعرفات الثلاثة بأمان.

PHP
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE items (id INT PRIMARY KEY, name TEXT)');
$pdo->exec("INSERT INTO items VALUES (1, 'Pen'), (2, 'Book'), (3, 'Bag'), (4, 'Lamp')");
$ids = [1, 3, 4];
$in = implode(', ', array_fill(0, count($ids), '?'));
$stmt = $pdo->prepare("SELECT name FROM items WHERE id IN ($in)");
$stmt->execute(array_values($ids));
echo implode(', ', $stmt->fetchAll(PDO::FETCH_COLUMN)) . "\n";