شرح صفوف ومحتوى الفقرة
لا يمكن لمعامل محضر واحد (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";