פרק 6: להשתעשע עם בסיסי נתונים מקוונים:אקססאיך לבצע שאילתהיתכן והיסודות של החלק הקודם, "שאילתה פשוטה", יהיו כל מה שתצטרכו לדעת כדי ליצר שאילתות SQL ולקבל את התוצאות עליהן. בגלל ש SQL היא שפת תכנות העומדת בפני עצמה, הטכניקה מסתכמת בשימוש בשפת תכנות אחת (Perl) כדי לשלוח את הקוד של שפה אחרת (SQL) תוך תרגום, ולחזור ל Perl כדי לקבל ולטפל בתוצאות. לכן, אפילו שאילתת SQL מסובכת ניתנת לשליחה וטיפול באמצעות קוד Perl פשוט, בגלל שרוב המאמץ יעשה בתוך מנוע בסיס הנתונים. בסקריפט שאילתת הדוגמה שלנו השתמשנו בטכניקה פשוטה כדי לאחזר את המידע המוחזר: הכנס כל שורה לתוך מחרוזת. עבור יישומים רבים זה יעבוד ממש טוב. אבל ישנם יכולות אלטרנטיביות של DBI שעשויות לעזור לכם בקבלת תוצאות מבסיס נתונים: $sth->{NUM_OF_FIELDS}; תכונה זו של (DBI statement handle) יכולה לעזור לכם לדעת כמה שדות מוחזרים עבור כל שורה. כמובן, יתכן ואתם כבר יודעים זאת, אם בניתם את פקודת ה SQL בעצמם (כמו שעשיתם בדוגמה הקודמת), אבל אם הסקריפט שלכם בונה את הSQL מתוך התוכנה (למשל מקלט שמגיע מהמשתמש), מידע זה יתברר כשימושי!. אם כבר מדברים על לדעת מראש, אתם אולי תוהים איך לדעת את מספר השורות שמוחזרות עבור שאילתה-לפני שאחזרתם את המידע עבור כל אחת. לעיתים ניתן לבצע זאת ולעיתים לא, תלוי באיזה תוכנת בסיס נתונים אתם משתמשים. לפי בדיקה שעשינו, אקסס לא החזירה מידע זה עבור בסיס הנתונים שלנו. $sth->rows; שיטה זו עשויה להחזיר 1- אם בסיס הנתונים שלכם לא מדווח על מידע כזה, שווה ניסיון!. דרך קלה יותר לעיבוד שדות נכנסים, היא להכניס כל שורה לתוך טבלת האש (hash reference) במקום לתוך מחרוזת. בעזרת האש תוכלו לגשת לכל שדה ע"פ שמו. היזכרו בדוגמה מהפרק שאילתה פשוטה, בה רצינו לקבל שורה המכילה את השדות ClientName ו ClientEmail: $row=$sth->fetchrow_hashref; כעת, נוכל לגשת לכל שדה מוחזר ע"פ שמו: while ($row=$sth->fetchrow_hashref) {print "Client's Name: $row->{ClientName}\t E-mail address: $row->{ClientEmail}\n"} האש היא דרך נוחה לעיצוב שדות נכנסים לפלט מעוצב כדוגמת מסמך HTML. לפעמים אולי תרצו לרוקן את כל המידע המוחזר, לדוגמא למטרות בדיקה. תוכלו לכתוב שגרה פשוטה שתעשה זאת, או: $sth->dump_results; שפשוט מאחזרת את כל השורות המוחזרות ומוציאה את הפלט בפורמט פשוט. שאילתה
פשוטה
|