מדריך PHP

מדריך PHP: חיבור אל SQL באמצעות PDO

‏ • Internet Israel

במאמר הזה אנו נלמד על עבודה באמצעות הרחבת 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:

PDO in Web Platform Installer

לחיצה על ADD (אפשר להתקין את שתי הגרסאות) תתקין אצלכם בלי הרבה בעיות את רכיב הקישוריות.

עכשיו כל מה שנותר לנו לעשות זה לבצע מיגרציה של מסד הנתונים שכתבנו ל-MS SQL SERVER Express. נבחר את מסד הנתונים (במקרה של הדוגמא שלנו dbtest) ונלחץ על אייקון migrate:

migrate

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

webmatrix MS-SQL connection

כאן יש לי מסד נתונים מסוג 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 על מנת לקבל את התוצאה – בדיוק כמו בכל מסד נתונים אחר, התוצאה מתקבלת שורה אחר שורה. במקרה הזה אני מדפיס רק שורה אחת ולכן אקבל את התוצאה הבאה:

print of MS-SQL result

אם אני רוצה את כל התוצאות, אני צריך להשתמש בביטוי 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);
}

ואז התוצאות יהיו כאלו:

MS SQL result

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

תגיות: , , ,

רן בר-זיק

מתכנת PHP מנוסה ובעל ידע רב בפיתוח לאינטרנט על בסיס LAMP. מומחה במערכות דרופל, ג'ומלה ו-וורדפרס. שולט היטב בכל מה שקשור לפרונט אנד: JavaScript: jQuery ו-MooTools,ActionScript 2/3 וכמובן HTML 5 + CSS 3.אינטרנט ישראל: www.internet-israel.com

תגובות בפייסבוק