في هذا الدرس 6تصفّح المواضيع
يوفر امتداد الفلاتر في PHP قواعد تحقق وتنظيف مدمجة يمكنك استعراضها برمجياً عبر دالتي filter_list() وfilter_id().
- فلاتر التحقق (
FILTER_VALIDATE_*) تفحص تطابق المدخل مع الصيغة المطلوبة، وترجع القيمة بنوعها الصحيح عند النجاح أوfalseعند الفشل دون تشويه البيانات. - فلاتر التنظيف (
FILTER_SANITIZE_*) تحذف أو ترمز المحارف غير المرغوبة داخل النص. - ترجع
filter_list()قائمة بأسماء الفلاتر المسجلة، وترجعfilter_id($name)الرقم المعرف الموافق لاسم الفلتر.
تُرجع filter_id("int") المعرف الرقمي 257 وهو نفس قيمة الثابت FILTER_VALIDATE_INT تماماً.
<?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
$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
$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).
<?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
$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
$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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم استعراض الفلاتر المدمجة ومعرفاتها بـ filter_list للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم تحديد النطاق min_range و max_range والقيمة الافتراضية وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
كيف يجب هيكلة المعامل الثالث في filter_var() لفرض حد أدنى 1 وقيمة افتراضية 10؟
تشترط filter_var() وضع إعدادات النطاق والقيمة الافتراضية داخل مصفوفة فرعية مفتاحها "options".
أي معامل يُستخدم لدمج عدة أعلام فلترة معاً مثل FILTER_FLAG_IPV4 وFILTER_FLAG_NO_PRIV_RANGE؟
أعلام الفلاتر هي أقنعة ثنائية (Bitmasks) وتُدمج بمعامل | الفردي.
ما الفرق بين إرجاع القيمة null وإرجاع القيمة false من الدالة filter_input(INPUT_POST, "age", FILTER_VALIDATE_INT)؟
ترجع filter_input() القيمة null عند غياب الحقل، وfalse عند فشل التحقق من صحته.
لماذا تم إيقاف وإهمال الفلتر FILTER_SANITIZE_STRING في PHP 8.1؟
يجب التحقق من المدخلات كما هي وترميزها فقط عند الطباعة في HTML عبر htmlspecialchars().
أي دالة تتحقق من مصفوفة ترابطية كاملة من الحقول دفعة واحدة وفق مصفوفة قواعد محددة؟
تتحقق filter_var_array() وfilter_input_array() من عدة حقول دفعة واحدة عبر مخطط القواعد.
أي علم يضمن أن ترفض FILTER_VALIDATE_IP عناوين الشبكة الداخلية الخاصة مثل 192.168.1.1 و10.0.0.1؟
يرفض العلم FILTER_FLAG_NO_PRIV_RANGE نطاقات الشبكة الداخلية الخاصة.
ماذا ترجع filter_var("yes", FILTER_VALIDATE_BOOL, FILTER_NULL_ON_FAILURE) مقارنة بتمرير النص "maybe"؟
مع علم FILTER_NULL_ON_FAILURE ترجع النصوص الإيجابية true والسلبية false وأي نص غير معروف يرجع null.
ما هي أفضل ممارسة حديثة في PHP 8.4 للتعامل مع حقل نصي عادي مثل "تعليق" يرسله المستخدم؟
الفصل بين التحقق عند الإدخال والترميز عند العرض يمنع تشوه البيانات ويحمي من XSS.