Kodokon kodokon.com

النماذج: استقبال البيانات والتحقق منها

تعامل مع النماذج باحترافية: طريقة HTTP الصحيحة، والتحقق الصارم من المُدخَلات، وإعادة العرض الآمنة.

9 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

إن النموذج هو أول نقطة تلامس بين مستخدميك وكود PHP الخاص بك. تضع طريقة get البيانات في عنوان URL (?q=pizza): وهي مثالية لعملية بحث أو تصفية، لأنه يمكن حفظ الصفحة في المفضّلة ومشاركتها. أما طريقة post فتحمل البيانات في جسم الطلب: وهي الطريقة الإلزامية كلما كان الطلب يغيّر شيئًا ما (إنشاء حساب، أو طلب شراء، أو حذف) أو يحمل بيانات حساسة. تخزّن PHP القيم المستقبَلة في المتغيرين فائقَي العموم $_GET و$_POST.

HTML
<form action="search.php" method="get">
  <label for="q">Search</label>
  <input id="q" name="q" type="text">
  <button type="submit">Search</button>
</form>
<?php
$query = trim($_GET['q'] ?? '');

if ($query !== '') {
    echo "<p>You are searching for: " .
        htmlspecialchars($query, ENT_QUOTES) . "</p>";
}
?>
search.php: النموذج ومعالجته في الصفحة نفسها.

القاعدة الاحترافية رقم واحد: لا تثق أبدًا بالبيانات الواردة. يمكن للمستخدم أن يرسل أيّ شيء، بما في ذلك قيم مزيّفة مصنوعة خارج نموذجك. تقرأ الدالة filter_input() قيمة وتتحقق منها في خطوة واحدة: فهي تُرجِع القيمة بعد التحقق منها، أو false إذا كانت غير صالحة، أو null إذا كان الحقل مفقودًا - وهي ثلاث حالات يجب التمييز بينها في رسائل الخطأ.

PHP
<?php

declare(strict_types=1);

$errors = [];

$email = filter_input(
    INPUT_POST,
    'email',
    FILTER_VALIDATE_EMAIL
);

$age = filter_input(
    INPUT_POST,
    'age',
    FILTER_VALIDATE_INT,
    ['options' => ['min_range' => 18, 'max_range' => 120]]
);

$name = trim((string) ($_POST['name'] ?? ''));

if ($name === '' || mb_strlen($name) > 50) {
    $errors[] = "Name required (50 characters max).";
}

if (!is_string($email)) {
    $errors[] = "Invalid email address.";
}

if (!is_int($age)) {
    $errors[] = "Invalid age (between 18 and 120).";
}

if ($errors === []) {
    echo "Registration valid.";
}
التحقق من عملية تسجيل باستخدام filter_input().

عندما يفشل التحقق، لا تُعِد عرض نموذج فارغ: أعِد عرض القيم التي كتبها المستخدم (نموذج "لاصق") مع رسائل الخطأ بجوار الحقول المعنية. ويجب أن تمرّ أيّ قيمة يُعاد عرضها عبر htmlspecialchars(): فهي ما يُبطِل مفعول الوسوم ويمنع حقن السكربتات.

HTML
<?php
$name = trim($_POST['name'] ?? '');
$hasError = isset($_POST['name']) && $name === '';
$safeName = htmlspecialchars($name, ENT_QUOTES);
?>
<form method="post" action="">
  <label for="name">Your name</label>
  <input id="name" name="name"
    value="<?= $safeName ?>">
  <?php if ($hasError): ?>
    <p>Name is required.</p>
  <?php endif; ?>
  <button type="submit">Submit</button>
</form>
النموذج اللاصق: يبقى ما أدخله المستخدم رغم الخطأ.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. أيّ طريقة HTTP مناسبة لنموذج يُنشئ حساب مستخدم؟
    • GET، لكي تبقى البيانات ظاهرة في عنوان URL
    • POST، لأن الطلب يغيّر حالة الخادم ويجب ألّا تظهر البيانات في عنوان URL
    • أيّ منهما يفي بالغرض، فالأمر مسألة أسلوب
  2. ماذا تُرجِع filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL) إذا لم يُرسَل الحقل على الإطلاق؟
    • false
    • سلسلة فارغة
    • null
    • تُطلق استثناءً
  3. لماذا تمرِّر قيمة عبر htmlspecialchars() قبل إعادة عرضها في صفحة؟
    • لإبطال مفعول وسوم HTML ومنع حقن السكربتات (ثغرة XSS)
    • لتصحيح الأخطاء المطبعية تلقائيًا
    • لضغط القيمة وتسريع العرض