كيف يتعامل Prepared Statement مع نص يشبه شرط SQL؟

متوسطقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

عندما تمرر قيمة نصية إلى موضع معامل في استعلام محضر، تستخدم القيمة بوصفها بيانات. لا يعاد تفسير محتواها كجزء جديد من صيغة SQL، حتى لو احتوت على كلمة OR أو علامات اقتباس. هذه الخاصية هي جوهر الفصل بين الأمر والبيانات الذي نريده عند التعامل مع مدخلات المستخدم.

إذا كان الشرط يبحث عن اسم يساوي القيمة المربوطة، فإن عبارة تشبه شرطًا منطقيًا تعامل كاسم كامل مطلوب البحث عنه. إن لم يوجد هذا الاسم، تكون النتيجة فارغة. لا تتحول المقارنة إلى شرط صحيح لجميع الصفوف، لأن بنية الاستعلام حددت قبل تمرير القيمة إليه.

مثال

CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(100)
);
INSERT INTO customers VALUES (1, 'Nour');
PREPARE s FROM
  'SELECT id FROM customers WHERE name = ?';
SET @name = 'Nour OR 1=1';
EXECUTE s USING @name;
DEALLOCATE PREPARE s;

من المهم أن يبقى موضع المعامل خارج علامات الاقتباس داخل صيغة الاستعلام. كما يجب ربط القيمة فعلًا، بدل إدراجها باستخدام تجميع النصوص قبل استدعاء التحضير. اسم الأداة وحده لا يوفر الحماية إن استعملناها بالطريقة الخطأ.

باختصار: الكلمات التي تشبه SQL داخل قيمة مربوطة تبقى بيانات، ولا تصبح أوامر أو شروطًا إضافية.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما نتيجة EXECUTE عند تمرير القيمة النصية المحددة في الكود؟

CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(100)
);
INSERT INTO customers VALUES (1, 'Nour'), (2, 'Omar');
PREPARE find_customer FROM
  'SELECT id FROM customers WHERE name = ? ORDER BY id';
SET @name = 'Nour'' OR ''1''=''1';
EXECUTE find_customer USING @name;
DEALLOCATE PREPARE find_customer;