$_GET הוא מערך של ה-query string של כתובת ה-URL, ולכן article.php?id=42&lang=en נותן $_GET['id'] === '42' ו-$_GET['lang'] === 'en'. $_POST הוא מערך של השדות של טופס שנשלח עם method="post". קראו את שניהם עם ברירת מחדל, $_GET['id'] ?? null, כי המפתח חסר בכל פעם שהפרמטר חסר.
הריצו את הבלוק, ואז לחצו על הקישורים: כל לחיצה מריצה את הסקריפט שוב כש-$_GET מתמלא מה-query string של הקישור.
$_GET['lang'] הוא מה שכתובת ה-URL אומרת, לא רק שלושת הקישורים שהדפסתם. כל אחד יכול להקליד ?lang=<script> בשורת הכתובת, ולכן הבלוק מחפש את הערך ב-$languages במקום להדפיס אותו, ומבצע escape במקום היחיד שבו הוא כן מדפיס נתוני בקשה.
קריאת מספר מה-query string
כל ערך ב-$_GET הוא מחרוזת. למספר דף, אמתו והמירו בצעד אחד עם filter_var(), ועברו לברירת מחדל כשהערך חסר, אינו מספר או מחוץ לטווח. עברו בין הדפים, ואז נסו את הקישורים Page 999 ו-Page abc.
filter_var() מחזירה את המספר השלם 3 עבור "3" ואת אפשרות ה-default לכל מחרוזת אחרת, ולכן $page הוא תמיד int שאפשר להשתמש בו. עמוד filter_var מפרט את המאמתים האחרים.
קריאת נתוני טופס עם $_POST
טופס עם method="post" שולח את השדות שלו בגוף הבקשה, ו-PHP שמה אותם ב-$_POST תחת ה-name של כל שדה. $_SERVER['REQUEST_METHOD'] אומר לכם אם הבקשה הנוכחית היא הביקור הראשון (GET) או שליחה (POST). מלאו את הטופס ולחצו על Send כדי לראות את שניהם.
שדה טקסט ריק עדיין נשלח, בתור "", ולכן אחרי שליחה $_POST['title'] קיים גם אם המבקר לא הקליד כלום. בשרת REQUEST_METHOD תמיד מוגדר; ה-?? 'GET' רק שומר על הסקריפט שקט כשמריצים את הקובץ עם php בשורת הפקודה. הדפוס המלא לאימות טופס ולהצגה שלו מחדש נמצא בעמוד הטפסים.
טופס חיפוש עם method="get"
השתמשו ב-GET לטופס שהתוצאה שלו צריכה להיות כתובת URL שאפשר לשתף, כמו תיבת חיפוש. הדפדפן הופך את השדות ל-query string (?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 מ-query string, ולכן היא שימושית לבדיקות. תמיד העבירו את הארגומנט השני; הצורה הישנה עם ארגומנט אחד, שיצרה משתנים, הוסרה ב-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 | |
|---|---|---|
| איפה הנתונים עוברים | בכתובת ה-URL: ?q=php&page=2 | בגוף הבקשה |
| קוראים אותם עם | $_GET | $_POST |
| סימנייה, שיתוף, כפתור חזרה | כן | לא (הדפדפן מבקש לשלוח שוב) |
| אורך | מוגבל על ידי כתובת ה-URL (כמה אלפי תווים בטוח) | מוגבל על ידי post_max_size (8M כברירת מחדל) |
| העלאת קבצים | לא | כן, עם enctype="multipart/form-data" (קראו את $_FILES) |
| השתמשו בו ל | חיפוש, סינונים, מיון, חלוקה לדפים | התחברות, הרשמה, שמירה, מחיקה, תשלומים |
הכלל שחשוב: בקשת GET לא אמורה לשנות שום דבר. דפדפנים טוענים קישורים מראש, סורקים עוקבים אחריהם ואנשים משתפים אותם, ולכן קישור ?delete=5 ייפתח בסוף על ידי משהו שלא התכוון למחוק. אף אחת מהשיטות לא מוצפנת בפני עצמה: HTTPS מגן על שתיהן, ו-POST רק שומר את הנתונים מחוץ לכתובת ה-URL, להיסטוריית הדפדפן וללוגים של השרת.
שאלות נפוצות
איך מקבלים פרמטר מכתובת ה-URL ב-PHP?
קראו אותו מ-$_GET עם ברירת מחדל: עבור page.php?id=42, $id = $_GET['id'] ?? null; נותן את המחרוזת "42". כל ערך הוא מחרוזת (או מערך עבור id[]=), אז המירו ואמתו אותו, למשל עם filter_var($id, FILTER_VALIDATE_INT).
מה ההבדל בין $_GET ל-$_POST?
$_GET מגיע מה-query string של כתובת ה-URL, ולכן הוא גלוי, אפשר לשמור אותו כסימנייה, והאורך שלו מוגבל; השתמשו בו לחיפושים, לסינונים ולדפים. $_POST מגיע מגוף הבקשה של טופס שנשלח עם method="post"; השתמשו בו לכל דבר שמשנה נתונים, כמו שמירה, קנייה או התחברות.
איך בודקים אם פרמטר GET קיים ב-PHP?
השתמשו ב-isset($_GET['q']), שהוא false כשהמפתח חסר או null. כדי להתייחס גם לערך ריק (?q=) כחסר, השוו את הערך אחרי trim: 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 או סקריפט אחר בלי השדה הזה.