פורסם בתאריך Saturday, June 26, 2010 3:17 PM על ידי גיא בורשטיין | ישנם 4 תגובות

MSSQL דרייבר PHPבפוסט הזה אדבר על איך להשתמש ב- MSSQL Server באפליקציית PHP, ע”י שימוש ב- SQL Server Driver for PHP. במהלך הפוסט אני אדגים אפליקציית PHP שקוראת נתונים וכותבת נתונים לתוך SQL Server Express שהוא מסד נתונים חינמי. בדוגמא אכסה את אופן ההתחברות למסד הנתונים, קריאה וכתיבה של נתונים וכן טיפול בשגיאות.

התקנת הדרייבר SQL Server Driver for PHP

אם עדיין לא התקנת את SQL Server Express, מסד הנתונים החינמי של מיקרוסופט על המחשב שלך, לחץ כאן כדי להתקין אותו.

הדרך הפשוטה להתקנת הדרייבר ל- MSSQL עבור PHP היא כמובן ע”י שימוש ב- Web Platform Installer (לחיצה על כפתור ההתקנה שבתחילת הפוסט יפתח את ההתקנה).

MSSQL דרייבר PHP

לאחר אישור ההתקנה, ה- Web Platform Installer יוריד ויתקין את הדרייבר, ויקנפג אותו לשימוש באפליקציות ה- PHP, ע”י הוספת ה- extension המתאים לתוך ה- php.ini.

extension=php_sqlsrv.dll

יצירת מסד נתונים לדוגמא

צור קובץ טקסט חדש בשם Customers.sql ושמור אותו בספרייה c:\temp. העתק לתוכו את קוד ה- SQL הבא שיוצר מסד נתונים חדש עבור הדוגמא שבהמשך. מסד הנתונים ישמור טבלת אחת ובה פרטי לקוחות הכוללים מזהה לקוח, כתובת אימייל, שם ותאריך רישום.

create database CustomersDB

go

 

use CustomersDB

go

 

create table Customers

(

    ID int not null primary key identity(1,1),

    Email nvarchar(50) not null unique,

    LastName nvarchar(50) not null,

    FirstName nvarchar(50) not null,

    RegDate datetime not null,

)

go

 

הרץ את הפקודה הבאה מתוך חלון Command Prompt כדי להריץ את סקריפט ה- SQL שכתבת וליצור את מסד הנתונים.

c:\temp> Osql -S .\SqlExpress -E  -n -i "Customers.Sql"

בניית דף PHP לדוגמא

הדף מתחיל עם הקוד הפשוט הבא, המכיל טופס בו המשתמש יזין את השם הפרטי, שם המשפחה וכתובת האימייל לצורך הרישום.

<html>

    <head>

        <Title>Example Web Form</Title>

    </head>

<body>

  <form method="post" action="?action=add" enctype="multipart/form-data" >

    Last name <input type="text" name="lastName" id="lastName"/></br>

    First name <input type="text" name="firstName" id="firstName"/></br>

    E-mail address <input type="text" name="emailAddress" id="emailAddress"/></br>

    <input type="submit" name="submit" value="Submit" />

  </form>

<?php

    /* כאן יכנס הקוד בהמשך המדריך. */

?>

</body>

</html>

 

התחברות ל- MS SQL Server מ- PHP

לפני שניגשים להכניס נתונים למסד הנתונים, עלינו להתחבר אליו, ונשתמש בפונקציה sqlsrv_connect כדי לעשות זאת. הפונקציה מקבלת כפרמטר את שם השרת להתחבר אליו (serverName$) ופרמטר אופציונאלי נוסף (connectionOptions$) לפרטי התחברות נוספים כגון שם מסד הנתונים, שם המשתמש והסיסמא להתחברות וכו’. ראו מידע נוסף על הפונקציה sqlsrv_connect.
בדוגמא שלנו, אכתוב את הקוד הבא כדי להתחבר למסד הנתונים.

 

  $serverName = ".\sqlexpress";

 

  $connectionOptions = array(

        "Database"=>"CustomersDB");

 

  $conn = sqlsrv_connect($serverName, $connectionOptions);

 

  if($conn === false)

  {

      die(print_r(sqlsrv_errors(), true));

  }

 

