1
.
איזה
קידוד
/
פענוח
אני
צריך
בזמן
שאני
מעביר
ערך
באמצעות
טופס
?
ובאמצעות
כתובת
(
URL
)
?
ישנם
כמה
שלבים
בהם
הקידוד
חשוב
.
בהנחה
שנתונה
מחרוזת
$data
,
שמכילה
את
המחרוזת
שברצונך
להעביר
הלאה
בצורה
לא
מקודדת
(
ללא
קודי
HTML
)
,
אלה
השלבים
הנחוצים
:
-
תרגום
HTML
.
בכדי
לציין
מחרוזת
כלשהי
,
חובה
עליך
לכתוב
אותה
בין
מרכאות
כפולות
,
ולהעביר
את
הערך
בפונקציה
htmlspecialchars
.
-
כתובת
אינטרנט
(
URL)
:
כתובת
אינטרנט
מורכבת
מכמה
חלקים
.
אם
ברצונך
שהמידע
יתורגם
כפריט
(item
)
אחד
,
חובה
עליך
לקודד
אותו
בעזרת
הפונקציה
urlencode(
)
.
דוגמה
51-1
.
פריט
מוסתר
(
hidden
)
בטופס
HTML
|
הערה
:
תהיה
טעות
לעשות
urlencode(
)
ל
-
$data
,
משום
שזאת
אחריות
הדפדפן
לעשות
urlencode(
)
למידע
.
כל
הדפדפנים
הפופולרים
עושים
זאת
נכון
.
דבר
זה
קורה
בלי
קשר
לצורת
השליחה
(כלומר
,
GET
או
POST
)
.
למרות
זאת
,
רק
באופן
שליחה
של
GET
תוכל
להבחין
בזה
,
משום
שאופן
שליחה
של
POST
בדרך
כלל
מוסתר
.
דוגמה
51-2
.
מידע
שניתן
לעריכה
של
המשתמש
|
הערה
:
המידע
שיראה
בדפדפן
יהיה
כמתוכנן
,
זאת
משום
שהדפדפן
מפרש
את
התגים
המיוחדים
של
HTML
לסימנים
הנכונים
.
בזמן
שליחה
,
או
דרך
GET
או
דרך
POST
,
המידע
יומר
לצורת
urlencoded
אוטומטית
לפי
הדפדפן
בכדי
להשלח
,
וגם
אוטומטית
יעבור
urldecoded
על-ידי
PHP
.
כך
שבסופו
של
דבר
,
אין
לך
צורך
לבצע
אף
urldecoded
או
urldecoding
בעצמך
,
הכל
מתנהל
בצורה
אוטומטית
.
דוגמה
51-3
.
העברה
לצורת
URL
?php
echo
"
a
href=\"
"
.
htmlspecialchars("
/
nexpage.php?stage=23
data=
"
.
urlencode($data)
)
.
"\
"
\n"
;
?
|
|
הערה
:
בעצם
,
ניתן
בצורה
זו
לזייף
שליחת
HTML
בתצורת
GET
,
לכן
לפעמים
נחוץ
לעשות
urlencode(
)
למידע
מסויים
בצורה
ידנית
.
הערה
:
עליך
לבצע
htmlspecialchars(
)
לכל
ה-URL
,
משום
שה-URL
מתרחש
כערך
תכונה
של
HTML
(כלומר
,
HTML-attribute)
.
במקרה
כזה
,
בתחילה
הדפדפן
יהפוך
את
הערך
ללא
-
htmlspecialchars(
)
,
ורק
אז
יעביר
את
ה-URL
הלאה
.
PHP
מבינה
את
ה-URL
בצורה
הנכונה
שלו
,
משום
שלפני-כן
נעשה
לערך
urlencoded(
)
.
ניתן
לשים
לב
שסימן
בשדה
הכתובת
מוחלף
בסימן
amp
;
.
למרות
שרוב
הדפדפנים
יצליחו
להמשיך
אם
דבר
זה
לא
נעשה
,
זה
לא
תמיד
אפשרי
.
לכן
,
אפילו
אם
כתובתך
אינה
דינמית
,
חובה
עליך
לעשות
htmlspecialchars(
)
לכתובת
.
2
.
אני
מנסה
להשתמש
בתג
input
type="
image
"
,
אבל
לא
ניתן
לגשת
למשתני
$foo.x
ו-$foo.y
.
היכן
הם
?
בזמן
שליחת
טופס
,
יתכן
מצב
של
שימוש
בתמונה
(
image
)
במקום
בכפתור
השליחה
(submit
)
הסטנדרטי
עם
שימות
בתג
כמו
:
כאשר המשתמש לוחץ במקום כלשהו על התמונה, הטופס המבוקש ישלח
לשרת עם שני משתנים נוספים: foo.x ו-foo.y.
מאחר
ש-$foo.x
ו-$foo.y
אינם
משתנים
שמתקבלים
על-ידי
PHP
,
שמותיהם
מומרים
אוטומטית
ל-$foo_x
ו-$foo_y
.
מה
שבעצם
קורה
הוא
שהנקודות
במשתנים
מוחלפות
בקוים
תחתונים
.
3
.
איך
ניתן
ליצור
מערכים
בטפסי
HTML
?
כדי
להעביר
מערך
כתוצאה
של
טופס
-
form
-
כלשהו
לסקריפט
(
קוד
)
ה-PHP
שלך
,
עליך
לקרוא
לתגי
input
,
select
ו
-
textarea
באופן
הבא
:
עליך לזכור להוסיף את הסוגריים המרובעים אחרי שם המשתנה, זה
מה שגורם למשתנה להפוך למערך. ניתן בצורה זו לקבץ כמה אלמנטים
בייחד לכמה ערכים שונים במערך על-ידי הקצאת אותו שם מערך
לאלמנטים שונים בתוכו:
קוד זה יוצר שני מערכים, MyArray ו-MyOtherArray, אשר נשלחים
לסקריפט ה-PHP. כמו-כן, ניתן גם להקצות מפתחות מסויימים
לערכים במערך:
מערך AnotherArray יכיל כשישלח את המפתחות 0, 1, email
ו-phone.
הערה
:
קביעת
מפתחות
לערכי
המערכים
היא
רק
פונקציה
אפשרית
ב-HTML
,
והיא
אינה
חובה
.
אם
לא
יצויינו
המפתחות
,
המערך
יקבל
את
הערכים
מסודרים
בסדר
שבו
הם
הופיעו
בטופס
.
הדוגמה
הראשונה
שהבאנו
מעבירה
את
המפתחות
0
,
1
,
2
ו-3
.
See
also
פונקציות
למערכים
ו
משתנים
מקוד
PHP
חיצוני
.
4
.
איך
ניתן
לקבל
את
כל
התוצאות
מתיבת
בחירה
(
select
)
רבת
תוצאות
בטופס
HTML
?
תיבת
הבחירה
רבת
התוצאות
ב-HTML
מאפשרת
למשתמשים
לבחור
מספר
פריטים
מתוך
רשימה
.
לאחר-מכן
הפריטים
מועברים
לטיפול
של
הטופס
.
הבעיה
היא
שכל
הפריטים
מועברים
עם
אותו
שם
משתנה
.
לדוגמא
:
כל אפשרות שתבחר תגיע באותו שם משתנה, כמו:
כל אפשרות תמחק את האפשרות שהייתה במשתנה
$var
לפניה. הפיתרון הוא להשתמש במאפיין "מערך פריטים מתוך טופס"
שקיים ב-PHP. הקוד הבא מראה איך לעשות זאת:
קוד זה אומר ל-PHP להתייחס ל-
$var
כמערך ובו כל הצבה של ערך ל-var[] מוסיפה פריט למערך. הפריט
הראשון הופך ל-
$var[0]
, הבא אחריו ל-
$var[1]
, וכך הלאה. פונקציית
count()
ניתנת לשימוש כדי לוודא כמה אפשרויות נבחרו בטופס, ופונקציית
sort()
ניתנת לשימוש כדי לסדר את האפשרויות, אם קיים בזה צורך.
עליך
לשים
לב
שאם
קיים
באתר
שימוש
ב-JavaScript
,
הוספת
[
]
לשם
המשתנה
עלול
לגרום
לבעיות
בעת
ניסיון
לקרוא
למשתנה
לפי
שמו
.
מומלץ
לנסות
לקרוא
לו
לפי
מספר
הזיהוי
שלו
במערך
form
של
JavaScript
במקום
,
או
לתחום
את
שם
המשתנה
בין
מרכאות
(יחידות
/
לא
כפולות
)
ולהשתמש
בו
כאינדקס
של
פריטי
המערך
של
JavaScript
,
לדוגמא
: