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

التحقق المتقدم بالخيارات والأعلام عبر filter_var و filter_input في PHPPHP Filter Validation Options Flags and Input Filtering

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

يوفر امتداد الفلاتر في PHP قواعد تحقق وتنظيف مدمجة يمكنك استعراضها برمجياً عبر دالتي filter_list() وfilter_id().

  • فلاتر التحقق (FILTER_VALIDATE_*) تفحص تطابق المدخل مع الصيغة المطلوبة، وترجع القيمة بنوعها الصحيح عند النجاح أو false عند الفشل دون تشويه البيانات.
  • فلاتر التنظيف (FILTER_SANITIZE_*) تحذف أو ترمز المحارف غير المرغوبة داخل النص.
  • ترجع filter_list() قائمة بأسماء الفلاتر المسجلة، وترجع filter_id($name) الرقم المعرف الموافق لاسم الفلتر.

تُرجع filter_id("int") المعرف الرقمي 257 وهو نفس قيمة الثابت FILTER_VALIDATE_INT تماماً.

مخطط توضيحي: محاكي خيارات وأعلام التحقق المتقدم (filter_var / filter_input_array) في PHP
PHP
<?php
$allFilters = filter_list();
echo "Total built-in filters: " . count($allFilters) . "\n";
echo "int filter ID   : " . filter_id("int") . " (" . FILTER_VALIDATE_INT . ")\n";
echo "email filter ID : " . filter_id("validate_email") . " (" . FILTER_VALIDATE_EMAIL . ")\n";

يقبل المعامل الثالث في filter_var($value, $filter, $options) مصفوفة ترابطية متداخلة تحت المفتاح "options" لفرض حدود النطاق الرقمي وتحديد قيمة افتراضية بديلة.

  • استخدم "min_range" و"max_range" مع FILTER_VALIDATE_INT لحصر أرقام الصفحات أو الكميات أو المنافذ ضمن مجال مسموح.
  • أضف "default" => $fallback داخل مصفوفة "options" لكي تُرجع الدالة القيمة الافتراضية تلقائياً عند فشل التحقق بدلاً من false.
  • انتبه لهيكل التداخل الإلزامي: ["options" => ["min_range" => 1, "max_range" => 100, "default" => 1]].

عندما تفشل القيمة "-5" أو "abc" في اجتياز شرط النطاق من 1 إلى 50، ترجع filter_var() القيمة الافتراضية الآمنة 1.

PHP
<?php
$pageRules = [
    "options" => [
        "min_range" => 1,
        "max_range" => 50,
        "default"   => 1,
    ],
];

echo "Valid page 12 : " . filter_var("12", FILTER_VALIDATE_INT, $pageRules) . "\n";
echo "Invalid -5    : " . filter_var("-5", FILTER_VALIDATE_INT, $pageRules) . "\n";
echo "Invalid 'abc' : " . filter_var("abc", FILTER_VALIDATE_INT, $pageRules) . "\n";

تُخصّص أعلام الفلاتر (Flags) قواعد التحقق بدقة باستخدام معامل الدمج الثنائي (|) أو عبر المفتاح "flags" في مصفوفة الخيارات.

  • ادمج FILTER_VALIDATE_IP مع الأعلام FILTER_FLAG_IPV4 أو FILTER_FLAG_IPV6 أو FILTER_FLAG_NO_PRIV_RANGE لمنع العناوين الداخلية الخاصة.
  • ادمج FILTER_VALIDATE_DOMAIN مع العلم FILTER_FLAG_HOSTNAME للتحقق من أسماء النطاقات القياسية.
  • استخدم العلم FILTER_NULL_ON_FAILURE لإرجاع null عند فشل التحقق بدلاً من false (مفيد جداً مع القيم المنطقية).

يدمج المعامل | العلمين معاً فيرفض العنوان الداخلي الخاص 10.0.0.1 ويقبل عنوان IPv4 العام 93.184.216.34.

PHP
<?php
$ipFlags = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE;

$lanIp = filter_var("10.0.0.1", FILTER_VALIDATE_IP, $ipFlags);
$pubIp = filter_var("93.184.216.34", FILTER_VALIDATE_IP, $ipFlags);
$host  = filter_var("api.closetag.com", FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME);

echo "LAN IP valid? " . ($lanIp ? "Yes" : "No") . "\n";
echo "Public IP   : $pubIp | Host: $host\n";

