Forum und email

PHP ו-HTML

PHP ו-HTML פועלות בצורה הדדית אחת עם השניה: PHP יוצרת HTML, ול-HTML יש מידע שישלח ל-PHP וישמש אותה.

  1. איזה קידוד/פענוח אני צריך בזמן שאני מעביר ערך באמצעות טופס? ובאמצעות כתובת (URL)?
  2. אני מנסה להשתמש בתג <input type="image">, אבל לא ניתן לגשת למשתני $foo.x ו-$foo.y. היכן הם?
  3. איך ניתן ליצור מערכים בטפסי HTML?
  4. איך ניתן לקבל את כל התוצאות מתיבת בחירה (select) רבת תוצאות בטופס HTML?
  5. איזה קידוד/פענוח אני צריך בזמן שאני מעביר ערך באמצעות טופס? ובאמצעות כתובת (URL)?

    ישנם כמה שלבים בהם הקידוד חשוב. בהנחה שנתונה מחרוזת $data, שמכילה את המחרוזת שברצונך להעביר הלאה בצורה לא מקודדת (ללא קודי HTML), אלה השלבים הנחוצים:

    • תרגום HTML. בכדי לציין מחרוזת כלשהי, חובה עליך לכתוב אותה בין מרכאות כפולות, ולהעביר את הערך בפונקציה htmlspecialchars.

    • כתובת אינטרנט (URL): כתובת אינטרנט מורכבת מכמה חלקים. אם ברצונך שהמידע יתורגם כפריט (item) אחד, חובה עליך לקודד אותו בעזרת הפונקציה urlencode().

    Example#1 פריט מוסתר (hidden) בטופס HTML

    <?php
        
    echo "<input type=hidden value=\"" htmlspecialchars($data) . "\">\n";
    ?>

    Note: תהיה טעות לעשות urlencode() ל-$data, משום שזאת אחריות הדפדפן לעשות urlencode() למידע. כל הדפדפנים הפופולרים עושים זאת נכון. דבר זה קורה בלי קשר לצורת השליחה (כלומר, GET או POST). למרות זאת, רק באופן שליחה של GET תוכל להבחין בזה, משום שאופן שליחה של POST בדרך כלל מוסתר.

    Example#2 מידע שניתן לעריכה של המשתמש

    <?php
        
    echo "<textarea name=mydata>\n";
        echo 
    htmlspecialchars($data)."\n";
        echo 
    "</textarea>";
    ?>

    Note: המידע שיראה בדפדפן יהיה כמתוכנן, זאת משום שהדפדפן מפרש את התגים המיוחדים של HTML לסימנים הנכונים. בזמן שליחה, או דרך GET או דרך POST, המידע יומר לצורת urlencoded אוטומטית לפי הדפדפן בכדי להשלח, וגם אוטומטית יעבור urldecoded על-ידי PHP. כך שבסופו של דבר, אין לך צורך לבצע אף urldecoded או urldecoding בעצמך, הכל מתנהל בצורה אוטומטית.

    Example#3 העברה לצורת URL

    <?php
        
    echo "<a href=\"" htmlspecialchars("/nexpage.php?stage=23&data=" .
            
    urlencode($data)) . "\">\n";
    ?>

    Note: בעצם, ניתן בצורה זו לזייף שליחת HTML בתצורת GET, לכן לפעמים נחוץ לעשות urlencode() למידע מסויים בצורה ידנית.

    Note: עליך לבצע htmlspecialchars() לכל ה-URL, משום שה-URL מתרחש כערך תכונה של HTML (כלומר, HTML-attribute). במקרה כזה, בתחילה הדפדפן יהפוך את הערך ללא-htmlspecialchars(), ורק אז יעביר את ה-URL הלאה. PHP מבינה את ה-URL בצורה הנכונה שלו, משום שלפני-כן נעשה לערך urlencoded(). ניתן לשים לב שסימן & בשדה הכתובת מוחלף בסימן &amp;. למרות שרוב הדפדפנים יצליחו להמשיך אם דבר זה לא נעשה, זה לא תמיד אפשרי. לכן, אפילו אם כתובתך אינה דינמית, חובה עליך לעשות htmlspecialchars() לכתובת.

    אני מנסה להשתמש בתג <input type="image">, אבל לא ניתן לגשת למשתני $foo.x ו-$foo.y. היכן הם?

    בזמן שליחת טופס, יתכן מצב של שימוש בתמונה (image) במקום בכפתור השליחה (submit) הסטנדרטי עם שימות בתג כמו:

    <input type="image" src="image.gif" name="foo">
    
    כאשר המשתמש לוחץ במקום כלשהו על התמונה, הטופס המבוקש ישלח לשרת עם שני משתנים נוספים: foo.x ו-foo.y.

    מאחר ש-$foo.x ו-$foo.y אינם משתנים שמתקבלים על-ידי PHP, שמותיהם מומרים אוטומטית ל-$foo_x ו-$foo_y. מה שבעצם קורה הוא שהנקודות במשתנים מוחלפות בקוים תחתונים.

    איך ניתן ליצור מערכים בטפסי HTML?

    כדי להעביר מערך כתוצאה של טופס - <form> - כלשהו לסקריפט (קוד) ה-PHP שלך, עליך לקרוא לתגי <input>, <select> ו- <textarea> באופן הבא:

    <input name="MyArray[]">
    <input name="MyArray[]">
    <input name="MyArray[]">
    <input name="MyArray[]">
    
    עליך לזכור להוסיף את הסוגריים המרובעים אחרי שם המשתנה, זה מה שגורם למשתנה להפוך למערך. ניתן בצורה זו לקבץ כמה אלמנטים בייחד לכמה ערכים שונים במערך על-ידי הקצאת אותו שם מערך לאלמנטים שונים בתוכו:
    <input name="MyArray[]">
    <input name="MyArray[]">
    <input name="MyOtherArray[]">
    <input name="MyOtherArray[]">
    
    קוד זה יוצר שני מערכים, MyArray ו-MyOtherArray, אשר נשלחים לסקריפט ה-PHP. כמו-כן, ניתן גם להקצות מפתחות מסויימים לערכים במערך:
    <input name="AnotherArray[]">
    <input name="AnotherArray[]">
    <input name="AnotherArray[email]">
    <input name="AnotherArray[phone]">
    
    מערך AnotherArray יכיל כשישלח את המפתחות 0, 1, email ו-phone.

    Note: קביעת מפתחות לערכי המערכים היא רק פונקציה אפשרית ב-HTML, והיא אינה חובה. אם לא יצויינו המפתחות, המערך יקבל את הערכים מסודרים בסדר שבו הם הופיעו בטופס. הדוגמה הראשונה שהבאנו מעבירה את המפתחות 0, 1, 2 ו-3.

    See also פונקציות למערכים ו משתנים מקוד PHP חיצוני.

    איך ניתן לקבל את כל התוצאות מתיבת בחירה (select) רבת תוצאות בטופס HTML?

    תיבת הבחירה רבת התוצאות ב-HTML מאפשרת למשתמשים לבחור מספר פריטים מתוך רשימה. לאחר-מכן הפריטים מועברים לטיפול של הטופס. הבעיה היא שכל הפריטים מועברים עם אותו שם משתנה. לדוגמא:

    <select name="var" multiple>
    
    כל אפשרות שתבחר תגיע באותו שם משתנה, כמו:
    var=option1
    var=option2
    var=option3
          
    כל אפשרות תמחק את האפשרות שהייתה במשתנה $var לפניה. הפיתרון הוא להשתמש במאפיין "מערך פריטים מתוך טופס" שקיים ב-PHP. הקוד הבא מראה איך לעשות זאת:
    <select name="var[]" multiple>
    
    קוד זה אומר ל-PHP להתייחס ל-$var כמערך ובו כל הצבה של ערך ל-var[] מוסיפה פריט למערך. הפריט הראשון הופך ל-$var[0], הבא אחריו ל-$var[1], וכך הלאה. פונקציית count() ניתנת לשימוש כדי לוודא כמה אפשרויות נבחרו בטופס, ופונקציית sort() ניתנת לשימוש כדי לסדר את האפשרויות, אם קיים בזה צורך.

    עליך לשים לב שאם קיים באתר שימוש ב-JavaScript, הוספת [] לשם המשתנה עלול לגרום לבעיות בעת ניסיון לקרוא למשתנה לפי שמו. מומלץ לנסות לקרוא לו לפי מספר הזיהוי שלו במערך form של JavaScript במקום, או לתחום את שם המשתנה בין מרכאות (יחידות / לא כפולות) ולהשתמש בו כאינדקס של פריטי המערך של JavaScript, לדוגמא:

    variable = documents.forms[0].elements['var[]'];