logo


פרק 2: קישור Perl לעמודי הרשת

בדיקת טפסים (Form Validation)

נניח שיש לכם עמוד רשת אשר אוסף את פרטי המשתמשים המבצעים הרשמה, ושומר פרטים אלו (כגון מספר טלפון, וכתובת דואר אלקטרוני) בבסיס נתונים (Data base) פשוט. כמובן שאנו מניחים שהמשתמש בחר לתת מידע זה במודעות מלאה לשימוש שיעשה בו. למעשה נלמד על קידוד טופס בדוגמא הבאה - אך תחילה, הבא נלמד איך לבדוק את הקלט (וכי איזה שימוש יש לפרטי משתמש אם הם לא נכונים).

וידוא של מספר טלפון קל יותר משל כתובת דואר אלקטרוני, ולכן נתחיל בו. נניח שהקלט הוא מספר טלפון אמריקאי טיפוסי. המבנה של מספר טלפון כזה הוא אזור חיוג (3 ספרות), ולאחר מכן 7 ספרות נוספות. רווחים ומקפים הם אופציונלים ולכן אמורים להתקבל על ידי התוכנית שלנו.

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

Telephone # (including area code):
<input type="text" width="10" name="userphone"><Br>

בתוכנית ה Perl שלנו, נשתמש באובייקט ה CGI על מנת לאחזר את ערך הפרמטר "userphone":

$userphone=$cgiobject->param("userphone");

ואנו יכולים להשתמש בתבנית מותנת על מנת לקבל ערך אמת או שקר במשתנה הוידוא.

$fieldValid=$userphone=~/^\D*\d{3}?\D*\d{3}?\D*\d{4}?\D*$/;

המשתנה השמאלי ביותר באופרטור ההשמה הוא משתנה הוידוא, fieldValid$. משתנה זה יקבל בסוף הפעולה ערך אמת או שקר, בהתאם לתוצאת הפעולה שמצד ימין. הפעולה מצד ימין היא תבנית התאמת המחרוזות המוכרת לכם זה מכבר. בתבנית זו הטלפון של המשתמש (userphone$) מושווה לביטוי רגולרי מפחיד. המשמעות מאחורי ביטוי זה היא: "החל מתחילת המידע יש אפס או יותר תווים לא מספריים (D\ ), אשר לאחריהם בדיוק 3 ספרות (d\), אשר אחריהן אפס או יותר תווים לא מספריים, אשר לאחריהן בדיוק 3 מספרים, אחריהן אפס או יותר תווים לא מספריים, אחריהן 4 מספרים, אחריהן אפס או יותר תווים לא מספריים, ואחריהם סוף המחרוזת."

ביטוי רגולרי זה יקבל למשל את "555-2222 (555)" או את "555-555-2222" או את "5555552222" וכן הלאה, אבל ידחה מספרי טלפונים המכילים מעט או יותר מדי ספרות. אם הוידוא עבר בהצלחה נרצה לשנות את הפורמט של המספר כדי שכל המספרים יראו באותה צורה בבסיס הנתונים שלנו. אנו יכולים להפשיט את המחרוזת מכל התווים שאינם ספרות מהקלט בעזרת:

if ($fieldValid)
 { $userphone=~s/\D//g }

עד כאן ראינו חלקים מתוך וידוא הטופס. הבא נבחן כעת את התמונה הכוללת. אנו משתמשים בוידוא כהקדמה לשמירת הנתונים בבסיס נתונים. ולכן, נתבונן עתה בקוד וידוא אמיתי, register.cgi, ונתחיל בוידוא עצמו.

פתיחה: register.cgi

#!/usr/bin/perl

use CGI;


#create an instance of the CGI object 
$cgiobject = new CGI;


#grab the values submitted by the user
$userphone=$cgiobject->param("userphone");

#output HTML header to web browser
print $cgiobject->header;

#test form validation, output error if necessary 
#otherwise proceed to registration log
if ( &validateForm )
 { &registerForm }
else
 { &output_fail }

# subroutine which validates form fields and 
#returns a true or false result
sub validateForm
 { $failedFields="";
   $formValid=1; 
   $fieldValid=$userphone=~/^\D*\d{3}?\D*\d{3}?\D*\d{4}?\D*$/;
   if ($fieldValid)
    { $userphone=~s/\D//g }
   else
    { $failedFields.="Telephone Number,";
      $formValid=0 }   
   
   return $formValid
 }

#subroutine which outputs failure message 
#if form does not validate
sub output_fail
 { chop($failedFields); 
    $resultPage="<html><head>".
		"<title>Uh-Oh: Registration Problem</title>".
		"</head><body bgcolor=\"white\">".
		"<h2>Sadly, there seems to be a problem with your ".
		"form submission. Specifically, the following ".
		"mandatory fields were filled in improperly:</h2>".
		"<Br><h3>$failedFields</h3>".
		"<Br>Please go back and try again.".
		"</body></html>";
   print $resultPage;
 }

בהתבוננות בגרסה הראשונה של register.cgi אנו מכסים שטח נרחב של Perl. שימו לב לשגרות (subroutines) - השתמשנו בהן על מנת "לארוז יחדיו" קטע קוד. שגרות מחזירות בדרך כלל תוצאה מסוג אמת או שקר, תכונה המאפשרת לנו לקרוא להם מתוך הוראת תנאי (conditional statement) - בדוגמא שלנו אנו קוראים לשגרה validateForm& מתוך תנאי ה if (סימן ה & הקודם לשגרה היינו אופציונלי ברוב המקרים אך עדיף להשתמש בו). הוראת if זו משמשת כבקר הזרימה המרכזי של התוכנית; אם הטופס תקין אנו ממשיכים לשגרת הרישום, אשר בנקודה זו עדיין לא נכתבה; אם הטופס אינו תקין אנו פולטים הודעת שגיאה לדפדפן של המשתמש המפרטת באיזה שדה/ות ארעה השגיאה.

הבא נחזור למשימה שאנו מטפלים מלכתחילה. סביר להניח שאנו רוצים לוודא שדות נוספים פרט למספר הטלפון של המשתמש. אילו שדות? אתם בטח קופצים עכשיו וצועקים...שדה הדואר האלקטרוני!!! אנו מצטערים לאכזב אתכם, וידוא כתובות דואר אלקטרוני היינו מסובך בצורה יוצאת דופן, בגלל המבנה הגמיש של הכתובות. למעשה וידוא זה מסובך עד כדי כך שלא נכנס אליו במהלך מאמר זה, אולם במקורות הנוספים, יהיו קישורים למאמרים העוסקים בנושא זה.

לפיכך, נניח לשם הפשטות שאנו מעונינים להוסיף וידוא לשם המשתמש ולמיקוד שלו. שדה השם יכול להכיל כל תו מהאלף-בית, ואילו המיקוד יכיל מספר בן חמש ספרות, או בשיטת המיקוד החדשה 5 ועוד 4 ספרות. שינוי שגרת ה validateForm& בכדי שיתאים למטרתנו יהיה:

# subroutine which validates form fields and 
#returns a true or false result
sub validateForm
 { $failedFields="";
   $formValid=1; 
   #validate phone number   
   $fieldValid=$userphone=~/^\D*\d{3}?\D*\d{3}?\D*\d{4}?\D*$/;
   if ($fieldValid)
    { $userphone=~s/\D//g }
   else
    { $failedFields.="Telephone Number,";
      $formValid=0 }   
   
   #validate user name
   $fieldValid=$username=~/^[a-zA-Z]+/;
   unless ($fieldValid)
    { $failedFields.="User Name,";
      $formValid=0 }

   #validate ZIP code
   $fieldValid=$userZIP=~/^\d{5}(-\d{4})?$/;
   unless ($fieldValid)
    { $failedFields.="ZIP Code,";
      $formValid=0 }

   
   return $formValid
 }

שגרת ה validateForm& המשופרת, בנויה על התבנית של הגרסה הקודמת. בדיקת שם המשתמש מוודאת שיש לפחות תו אלפבתי אחד. בדיקת המיקוד מאפשרת מיקוד מהצורה 54321 או מהצורה 54321-1234. סקירה קצרה על הביטוי הרגולרי של המיקוד: "בתחילת הביטוי חייבות להיות 5 ספרות. קבוצת התווים במכילה מקף וארבע ספרות אחריו יכולה להופיע אפס או אחד פעמים, סוף מחרוזת".

בתחילת השגרה אנו משימים למשתנה הדגל formValid$ את הערך 1 - משמע אנו מתחילים מההנחה שהקלט תקף (ושהמשתמש הוא טוב לב). במהלך וידוא כל שדה, במידה והשדה לא נכון, המשתנה formValid$ מקבל 0, ובזאת דורך את הדגל בכדי להראות שיש שדה לא תקין בתוך הטופס. אנו משתמשים ב failedFields$ על מנת לאסוף את שמות השדות המוטעים על מנת לדווח עליהם לדפדפן מאוחר יותר.

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

פלט :Perl ותכנות מונחה עצמים ב CGI
תוכן עניינים
יומן רישום

אודות
תוכן עניינים
פרק 1: ה Perl שאתם צריכים לדעת
פרק 2: קישור Perl לעמודי הרשת
התאמת מחרוזות ב Perl ביטויים רגולריים  
CGI ותכנות מונחה עצמים ב Perl  
הערות בקשר להרצת CGI  
CGI ותכנות מונחה עצמים ב Perl: קלט  
CGI ותכנות מונחה עצמים ב Perl: פלט  
בדיקת טפסים  
יומן רישום  
מבט על משתנים סביבתיים  
מעקף: הפניה מחדש (redirection)  
סיכום  
פרק 3: שמירת מצב
פרק 4: HTML בחטף ותבניות (Templates) רשת
פרק 5: עיבוד וניתוח של עמודי רשת
פרק 6: להשתעשע עם בסיסי נתונים מקוונים:אקסס
פרק 7: המודל MySQL
פרק 8: להשתעשע בבסיסי נתונים - GUFE - החזית הכללית והשימושית
פרק 9: המילניום - ניהול זמן ותאריך
פרק 10: ניהול רשימות והאשים (Hashs)
פרק 11: הפניה להפניה
פרק 12: הכרות עם mod_perl