פרק 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וממשיך ישירות לבנייה והדפסה של טבלת התוצאות, שהיא בעצמה תעורר את המשתמש לבחור טבלה לצפייה. GUFI
בואו נצעד עם
|