تقرأ الدالة filter_input($type, $varName, $filter, $options) مفتاحاً من مصادر الطلب الخارجية (INPUT_GET أو INPUT_POST) وتتحقق منه في خطوة واحدة.

  • على عكس قراءة $_POST["age"] مباشرة، لا تطلق filter_input(INPUT_POST, "age", ...) تحذير مفتاح غير معرف إذا كان الحقل مفقوداً.
  • انتبه لقيمتها المرجعة: ترجع null إذا لم يُرسل الحقل أصلاً في الطلب، وترجع false إذا أُرسل الحقل ولكنه فشل في التحقق!
  • تقرأ filter_input() بيانات الطلب الأصلية القادمة من الخادم، ولا تتأثر بالتعديلات اليدوية على $_GET أو $_POST أثناء تشغيل السكريبت.

تفرّق المقارنة الصارمة === null بين الحقل الاختياري غير المرسل أصلاً وبين الحقل المرسل بصيغة خاطئة (=== false).

مخطط تدفق التنفيذ العملي لقسم قراءة وفحص مدخلات الطلب مباشرة عبر filter_input في لغة PHP
PHP
<?php
// Simulating filter_input return states:
$missingField = filter_input(INPUT_GET, "coupon_id", FILTER_VALIDATE_INT);

if ($missingField === null) {
    echo "Status: 'coupon_id' was not provided in query string.\n";
} elseif ($missingField === false) {
    echo "Status: 'coupon_id' must be a valid integer.\n";
}

بدلاً من تكرار استدعاء filter_var() عشرات المرات لنموذج كبير، عرّف مخطط قواعد التحقق في مصفوفة واحدة ومرره إلى filter_input_array() أو filter_var_array().

  • يربط كل مفتاح في المخطط اسم الحقل بثابت الفلتر أو بمصفوفة إعدادات تضم "filter" و"flags" و"options".
  • افتراضياً ($add_empty = true)، تُضاف الحقول الغائبة عن المدخلات إلى المصفوفة الناتجة بقيمة null.
  • الحقول التي تفشل في التحقق تأخذ القيمة false في المصفوفة الناتجة، مما يسهل جمع أخطاء النموذج دفعة واحدة.

تتحقق filter_var_array() من الحقول الثلاثة دفعة واحدة وفق المخطط $schema؛ فينجح البريد والكمية بينما تصبح قيمة "ip" الخاطئة false.

PHP
<?php
$postData = ["email" => "[email protected]", "qty" => "4", "ip" => "999.9.9.9"];
$schema   = [
    "email" => FILTER_VALIDATE_EMAIL,
    "qty"   => ["filter" => FILTER_VALIDATE_INT, "options" => ["min_range" => 1, "max_range" => 10]],
    "ip"    => ["filter" => FILTER_VALIDATE_IP,  "flags"   => FILTER_FLAG_IPV4],
];

$clean = filter_var_array($postData, $schema);
echo "Email: " . $clean["email"] . " | Qty: " . $clean["qty"] . " | IP valid? " . ($clean["ip"] ? "Yes" : "No") . "\n";

تم إيقاف وإلغاء FILTER_SANITIZE_STRING في PHP 8.1+ لأن حذف الوسوم وترميز علامات الاقتباس عند الإدخال يشوه النصوص المشروعة ولا يضمن الحماية الكاملة في كل سياقات العرض.

  • لا تستخدم FILTER_SANITIZE_STRING أبداً في PHP 8.1+ لأنها تطلق تحذير إهمال (Deprecated).
  • بدلاً من ذلك، نظف النص عند الإدخال بـ trim() وتحقق من طوله بـ mb_strlen()، ثم خزّن النص الحقيقي كما هو في قاعدة البيانات.
  • رمّز المخرجات لحماية HTML لحظة العرض فقط داخل القالب عبر htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8").

يحافظ الفصل بين التحقق من المدخلات وترميز المخرجات عند العرض على النص الأصلي السليم لقاعدة البيانات مع منع حقن HTML في المتصفح.

الثابت / الدالةالتصنيفالحالة في PHP 8.4 وأفضل ممارسة
FILTER_VALIDATE_INTتحقق (Validation)مدعوم — يدعم خيارات min_range وmax_range وdefault
FILTER_VALIDATE_IPتحقق (Validation)مدعوم — يدعم رايات IPV4 وIPV6 وNO_PRIV_RANGE
FILTER_VALIDATE_BOOLتحقق (Validation)مدعوم — يُقرن مع الراية FILTER_NULL_ON_FAILURE
filter_input_array()تحقق جماعي (Batch)مدعوم — يفحص مصفوفة المدخلات دفعة واحدة وفق مخطط القواعد
FILTER_SANITIZE_STRINGتعقيم (Sanitization)مُهمل في PHP 8.1+ — استخدم trim() عند الإدخال وhtmlspecialchars() عند العرض
PHP
<?php
$rawBio = "  I love O'Reilly books & <PHP 8.4>!  ";