בקוד הנ”ל אני מתחבר לשרת ששמו “sqlexpress\.” – הנקודה היא סתם קיצור כדי לציין שהחיבור מתבצע לשרת המקומי. ניתן לכתוב גם “local)\sqlexpress)” או בעת פניה לשרת אחר – “Servername)\sqlexpress)”.

הכנסת נתונים (INSERT) ל- MS SQL Server מ- PHP

כדי להכניס רשומות חדשות למסד הנתונים, נקח את הפרמטרים שמועברים אלינו בטופס ע”י המשתמש ונפעיל פקודת INSERT למסד הנתונים ע”י שימוש בפונקציה sqlsrv_query.

  if(isset($_GET['action']))

  {

    if($_GET['action'] == 'add')

    {

      /*Insert data.*/

      $insertSql = "INSERT INTO Customers (LastName, FirstName, Email, RegDate)

                    VALUES (?,?,?,?)";

      $params = array(&$_POST['lastName'],

                      &$_POST['firstName'],

                      &$_POST['emailAddress'],

                      date("Y-m-d"));

 

      $stmt = sqlsrv_query($conn, $insertSql, $params);

      if($stmt === false)

      {

        /*Handle the case of a duplicte e-mail address.*/

        $errors = sqlsrv_errors();

        if($errors[0]['code'] == 2601)

        {

          echo "The e-mail address you entered has already been used.</br>";

        }

        /*Die if other errors occurred.*/

        else

        {

          die(print_r($errors, true));

        }

      }

      else

      {

        echo "Registration complete.</br>";

      }

  }

}

בדוגמא למעלה, מוגדר משתנה בשם insertSql$ שמכיל את פקודת ה- SQL שנרצה לבצע. כדאי לשים לב שהפקודה מכילה מקום לפרמטרים שיועברו אליה ע”י סימני שאלה. הפקודה הבאה יוצרת מערכת של הערכים שנרצה לשלב בפקודה בעת שליחתה למסד הנתונים – גם כאן 4 פרמטרים: 3 מהם מגיעים מתוך נתוני הטופס והרביעי הוא הזמן הנוכחי. לבסוף, נשלחת הפקודה למסד הנתונים לצורך הרצה.

שליפת נתונים (SELECT) מתוך MS SQL Server מ- PHP

כעת, נרצה להציג טבלה המציגה את כל הלקוחות הרשומים במסד הנתונים של האתר שלנו. שוב, נשתמש בפונקציה sqlsrv_query כדי לבצע את השאילתא.

$sql = "SELECT * FROM Customers ORDER BY LastName";

$stmt = sqlsrv_query($conn, $sql);

if($stmt === false)

{

  die(print_r(sqlsrv_errors(), true));

}

if(sqlsrv_has_rows($stmt))

{

  print("<table border='1px'>");

  print("<tr><td>Last Name</td>");

  print("<td>First Name</td>");

  print("<td>E-mail Address</td>");

  print("<td>Registration Date</td></tr>");

 

  while($row = sqlsrv_fetch_array($stmt))

  {

    $regDate = date_format($row['RegDate'], 'Y-m-d');

    print("<tr><td>".$row['LastName']."</td>");

    print("<td>".$row['FirstName']."</td>");

    print("<td>".$row['Email']."</td>");

    print("<td>".$regDate."</td></tr>");

  }

  print("</table>");

}

לאחר ביצוע השאילתא, אני משתמש בפופנקציה sqlsrv_has_rows כדי לבדוק האם השאילתא החזירה רשומות כלשהן (אם לא – לא ארצה להציג את טבלת הנתונים). במידה והשאילתא החזירה נתונים, אשתמש בפונקציה sqlsrv_fetch_array כדי לגשת לרשומות עצמן ולהציגן בטבלה.

