شرح صفوف ومحتوى الفقرة
لا تربط المعاملات المحضرة إلا قيم البيانات فقط، ولا يمكنها ربط أسماء الأعمدة أو اتجاه الترتيب (ASC وDESC) في جملة ORDER BY.
- إذا كتبت
ORDER BY :sort، فستعتبر قاعدة البيانات المعامل نصاً ثابتاً ولن تقوم بترتيب الصفوف فعلياً. - تحقق دائماً من عمود الترتيب المطلوب عبر قائمة بيضاء صارمة بالدالة
in_array($sort, $allowedColumns, true)مع تحديد عمود افتراضي آمن. - اضبط اتجاه الترتيب بصرامة عبر تعبير مثل
$dir = strtoupper($inputDir) === "DESC" ? "DESC" : "ASC";.
لا يُدرج اسم العمود في ORDER BY إلا بعد تأكيد وجوده ضمن القائمة البيضاء المعتمدة عبر in_array($userSort, $allowed, true).
PHP
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE products (id INT, price INT)');
$pdo->exec('INSERT INTO products VALUES (1, 300), (2, 120), (3, 450)');
$userSort = 'price';
$allowed = ['id', 'price'];
$col = in_array($userSort, $allowed, true) ? $userSort : 'id';
$dir = 'ASC';
$prices = $pdo->query("SELECT price FROM products ORDER BY $col $dir")->fetchAll(PDO::FETCH_COLUMN);
echo implode(' -> ', $prices) . "\n";