// 1. Input stage: normalize whitespace & validate length
$cleanBio = trim($rawBio);
$isValid  = mb_strlen($cleanBio) <= 160;

// 2. Output stage (HTML context): escape safely
$safeHtml = htmlspecialchars($cleanBio, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8");
echo "Valid ($isValid): $safeHtml\n";
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

تم إيقاف وإلغاء FILTER_SANITIZE_STRING في PHP 8.1+ لأن حذف الوسوم وترميز علامات الاقتباس عند الإدخال يشوه النصوص المشروعة ولا يضمن الحماية الكاملة في كل سياقات العرض. لا تستخدم FILTER_SANITIZE_STRING أبداً في PHP 8.1+ لأنها تطلق تحذير إهمال (Deprecated). بدلاً من ذلك، نظف النص عند الإدخال بـ trim() وتحقق من طوله بـ mb_strlen()، ثم خزّن النص الحقيقي كما هو في قاعدة البيانات. رمّز المخرجات لحماية HTML لحظة العرض فقط داخل القالب عبر htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8").

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Filter Flags & Options خيارات وأعلام الفلاتر
اضبط حدود النطاقات الرقمية والقيم الافتراضية وأعلام التحقق من العناوين وفحص المدخلات مباشرة عبر filter_var وfilter_input في PHP 8.
للمراجعة
02 Inspecting Filters with filter_list استعراض الفلاتر المدمجة ومعرفاتها بـ filter_list
المفهوم الأساسي لقسم استعراض الفلاتر المدمجة ومعرفاتها بـ filter_list في لغة PHP الحديثة.
للمراجعة
03 Range and Default Options in filter_var تحديد النطاق min_range و max_range والقيمة الافتراضية
الصياغة البرمجية والتطبيق العملي المباشر لقسم تحديد النطاق min_range و max_range والقيمة الافتراضية.
للمراجعة
04 Validating IPs and Domains with Flags فحص عناوين IPv4 و IPv6 والنطاقات بالأعلام المتخصصة
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم فحص عناوين IPv4 و IPv6 والنطاقات بالأعلام المتخصصة.
للمراجعة

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

حروف قليلة. معنى كامل.

الاختصارات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 محلياً ونفّذ المثال البرمجي المشروح في قسم استعراض الفلاتر المدمجة ومعرفاتها بـ filter_list للتحقق من المخرجات.

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

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

مساحة التحدي

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

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

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

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

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

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

كيف يجب هيكلة المعامل الثالث في filter_var() لفرض حد أدنى 1 وقيمة افتراضية 10؟

تشترط filter_var() وضع إعدادات النطاق والقيمة الافتراضية داخل مصفوفة فرعية مفتاحها "options".

02

أي معامل يُستخدم لدمج عدة أعلام فلترة معاً مثل FILTER_FLAG_IPV4 وFILTER_FLAG_NO_PRIV_RANGE؟

أعلام الفلاتر هي أقنعة ثنائية (Bitmasks) وتُدمج بمعامل | الفردي.

03

ما الفرق بين إرجاع القيمة null وإرجاع القيمة false من الدالة filter_input(INPUT_POST, "age", FILTER_VALIDATE_INT)؟

ترجع filter_input() القيمة null عند غياب الحقل، وfalse عند فشل التحقق من صحته.

04

لماذا تم إيقاف وإهمال الفلتر FILTER_SANITIZE_STRING في PHP 8.1؟

يجب التحقق من المدخلات كما هي وترميزها فقط عند الطباعة في HTML عبر htmlspecialchars().

05

أي دالة تتحقق من مصفوفة ترابطية كاملة من الحقول دفعة واحدة وفق مصفوفة قواعد محددة؟

تتحقق filter_var_array() وfilter_input_array() من عدة حقول دفعة واحدة عبر مخطط القواعد.

06

أي علم يضمن أن ترفض FILTER_VALIDATE_IP عناوين الشبكة الداخلية الخاصة مثل 192.168.1.1 و10.0.0.1؟

يرفض العلم FILTER_FLAG_NO_PRIV_RANGE نطاقات الشبكة الداخلية الخاصة.

07

ماذا ترجع filter_var("yes", FILTER_VALIDATE_BOOL, FILTER_NULL_ON_FAILURE) مقارنة بتمرير النص "maybe"؟

مع علم FILTER_NULL_ON_FAILURE ترجع النصوص الإيجابية true والسلبية false وأي نص غير معروف يرجع null.

08

ما هي أفضل ممارسة حديثة في PHP 8.4 للتعامل مع حقل نصي عادي مثل "تعليق" يرسله المستخدم؟

الفصل بين التحقق عند الإدخال والترميز عند العرض يمنع تشوه البيانات ويحمي من XSS.