טיפול בשגיאות

הפונקציה sqlsrv_errors מחזירה מידע על השגיאה האחרונה שארעה בעת ניסיון לגשת למסד הנתונים. ברוב המקרים, נשתמש בפונקציה die ונדפיס את הודעת השגיאה. במקרים בהם נרצה לתת הודעה יותר משמעותית למשתמש, למשל בעת ניסיון להכניס כתובת אימייל שכבר קיימת במאגר, נראה לזהות קוד שגיאה ספציפי (במקרה שלנו, לאחר הניסיון להכניס לקוח חדש, אני בודק האם הייתה שגיאה עם קוד 2601 שמציינת שנעשה ניסיון להכניס ערך לשדה שכבר קיים בטבלה. נשים לב כי בהגדרת הטבלה ציינו ששדה האימייל הוא ייחודי ולכן הכנסת לקוח עם כתובת אימייל שכבר קיימת אצל לקוח אחר תגרור שגיאה).

לסיכום

בפוסט זה הראיתי איך לעבוד עם MSSQL ב- PHP. ראינו איך להוריד ולהתקין את ה- SQL Server Driver for PHP באמצעות ה- Web Platform Installer, וכתבנו דף שמכניס לקוחות חדשים ומציג אותם.

תהנו!

נספח – הקוד המלא של הדף

<html>

    <head>

        <Title>Example Web Form</Title>

    </head>

<body>

  <form method="post" action="?action=add" enctype="multipart/form-data" >

    Last name <input type="text" name="lastName" id="lastName"/></br>

    First name <input type="text" name="firstName" id="firstName"/></br>

    E-mail address <input type="text" name="emailAddress" id="emailAddress"/></br>

    <input type="submit" name="submit" value="Submit" />

  </form>

<?php

 

  $serverName = ".\sqlexpress";

 

  $connectionOptions = array(

        "Database"=>"CustomersDB");

 

  $conn = sqlsrv_connect($serverName, $connectionOptions);

 

  if($conn === false)

  {

      die(print_r(sqlsrv_errors(), true));

  }

 

  if(isset($_GET['action']))

  {

    if($_GET['action'] == 'add')

    {

      /*Insert data.*/

      $insertSql = "INSERT INTO Customers (LastName, FirstName, Email, RegDate)

                    VALUES (?,?,?,?)";

      $params = array(&$_POST['lastName'],

                      &$_POST['firstName'],

                      &$_POST['emailAddress'],

                      date("Y-m-d"));

 

      $stmt = sqlsrv_query($conn, $insertSql, $params);

      if($stmt === false)

      {

        /*Handle the case of a duplicte e-mail address.*/

        $errors = sqlsrv_errors();

        if($errors[0]['code'] == 2601)

        {

          echo "The e-mail address you entered has already been used.</br>";

        }

        /*Die if other errors occurred.*/

        else

        {

          die(print_r($errors, true));

        }

      }

      else

      {

        echo "Registration complete.</br>";

      }

  }

}

 

$sql = "SELECT * FROM Customers ORDER BY LastName";

$stmt = sqlsrv_query($conn, $sql);

if($stmt === false)

{

  die(print_r(sqlsrv_errors(), true));

}

if(sqlsrv_has_rows($stmt))

{

  print("<table border='1px'>");

  print("<tr><td>Last Name</td>");

  print("<td>First Name</td>");

  print("<td>E-mail Address</td>");

  print("<td>Registration Date</td></tr>");

 

  while($row = sqlsrv_fetch_array($stmt))

  {

    $regDate = date_format($row['RegDate'], 'Y-m-d');

    print("<tr><td>".$row['LastName']."</td>");

    print("<td>".$row['FirstName']."</td>");

    print("<td>".$row['Email']."</td>");

    print("<td>".$regDate."</td></tr>");

  }

  print("</table>");

}

?>

</body>

</html>