|
פרק 8: להשתעשע בבסיסי נתונים - GUFE - החזית הכללית והשימושיתמעבר על GUFE: חלק 2
#retrieve CGI parameters
my $returnFields=$cgiobj->param("return");
unless ($returnFields) { $returnFields="*" }
my $queryTable=$cgiobj->param("table");
my $querySort=$cgiobj->param("sort");
my $querySortType=$cgiobj->param("sortType");
אנו צריכים לאסוף את הפרמטרים השונים שנשלחו ל GUFE דרך CGI. בגלל שהמצאנו את הפרמטרים בעצמנו, אנו יודעים מה אנו צריכים לאסוף. בפסקה שראינו למעלה, אחזרנו עבור שאילתת ה SQL: סדרה של שמות השדות שיוחזרו משאילתת ה SQL, את שם הטבלה עליה נבצע את השאילתה, האם צריך למיין את הטבלה, ומהו סוג המיון-עולה או יורד. #parse through criteria parameters
my @allcriteria=();
my @allparams=$cgiobj->param();
foreach $param (@allparams) {
if (($param=~/criteria_condition_(.*)/)
&&
($cgiobj->param($param) ne "0")) {
my $criterion=$1." ".$cgiobj->param($param)." ".
$cgiobj->param("criteria_value_$1");
if ($cgiobj->param("criteria_value_$1")) {
#ignore blank criteria
push (@allcriteria,$criterion);
}
}
}
$queryCriteria=join
(" ".$cgiobj->param("criteria_logic")." ",@allcriteria);
אנו מעונינים לאסוף גם את פרמטרי המפתח המעצבים את שאילתת ה SQL עצמה, ומגדירים איזה מבט על הטבלה נקבל. לדוגמה, המשתמש אולי ישתמש בשדות טופס עם מפתח כדי לבקש טבלה שבה נוכל לראות את אותם הרשומות שבהם ה Total גדול מ 100. פרמטרים אלו הם קצת יותר מטעים, בגלל ששמות הפרמטרים נוצרים ע"י GUFE בהתבסס על תווית השדה המוכללת בטבלה מסוימת. כדי לעזור ליצור סטנדרטים לדברים, פרמטרי המפתח יקראו criteria_condition_fieldLabel ו criteria_value_fieldLabel. בקוד למעלה, אחזרנו מאובייקט ה CGI את כל הפרמטרים שמתאימים לשמות אלו והעברנו אותם לרשימה בשם allcriteria@. זה אומנם נראה מבולבל, אבל בסוף נרכיב מחרוזת יחידה ע"י שימוש בפקודת Perl בשם ()join, שאולי תראה כך: Total > 100 AND Paid = 1 אחרי שהכל נאמר ונעשה, יש לנו כעת מגוון של משתנים שמכילים פרמטרים שונים שהועברו ל GUFE. סידרנו את הכלים, ועכשיו הזמן לשחק. #mission control ... set the ball in motion
my $dbh=&openDB($DBD,$dbase,$dbuser,$dbpassword);
if ($queryTable) {
my $sqlstatement="select $returnFields from $queryTable";
if ($queryCriteria) {
$sqlstatement.=" where ($queryCriteria)" }
if ($querySort) {
$sqlstatement.=" order by $querySort $querySortType" }
my $sth=&sendSQL($sqlstatement,$dbh);
print &createPage
(&resultTable
($dbh,$sth,$queryTable,$returnFields));
}
else {
#no table has been selected to view
print &createPage(&resultTable($dbh));
}
הקישור לבסיס הנתונים נוצר, והעוגן (handle) מועבר לתוך dbh$. לאחר מכן, משפט ה if העיקרי מזהה האם בקשת העמוד מגדירה טבלה לצפייה, דרך פרמטר ה CGI בשם table. אם כן, אנו ממשיכים בעיבוד ע"י בניית פקודת SQL תוך שימוש בחלקים מפרמטרי ה CGI שאספנו קודם. פקודת ה SQL מועברת לאחר מכן ומורצת ע"י השגרה שלנו sendSQL& ועוגן הפקודה מועבר לתוך sth$. אנו נצטרך להשתמש בעוגן זה כדי לגשת לתוצאות של השאילתה. אנו מסיימים את משפט ה if בהוראה מורכבת, חלק אחד מריץ את השגרה createPage& תוך שימוש בתוצאות של השגרה reasultTable&. אנו שולחים מספר פרמטרים לתוך resultTable&, כולל עוגני בסיס הנתונים ופקודת ה SQL, שם הטבלה עליה נבצע שאילתה, ואילו שדות להחזיר. שגרה זו, שנראה בקרוב, ממש יוצרת את כל פלט ה HTML של GUFE, המעובר ל createPage& במקרה זה. createPage& לוקחת את ה HTML שנוצר ע"י resultTable& ודוחפת אותו לתבנית (templateHTML) . בסוף, התוצאות של פעולה זו נשלחות למסך ע"י פקודת ה ()print העוקבת. במקרה שהמשתמש לא ציין שום טבלה לביצוע שאילתה (ז"א קריאה ל gufe.cgi בלי שום פרמטרים נוספים), משפט ה else מדלג על בניית פקודת ה SQLוממשיך ישירות לבנייה והדפסה של טבלת התוצאות, שהיא בעצמה תעורר את המשתמש לבחור טבלה לצפייה.
|