מדריך PHP: טפסים
במאמר הקודם דיברנו על קלט מהמשתמש באמצעות ה-URL. בסופו של המאמר ציינו שזה גם די אידיוטי לצפות מהמשתמש שישנה את ה-URL בשבילנו, בדיוק בשביל זה יש טפסים.
טפסים, או Forms הם אלמנטים ב-HTML המשמשים את הגולש להכנסת מידע. אנחנו יכולים להשתמש בטפסים לשלוח פרמטרים באמצעות ה-URL, או יותר נכון בשיטת GET (מוכר לכם?) או בשיטת POST שעליה נרחיב את הדיבור מאוחר יותר.
אני מניח שכולכם יודעים לכתוב טפסים ב-HTML, אני אשתמש בדוגמאות שלי בטופס פשוט עם שדות מסוג input שהוא טקסטואלי.
משלוח טפסים בשיטת GET
בואו וניצור דף PHP חדש ב-WebMatrix ששמו בישראל יהיה form.php. לוחצים על New ואז על PHP file, בתחתית נשנה את שמו ל-form.php:
הדיפולט נותן לנו דף HTML שמוכן לפעולה, בואו ונכניס אליו קצת חיים עם טופס וכותרת:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>My form</title> </head> <body> <form method='get'> <label>name: </label> <input type='text' name='client_name' /> <button type='submit'>Submit</button> </form> </body> </html>
אם נריץ אותו, הוא אמור להראות כך:
מה שעשינו זה להכניס input עם name וכן כפתור של submit, הכל ארוז יפה יפה בתוך form, שימו לב לכמה דברים. דבר ראשון ל-method של ה-form (הלא הוא get). הדבר השני הוא לשם של 'name' (הלא הוא client_name).
מה שאני רוצה שנעשה הוא לנסות להפעיל את הטופס, תכתבו שם כלשהו ואז תלחצו על submit.
מה יקרה? הדף יתרפרש, אבל שום דבר לא יקרה (זה לא פלא, כי לא כתבנו שום שורת PHP), אבל שימו לב ל-URL שהדף יתרפרש אליו!
אלו מכם שהקפידו על קריאת המאמר הקודם, יכולים לחייך בהבנה כיון שהם יודעים שאפשר להוסיף קוד PHP לדף ה-HTML כדי שיעשה עם הפרמטר משהו. שימו לב לקוד הבא!
<?php $client_name = $_GET['client_name']; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>My form</title> </head> <body> <form method='get'> <label>name: </label> <input type='text' name='client_name' /> <button type='submit'>Submit</button> </form> <p> <?php $client_name ? print $client_name : print 'Please Enter Name'; ?> </p> </body> </html>
מה הוספתי כאן? בראשית הדף הוספתי קוד שלוקח את הפרמטר client_name (באמצעות GET_$ שלמדנו עליו במאמר הקודם) ומכניסה אותו למשתנה חביב בשם client_name. הדבר השני שהוספתי זו הפסקה הזו:
<?php $client_name ? print $client_name : print 'Please Enter Name'; ?>
זה משפט תנאי מקוצר (זוכרים שלמדנו עליו ואמרתי שהוא יהיה שימושי?) שבו, אם יש את המשתנה, אז הוא מדפיס אותו, ואם לא, הוא מבקש להכניס את השם.
נסו להריץ את הקוד ולשחק איתו בעצמכם!
אפשר כמובן להכניס כמה וכמה input ואז נקבל URL מרובה פרמטרים כמו שראינו במאמר הקודם, לטפל בהם כבר אמור להיות פשוט.
משלוח טפסים בשיטת POST
כפי שציינתי, יש שתי שיטות לשליחת פרמטרים – אחד הוא GET שעליו למדנו והוא שולח את הפרמטר באמצעות URL, והשני הוא POST ששולח את הפרמטר ללא URL, הטיפול בו דומה לגמרי לזה של ה-GET. שימו לב לדוגמא הזו:
<?php $clientName = $_POST['client_name']; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>My form</title> </head> <body> <form method='post'> <label>name: </label> <input type='text' name='client_name' /> <button type='submit'>Submit</button> </form> <p> <?php $clientName ? print $clientName : print 'Please Enter Name'; ?> </p> </body> </html>
מה השתנה בין הקוד הזה לקוד שמשתמש ב-GET? כמעט כלום – ראשית אני משתמש ב-$_POST ולא ב-$_GET. שנית, אני בחרתי ב-method=post באלמנט הטופס ה-HTML. זה הכל, אם אני אריץ את הקובץ, אני אכניס את השם ואקבל את התוצאה בלי שאראה דבר ב-URL.
יש כאלו שחושבים שבגלל זה מדובר במתודה מאובטחת יותר – היא לא. אבל כן נוהגים להשתמש ב-POST בנתונים כמו שם משתמש וסיסמה.
REQUEST
האמת היא שהרבה פעמים במקום להשתמש ב-$_GET או ב-$_POST אנו משתמשים ב-$_REQUEST – מערך אסוציאטיבי שמכיל גם את בקשות ה-$_GET וגם את בקשות ה-POST. כך יראה הקוד:
<?php $clientName = $_REQUEST['client_name']; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>My form</title> </head> <body> <form method='post'> <label>name: </label> <input type='text' name='client_name' /> <button type='submit'>Submit</button> </form> <p> <?php $clientName ? print $clientName : print 'Please Enter Name'; ?> </p> </body> </html>
אם תיקחו את הקוד ותשנו רק את ה-method בתוך אלמנט ה-form מ-post ל-get תראו שקוד ה-PHP עובד כרגיל, בלי שום קשר לסוג הנתון שנשלח אליו – POST או GET. הרבה מאד מתכנתים פשוט משתמשים ב-REQUEST כדי לקבל נתונים מטופס מסוים.
שליחת נתונים מטופס שנמצא בדף אחד לדף אחר
עד עכשיו כל הדוגמאות שלנו היו באותו דף, אבל בדרך כלל הטופס ממוקם בטופס אחד והקוד שמקבל את הנתונים נמצא בדף אחר. לצורך הדוגמא, בואו ניצור דף שבו יש טופס. שמו בישראל יהיה tofes.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Form</title> </head> <body> <form method='get' action='myform.php'> <label>name: </label> <input type='text' name='client_name' /> <button type='submit'>Submit</button> </form> </body> </html>
בדף הזה אין כלל קוד PHP והוא דף HTML סטנדרטי שמכיל רק טופס פשוט וסטנדרטי. שני דברים ראויים לציון בטופס הזה – הראשון הוא מתודת ה-form (שהיא get) והשניה היא תכונת ה-action. ב-action אנחנו מציינים לאן הטופס אמור להגיע. אנחנו יכולים לציין כל דף בכל תיקיה, במקרה הזה מה שכתוב שם הוא דף בשם myform.php, שם תתרחש קליטת הטופס
עכשיו כל מה שנותר ליצור זה את myform.php:
<?php $name = $_REQUEST['client_name']; $result = "Hello, $name! Welcome to our site!"; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>First page</title> </head> <body> <p> <?php print $result;?> </p> </body> </html>
Myform.php גם הוא דף פשוט, בראשיתו יש קוד PHP שבודק את ה-REQUEST הרלוונטי, יוצר מחרוזת טקסט ומדפיס אותה ב-HTML תקני.
אם נריץ את tofes.html ונשלח שם כלשהו, אנו נראה שמיד לאחר לחיצה על כפתור ה-submit אנו עוברים ל-myform.php עם הפרמטר שלנו, לא משנה אם הוא ב-POST או ב-GET.
פקדים נוספים
השתמשנו עד כה רק ב-input מסוג text, אבל ברור שאפשר להשתמש בכל פקד שהוא – כפתורי רדיו, text area או checkboxes. המטרה של כל פקד ופקד היא בסופו של דבר אחת – לשלוח את שם הפקד (תכונת name) והערך המוזן לפקד כמחרוזת טקסט באמצעות GET או POST ליעד שאנו קובעים באמצעות ה-action.
עד כאן בנוגע לטפסים עם PHP, במאמר הבא אנו נדון בעוגיות ו-SESSIONS ב-PHP.
תגובות בפייסבוק