מדריך PHP: חיבור אל SQL באמצעות PDO
במאמר הזה אנו נלמד על עבודה באמצעות הרחבת PDO אל מסד נתונים מסוג MS SQL. שפת PHP אינה שפה המוגבלת רק למסד נתונים אחד והיא יכולה לעבוד עם כל מסד נתונים שהוא באמצעות הרחבת PDO.
חלקו הראשון של המאמר יעסוק ביצירת MS SQL על גבי ה-WebMatrix והתקנה של רכיב המאפשר תקשורת בין PHP ל-SQL. ראשית ניצור את ה-MS SQL, נלחץ על New Database:
אחרי שבחרנו את שם מסד הנתונים (תמיד אפשר לשנות אחר כך באמצעות לחיצה על השם ואז על F2) אנו יכולים לבחור ב-New Table על מנת ליצור טבלה חדשה במסד הנתונים:
הטבלה נוצרת כבר עם שדה אחד, יש לקבוע לו את השם וניתן ליצור עוד כמה שדות באמצעות New Coloumn:
שימו לב שיש לנו שני מצבים של טבלה – Definition ו-Data (ניתן לעבור בין שני המצבים באמצעות לחיצה על האייקון הגדול). מצב אחד משמש להגדרת הטבלה, שם ניתן להגדיר את סוגי השדות, למחוק שדה או להוסיף שדה וכן לקבוע אינדקס ו-Relations. מצב ה-Data מאפשר לנו להכניס ולשנות נתונים:
הנה טבלה קטנה בשם test שיצרתי עם שתי שדות וכמה נתונים ארביטריים שהכנסתי.
אחרי שיצרתי את זה, אני אדאג להתקין את שרת ה-SQL Server Express במחשב שלי. בדיוק כמו שמתקינים שרת MySQL. נלחץ על לחצן ה-install:
ואחרי כן יתחיל תהליך ההתקנה, נתבקש בשלב כלשהו להכניס את שם המשתמש והסיסמה לאדמין. שם המשתמש (sa) של האדמין לא נתון לבחירתנו.
אחרי כן כל מה שנותר לעשות הוא לחכות במתח רב לסיום ההתקנה.
אחרי ההתקנה של SQL Server Express, עלינו לבצע התקנה של רכיב הקישוריות בין PHP ל-MS SQL SERVER. פתחו את ה-Web Platform Installer שלכם (אם התקנתם את וובמטריקס, הוא קיים, אל דאגה) וחפשו PDO:
לחיצה על ADD (אפשר להתקין את שתי הגרסאות) תתקין אצלכם בלי הרבה בעיות את רכיב הקישוריות.
עכשיו כל מה שנותר לנו לעשות זה לבצע מיגרציה של מסד הנתונים שכתבנו ל-MS SQL SERVER Express. נבחר את מסד הנתונים (במקרה של הדוגמא שלנו dbtest) ונלחץ על אייקון migrate:
זה יקח מעט זמן, אבל עכשיו יש לנו מסד נתונים MS SQL שעובד. הציור ליד מסד הנתונים משתנה לציור של חיבור:
כאן יש לי מסד נתונים מסוג testdb עם טבלה ששמה בישראל הוא test. עכשיו אפשר להפעיל את PDO כדי להתחבר אליו.
הפעלת PDO
את PDO קל להפעיל, במיוחד אם אתם מכירים ועבדתם מעט עם MySQLi. בואו וניצור חיבור ושאילתה לדוגמא. החיבור הוא פשוט:
$dbname = "testdb"; $serverName = ".\sqlexpress"; $username = "sa"; $pw = "123456"; $dbh = new PDO ("sqlsrv:server=$serverName;Database=$dbname","$username","$pw");
זה ממש ממש פשוט, משתנה dbh הוא בעצם הרפרנס לחיבור שלי, אחרי שיצרתי את החיבור הרפרנס מאוכלס ואני יכול לעשות איתו כל מה שמתחשק לי.
אני נוהג להכניס את החיבור לתוך try catch, שזה כמו משפט תנאי, רק שבמקרה של שגיאה אני יכול לקבל את פרטי השגיאה ולפתור אותה.
<?php try { $dbname = "testdb"; $serverName = ".\sqlexpress"; $username = "sa"; $pw = "123456"; $dbh = new PDO ("sqlsrv:server=$serverName;Database=$dbname","$username","$pw"); } catch (PDOException $e) { print "Failed to get DB handle: " . $e->getMessage() . "\n"; exit; }
צריך להזהר עם ה-try catch הזה בסביבת production כיוון שהוא יכול לחשוף פרטים על מסד הנתונים ודרך החיבור לעיניים שמוטב להן לא לראות את הפרטים האלו.
בואו ונבצע שאילתה פשוטה לדוגמא, שימו לב ש-PDO עובדת באופן מונחה עצמים, כך שאם לא עברתם בקפידה על הפרקים העוסקים בתכנות מונחה עצמים, יכול להיות שהקוד לא יהיה מובן.
<?php try { $dbname = "testdb"; $serverName = ".\sqlexpress"; $username = "sa"; $pw = "123456"; $dbh = new PDO ("sqlsrv:server=$serverName;Database=$dbname","$username","$pw"); } catch (PDOException $e) { print "Failed to get DB handle: " . $e->getMessage() . "\n"; exit; } $getInfo = $dbh->query('SELECT * from test'); print_r($getInfo->fetch(PDO::FETCH_ASSOC));
בואו ונבחן את מה שהולך פה, קודם כל אני משתמש במתודת query של ה-instance של PDO ומקבל אובייקט מסוים, אני משתמש במתודת fetch על מנת לקבל את התוצאה – בדיוק כמו בכל מסד נתונים אחר, התוצאה מתקבלת שורה אחר שורה. במקרה הזה אני מדפיס רק שורה אחת ולכן אקבל את התוצאה הבאה:
אם אני רוצה את כל התוצאות, אני צריך להשתמש בביטוי while כדי לעבור על כל השורות ולהדפיס אותן:
<?php try { $dbname = "testdb"; $serverName = ".\sqlexpress"; $username = "sa"; $pw = "123456"; $dbh = new PDO ("sqlsrv:server=$serverName;Database=$dbname","$username","$pw"); } catch (PDOException $e) { print "Failed to get DB handle: " . $e->getMessage() . "\n"; exit; } $getInfo = $dbh->query('SELECT * from test'); while($row = $getInfo->fetch(PDO::FETCH_ASSOC)) { print_r($row); }
ואז התוצאות יהיו כאלו:
אני יכול גם להדפיס את כל התוצאות מייד לתוך מערך גם בלי while באמצעות המתודה השימושית: fetchAll:
<?php try { $dbname = "testdb"; $serverName = ".\sqlexpress"; $username = "sa"; $pw = "123456"; $dbh = new PDO ("sqlsrv:server=$serverName;Database=$dbname","$username","$pw"); } catch (PDOException $e) { print "Failed to get DB handle: " . $e->getMessage() . "\n"; exit; } $getInfo = $dbh->query('SELECT * from test'); $result = $getInfo->fetchAll(); print_r($result);
יש עוד לא מעט מתודות שימושיות שצריך מדריך שלם רק לעבור עליהן. PDO נחשבת להרחבה גמישה הרבה יותר מהרחבת MySQLi ובטח ובטח מהרחבת MySQL. מומלץ מאד להשתמש בה, בלי קשר לסוג מסד הנתונים בו אתם משתמשים.
תגובות בפייסבוק