تعامل مع النماذج باحترافية: طريقة HTTP الصحيحة، والتحقق الصارم من المُدخَلات، وإعادة العرض الآمنة.
افتح هذا الدرس في Kodokonإن النموذج هو أول نقطة تلامس بين مستخدميك وكود PHP الخاص بك. تضع طريقة get البيانات في عنوان URL (?q=pizza): وهي مثالية لعملية بحث أو تصفية، لأنه يمكن حفظ الصفحة في المفضّلة ومشاركتها. أما طريقة post فتحمل البيانات في جسم الطلب: وهي الطريقة الإلزامية كلما كان الطلب يغيّر شيئًا ما (إنشاء حساب، أو طلب شراء، أو حذف) أو يحمل بيانات حساسة. تخزّن PHP القيم المستقبَلة في المتغيرين فائقَي العموم $_GET و$_POST.
<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>";
}
?>القاعدة الاحترافية رقم واحد: لا تثق أبدًا بالبيانات الواردة. يمكن للمستخدم أن يرسل أيّ شيء، بما في ذلك قيم مزيّفة مصنوعة خارج نموذجك. تقرأ الدالة filter_input() قيمة وتتحقق منها في خطوة واحدة: فهي تُرجِع القيمة بعد التحقق منها، أو false إذا كانت غير صالحة، أو null إذا كان الحقل مفقودًا - وهي ثلاث حالات يجب التمييز بينها في رسائل الخطأ.
<?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.";
}عندما يفشل التحقق، لا تُعِد عرض نموذج فارغ: أعِد عرض القيم التي كتبها المستخدم (نموذج "لاصق") مع رسائل الخطأ بجوار الحقول المعنية. ويجب أن تمرّ أيّ قيمة يُعاد عرضها عبر htmlspecialchars(): فهي ما يُبطِل مفعول الوسوم ويمنع حقن السكربتات.
<?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>