$_GET مصفوفة نص الاستعلام في الرابط، فيعطي article.php?id=42&lang=en القيمتين $_GET['id'] === '42' و$_GET['lang'] === 'en'. و$_POST مصفوفة حقول نموذج أُرسل بـ method="post". اقرأ كلتيهما مع قيمة افتراضية، $_GET['id'] ?? null، لأن المفتاح يكون مفقودًا كلما كان المعامل مفقودًا.
شغّل الكتلة، ثم انقر على الروابط: كل نقرة تشغّل السكربت مرة أخرى مع ملء $_GET من نص الاستعلام في الرابط.
$_GET['lang'] هي ما يقوله الرابط أيًّا كان، لا الروابط الثلاثة التي طبعتها فقط. يستطيع أي شخص كتابة ?lang=<script> في شريط العنوان، ولهذا تبحث الكتلة عن القيمة في $languages بدل طباعتها، وتهرّب الموضع الوحيد الذي تطبع فيه بيانات الطلب.
قراءة عدد من نص الاستعلام
كل قيمة في $_GET نص. لرقم صفحة، تحقق وحوّل في خطوة واحدة بـ filter_var() وارجع إلى قيمة افتراضية حين تكون القيمة مفقودة، أو ليست عددًا، أو خارج النطاق. انتقل بين الصفحات، ثم جرّب رابطي Page 999 وPage abc.
تعيد filter_var() العدد الصحيح 3 لـ "3" وقيمة الخيار default لأي نص آخر، فتكون $page دائمًا عددًا صحيحًا قابلًا للاستخدام. وتسرد صفحة filter_var أدوات التحقق الأخرى.
قراءة بيانات النموذج بـ $_POST
يرسل النموذج ذو method="post" حقوله في جسم الطلب، وتضعها PHP في $_POST تحت name كل حقل. وتخبرك $_SERVER['REQUEST_METHOD'] إن كان الطلب الحالي الزيارة الأولى (GET) أم إرسالًا (POST). املأ النموذج واضغط Send لترى الحالتين.
الحقل النصي الفارغ يُرسل مع ذلك، على شكل ""، لذا بعد الإرسال تكون $_POST['title'] موجودة حتى لو لم يكتب الزائر شيئًا. وعلى الخادم تكون REQUEST_METHOD مضبوطة دائمًا؛ ولا تفعل ?? 'GET' إلا إبقاء السكربت هادئًا حين تشغّل الملف بـ php من سطر الأوامر. والنمط الكامل للتحقق من نموذج وإعادة عرضه موجود في صفحة النماذج.
نموذج بحث بـ method="get"
استخدم GET لنموذج يجب أن تكون نتيجته رابطًا قابلًا للمشاركة، مثل مربع بحث. يحوّل المتصفح الحقول إلى نص استعلام (?q=sort&level=beginner) ويقرؤها السكربت من $_GET، تمامًا مثل الرابط. ابحث عن array أو string.
بناء الروابط بـ http_build_query
كتابة "?q=$q&page=2" يدويًا تنكسر حالما تحتوي $q مسافة أو & أو #. ترمّز http_build_query() كل قيمة نيابة عنك، وتمر النتيجة عبر htmlspecialchars() حين تقع في href، لأن & يجب أن تكون & داخل HTML.
parse_str() مع وسيطين هي طريقة PHP في بناء $_GET من نص استعلام، لذا فهي مفيدة للاختبار. مرّر دائمًا الوسيط الثاني؛ فالصيغة القديمة ذات الوسيط الواحد التي كانت تنشئ متغيرات حُذفت في PHP 8.
$_REQUEST ولماذا تتجنبها
$_REQUEST هي $_GET و$_POST مدموجتين في مصفوفة واحدة. تضبط ملفات php.ini التي تأتي مع PHP القيمة request_order = "GP"، فحين تحتوي الاثنتان المفتاح نفسه، يفوز POST؛ ودون ذلك الإعداد، تُدمج ملفات تعريف الارتباط أيضًا:
<?php
// POST /save.php?id=1 with a form field id=2
echo $_GET['id']; // "1"
echo $_POST['id']; // "2"
echo $_REQUEST['id']; // "2"
تبدو مريحة، لكنها تخفي مصدر القيمة. المعالج الذي يحذف سجلًا بناءً على $_REQUEST['id'] يمكن تشغيله برابط عادي، وهذا بالضبط ما وُجدت الإجراءات المقصورة على POST لمنعه. اقرأ $_GET أو $_POST بالاسم بدلًا من ذلك.
GET مقابل POST: أيهما تستخدم
| GET | POST | |
|---|---|---|
| أين تنتقل البيانات | في الرابط: ?q=php&page=2 | في جسم الطلب |
| اقرأها بـ | $_GET | $_POST |
| المفضلة والمشاركة وزر الرجوع | نعم | لا (يسأل المتصفح عن إعادة الإرسال) |
| الطول | محدود بالرابط (بضعة آلاف من المحارف آمنة) | محدود بـ post_max_size (8M افتراضيًا) |
| رفع الملفات | لا | نعم، مع enctype="multipart/form-data" (اقرأ $_FILES) |
| استخدمه لـ | البحث والتصفية والترتيب والتقسيم إلى صفحات | تسجيل الدخول والتسجيل والحفظ والحذف والمدفوعات |
القاعدة المهمة: طلب GET يجب ألا يغيّر أي شيء. تجلب المتصفحات الروابط مسبقًا، وتتبعها برامج الزحف، ويشاركها الناس، لذا سيتبع رابطَ ?delete=5 في النهاية شيءٌ لم يكن المقصود منه الحذف. ولا تُشفَّر أي من الطريقتين وحدها: يحمي HTTPS الاثنتين، ولا يفعل POST إلا إبقاء البيانات خارج الرابط وسجل المتصفح وسجلات الخادم.
الأسئلة الشائعة
كيف أحصل على معامل من الرابط في PHP؟
اقرأه من $_GET مع قيمة افتراضية: لـ page.php?id=42، تعطي $id = $_GET['id'] ?? null; النص "42". كل قيمة نص (أو مصفوفة لـ id[]=)، لذا حوّلها وتحقق منها، مثلًا بـ filter_var($id, FILTER_VALIDATE_INT).
ما الفرق بين $_GET و$_POST؟
تأتي $_GET من نص الاستعلام في الرابط، فهي مرئية وقابلة للحفظ في المفضلة ومحدودة الطول؛ استخدمها للبحث والتصفية والصفحات. وتأتي $_POST من جسم طلب نموذج أُرسل بـ method="post"؛ استخدمها لكل ما يغيّر البيانات، مثل الحفظ أو الشراء أو تسجيل الدخول.
كيف أتحقق من وجود معامل GET في PHP؟
استخدم isset($_GET['q'])، التي تكون خاطئة حين يكون المفتاح مفقودًا أو null. ولمعاملة القيمة الفارغة (?q=) أيضًا على أنها مفقودة، قارن القيمة بعد تشذيبها: trim($_GET['q'] ?? '') !== ''.
هل أستخدم $_REQUEST في PHP؟
غالبًا لا. تدمج $_REQUEST المصفوفتين $_GET و$_POST (وملفات تعريف الارتباط، حسب request_order)، فلا تستطيع معرفة مصدر القيمة، ويمكن لرابط أن يقدّم قيمة توقعتها من نموذج. اقرأ $_GET أو $_POST صراحة.
كيف أعرف إن كان الطلب GET أم POST في PHP؟
قارن $_SERVER['REQUEST_METHOD']: if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }. وهذا أوثق من isset($_POST['submit'])، التي تفشل حين لا يكون للزر name أو حين يُرسل النموذج بـ JavaScript أو بسكربت آخر دون ذلك الحقل.