تخطَّ إلى المحتوى

النماذج في PHP: استقبال البيانات بـ GET و POST

الدرس 7 من 12 · PHP

في كورس HTML بنيت نماذج جميلة فيها حقول وأزرار، لكن عند الضغط على «إرسال» لم يحدث شيء مفيد، لأن HTML لا تستطيع استقبال البيانات ومعالجتها. هذا عمل لغة الخادم. في هذا الدرس ستربط النماذج بـ PHP لأول مرة: ستقرأ ما كتبه الزائر، وتتحقق منه، وترد عليه، وتتعلم أهم قاعدة أمان في برمجة الويب.

تذكّر خاصيتين من درس النماذج في HTML:

  • action: الصفحة التي ستستقبل البيانات، وهي هنا ملف PHP.
  • method: طريقة الإرسال: get أو post.

وكل حقل له خاصية name، وهذا الاسم هو المفتاح الذي ستقرأ به قيمته في PHP. PHP تجمع البيانات المرسلة في مصفوفتين ترابطيتين جاهزتين:

  • $_GET: للبيانات المرسلة بطريقة GET.
  • $_POST: للبيانات المرسلة بطريقة POST.

البيانات تُرسل داخل الرابط نفسه بعد علامة ?. جرّب هذا الملف:

hello.php
<?php
$name = $_GET["name"] ?? "زائر";
echo "أهلاً يا " . htmlspecialchars($name);

افتح في المتصفح الرابط http://localhost:8000/hello.php?name=سارة وسترى:

الناتج
أهلاً يا سارة

وإذا فتحت الصفحة بدون ?name=... سترى «أهلاً يا زائر»، بفضل المعامل ?? الذي تعلمته في درس الشروط. (سنشرح htmlspecialchars بعد قليل.)

وهذا نموذج بحث يرسل إلى نفسه بطريقة GET، ويعرض كلمة البحث:

search.php
<?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».

البيانات تُرسل داخل جسم الطلب، ولا تظهر في الرابط.

GET POST
مكان البيانات في الرابط داخل الطلب، مخفية عن الرابط
حفظ الرابط ومشاركته ممكن، والنتيجة نفسها غير ممكن
الاستخدام المناسب البحث والتصفية تسجيل الدخول، والرسائل، والطلبات، وأي شيء يغيّر بيانات
كلمات المرور ممنوع أبداً نعم (مع HTTPS)

تخيّل GET مثل بطاقة بريدية: كل من يلمسها يقرأ ما فيها. و POST مثل رسالة في ظرف مغلق. لكن انتبه: POST وحدها ليست تشفيراً، والحماية الحقيقية تأتي من HTTPS.

أهم قاعدة أمان: لا تثق بالمدخلات أبداً

Section titled “أهم قاعدة أمان: لا تثق بالمدخلات أبداً”

ماذا لو كتب شخص في حقل الاسم كوداً بدلاً من اسمه؟ انظر هذا الكود غير الآمن:

unsafe.php
<?php
echo "أهلاً يا " . $_GET["name"];

إذا فتح أحدهم الرابط unsafe.php?name=<b>hi</b>، يرسل الخادم هذا HTML حرفياً:

الناتج
أهلاً يا <b>hi</b>

المتصفح نفّذ الوسم! وهذا يعني أن المهاجم يستطيع حقن أي HTML أو JavaScript في صفحتك، وسرقة بيانات زوارك. هذا الهجوم اسمه XSS (Cross-Site Scripting)، ومن أشهر ثغرات الويب.

الحل: الدالة htmlspecialchars تحوّل الرموز الخطرة مثل < و > إلى نص عادي غير قابل للتنفيذ. مع نفس الرابط، الملف hello.php الآمن يرسل:

الناتج
أهلاً يا &lt;b&gt;hi&lt;/b&gt;

فيرى الزائر النص <b>hi</b> كما هو، دون أن يُنفَّذ.

مشروع: نموذج تواصل كامل

Section titled “مشروع: نموذج تواصل كامل”

هذا نموذج يرسل لنفسه، ويتحقق من البيانات، ويعرض الأخطاء، ويحتفظ بما كتبه الزائر حتى لا يكتبه من جديد:

contact.php
<?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>

خطوة بخطوة:

  1. $_SERVER["REQUEST_METHOD"] === "POST": هل وصلت الصفحة بعد ضغط «إرسال»؟ عند فتحها أول مرة تكون الطريقة GET، فيظهر النموذج فارغاً.
  2. trim: تحذف المسافات الزائدة في البداية والنهاية، فلا يمر اسم مكوّن من مسافات فقط.
  3. filter_var(..., FILTER_VALIDATE_EMAIL): دالة جاهزة تفحص صحة البريد.
  4. الأخطاء تُجمع في مصفوفة $errors، وإذا كانت فارغة نشكر الزائر ونوقف الصفحة بـ exit.
  5. الحقول تحتفظ بقيمها عبر value، ومحمية بـ htmlspecialchars.

عند إرسال النموذج بحقل اسم فارغ وبريد abc، يظهر فوق النموذج:

الناتج
<p class="error">الاسم مطلوب</p>
<p class="error">البريد الإلكتروني غير صحيح</p>

وعند إرسال «سارة» و sara@example.com:

الناتج
<p>شكراً يا سارة، وصلتنا رسالتك.</p>
  1. شغّل خادم PHP في مجلد مشروعك بالأمر php -S localhost:8000.
  2. أنشئ contact.php بالكود السابق، وافتح http://localhost:8000/contact.php.
  3. جرّب الإرسال فارغاً، ثم ببريد خاطئ، ثم ببيانات صحيحة.
  4. تحدٍّ: أضف حقل textarea للرسالة باسم message، واجعله إجبارياً بطول 10 حروف على الأقل (تذكّر mb_strlen).
  • قراءة حقل غير موجود مباشرة: $_POST["name"] بدون ?? تعطي تحذيراً Undefined array key عند فتح الصفحة أول مرة.
  • نسيان الخاصية name في HTML: الحقل بدون name لا يصل إلى PHP أبداً.
  • عرض المدخلات بدون htmlspecialchars: ثغرة XSS تعرّض زوارك للخطر.

سؤال

أي طريقة إرسال مناسبة لنموذج تسجيل الدخول بكلمة مرور؟

سؤال

ما وظيفة htmlspecialchars عند عرض بيانات المستخدم؟

  • بيانات النماذج تصل في المصفوفتين $_GET و $_POST، ومفاتيحها هي قيم name.
  • GET تضع البيانات في الرابط وتناسب البحث، و POST تخفيها وتناسب ما يغيّر البيانات.
  • اقرأ الحقول بـ ?? "" ونظّفها بـ trim، وتحقق منها على الخادم دائماً.
  • اعرض أي مدخلات داخل htmlspecialchars لتحمي صفحتك من XSS.
  • <?= ?> و if: / foreach: تجعل خلط PHP مع HTML أوضح.