النماذج في PHP: استقبال البيانات بـ GET و POST
في كورس HTML بنيت نماذج جميلة فيها حقول وأزرار، لكن عند الضغط على «إرسال» لم يحدث شيء مفيد، لأن HTML لا تستطيع استقبال البيانات ومعالجتها. هذا عمل لغة الخادم. في هذا الدرس ستربط النماذج بـ PHP لأول مرة: ستقرأ ما كتبه الزائر، وتتحقق منه، وترد عليه، وتتعلم أهم قاعدة أمان في برمجة الويب.
من النموذج إلى PHP
Section titled “من النموذج إلى PHP”تذكّر خاصيتين من درس النماذج في HTML:
action: الصفحة التي ستستقبل البيانات، وهي هنا ملف PHP.method: طريقة الإرسال:getأوpost.
وكل حقل له خاصية name، وهذا الاسم هو المفتاح الذي ستقرأ به قيمته في PHP. PHP تجمع البيانات المرسلة في مصفوفتين ترابطيتين جاهزتين:
$_GET: للبيانات المرسلة بطريقة GET.$_POST: للبيانات المرسلة بطريقة POST.
طريقة GET
Section titled “طريقة GET”البيانات تُرسل داخل الرابط نفسه بعد علامة ?. جرّب هذا الملف:
<?php$name = $_GET["name"] ?? "زائر";echo "أهلاً يا " . htmlspecialchars($name);افتح في المتصفح الرابط http://localhost:8000/hello.php?name=سارة وسترى:
أهلاً يا سارةوإذا فتحت الصفحة بدون ?name=... سترى «أهلاً يا زائر»، بفضل المعامل ?? الذي تعلمته في درس الشروط. (سنشرح htmlspecialchars بعد قليل.)
وهذا نموذج بحث يرسل إلى نفسه بطريقة GET، ويعرض كلمة البحث:
<?php$q = $_GET["q"] ?? "";?><form action="search.php" method="get"> <label for="q">ابحث عن درس</label> <input type="text" id="q" name="q" value="<?= htmlspecialchars($q) ?>"> <button type="submit">بحث</button></form>
<?php if ($q !== ""): ?> <p>نتائج البحث عن: <?= htmlspecialchars($q) ?></p><?php endif; ?>لاحظ شيئين جديدين:
<?= ... ?>اختصار لـ<?php echo ... ?>، ومريح جداً داخل HTML.- الصيغة
if (...):ثمendif;بدل الأقواس المعقوفة، وهي أوضح عند خلط PHP مع HTML.
بعد البحث عن «PHP» سيصبح الرابط search.php?q=PHP، وستظهر الفقرة «نتائج البحث عن: PHP».
طريقة POST
Section titled “طريقة POST”البيانات تُرسل داخل جسم الطلب، ولا تظهر في الرابط.
| GET | POST | |
|---|---|---|
| مكان البيانات | في الرابط | داخل الطلب، مخفية عن الرابط |
| حفظ الرابط ومشاركته | ممكن، والنتيجة نفسها | غير ممكن |
| الاستخدام المناسب | البحث والتصفية | تسجيل الدخول، والرسائل، والطلبات، وأي شيء يغيّر بيانات |
| كلمات المرور | ممنوع أبداً | نعم (مع HTTPS) |
تخيّل GET مثل بطاقة بريدية: كل من يلمسها يقرأ ما فيها. و POST مثل رسالة في ظرف مغلق. لكن انتبه: POST وحدها ليست تشفيراً، والحماية الحقيقية تأتي من HTTPS.
أهم قاعدة أمان: لا تثق بالمدخلات أبداً
Section titled “أهم قاعدة أمان: لا تثق بالمدخلات أبداً”ماذا لو كتب شخص في حقل الاسم كوداً بدلاً من اسمه؟ انظر هذا الكود غير الآمن:
<?phpecho "أهلاً يا " . $_GET["name"];إذا فتح أحدهم الرابط unsafe.php?name=<b>hi</b>، يرسل الخادم هذا HTML حرفياً:
أهلاً يا <b>hi</b>المتصفح نفّذ الوسم! وهذا يعني أن المهاجم يستطيع حقن أي HTML أو JavaScript في صفحتك، وسرقة بيانات زوارك. هذا الهجوم اسمه XSS (Cross-Site Scripting)، ومن أشهر ثغرات الويب.
الحل: الدالة htmlspecialchars تحوّل الرموز الخطرة مثل < و > إلى نص عادي غير قابل للتنفيذ. مع نفس الرابط، الملف hello.php الآمن يرسل:
أهلاً يا <b>hi</b>فيرى الزائر النص <b>hi</b> كما هو، دون أن يُنفَّذ.
مشروع: نموذج تواصل كامل
Section titled “مشروع: نموذج تواصل كامل”هذا نموذج يرسل لنفسه، ويتحقق من البيانات، ويعرض الأخطاء، ويحتفظ بما كتبه الزائر حتى لا يكتبه من جديد:
<?php$errors = [];$name = "";$email = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") { $name = trim($_POST["name"] ?? ""); $email = trim($_POST["email"] ?? "");
if ($name === "") { $errors[] = "الاسم مطلوب"; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = "البريد الإلكتروني غير صحيح"; }
if (count($errors) === 0) { echo "<p>شكراً يا " . htmlspecialchars($name) . "، وصلتنا رسالتك.</p>"; exit; }}?><?php foreach ($errors as $error): ?> <p class="error"><?= $error ?></p><?php endforeach; ?>
<form action="contact.php" method="post"> <label for="name">الاسم</label> <input type="text" id="name" name="name" value="<?= htmlspecialchars($name) ?>">
<label for="email">البريد الإلكتروني</label> <input type="email" id="email" name="email" value="<?= htmlspecialchars($email) ?>">
<button type="submit">إرسال</button></form>خطوة بخطوة:
$_SERVER["REQUEST_METHOD"] === "POST": هل وصلت الصفحة بعد ضغط «إرسال»؟ عند فتحها أول مرة تكون الطريقة GET، فيظهر النموذج فارغاً.trim: تحذف المسافات الزائدة في البداية والنهاية، فلا يمر اسم مكوّن من مسافات فقط.filter_var(..., FILTER_VALIDATE_EMAIL): دالة جاهزة تفحص صحة البريد.- الأخطاء تُجمع في مصفوفة
$errors، وإذا كانت فارغة نشكر الزائر ونوقف الصفحة بـexit. - الحقول تحتفظ بقيمها عبر
value، ومحمية بـhtmlspecialchars.
عند إرسال النموذج بحقل اسم فارغ وبريد abc، يظهر فوق النموذج:
<p class="error">الاسم مطلوب</p><p class="error">البريد الإلكتروني غير صحيح</p>وعند إرسال «سارة» و [email protected]:
<p>شكراً يا سارة، وصلتنا رسالتك.</p>جرّب بنفسك
Section titled “جرّب بنفسك”- شغّل خادم PHP في مجلد مشروعك بالأمر
php -S localhost:8000. - أنشئ
contact.phpبالكود السابق، وافتحhttp://localhost:8000/contact.php. - جرّب الإرسال فارغاً، ثم ببريد خاطئ، ثم ببيانات صحيحة.
- تحدٍّ: أضف حقل
textareaللرسالة باسمmessage، واجعله إجبارياً بطول 10 حروف على الأقل (تذكّرmb_strlen).
أخطاء شائعة
Section titled “أخطاء شائعة”- قراءة حقل غير موجود مباشرة:
$_POST["name"]بدون??تعطي تحذيراًUndefined array keyعند فتح الصفحة أول مرة. - نسيان الخاصية name في HTML: الحقل بدون
nameلا يصل إلى PHP أبداً. - عرض المدخلات بدون htmlspecialchars: ثغرة XSS تعرّض زوارك للخطر.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي طريقة إرسال مناسبة لنموذج تسجيل الدخول بكلمة مرور؟
GET تضع البيانات في الرابط فتظهر في سجل المتصفح والخوادم، لذلك كلمات المرور ترسل بـ POST مع HTTPS.
سؤال
ما وظيفة htmlspecialchars عند عرض بيانات المستخدم؟
htmlspecialchars تمنع تنفيذ أي HTML أو JavaScript مكتوب في المدخلات، فتحمي من هجمات XSS.
الخلاصة
Section titled “الخلاصة”- بيانات النماذج تصل في المصفوفتين
$_GETو$_POST، ومفاتيحها هي قيمname. - GET تضع البيانات في الرابط وتناسب البحث، و POST تخفيها وتناسب ما يغيّر البيانات.
- اقرأ الحقول بـ
?? ""ونظّفها بـtrim، وتحقق منها على الخادم دائماً. - اعرض أي مدخلات داخل
htmlspecialcharsلتحمي صفحتك من XSS. <?= ?>وif:/foreach:تجعل خلط PHP مع HTML أوضح.