SQL Server Driver for PHP Version 1.1 ─ PHP 連 SQL Server & UTF-8 的微軟官方解決方案

Standard

之前曾經談過 odbtp 的解決方案,大半是為了編碼的問題吧,在 FreeBSD/Linux 環境下似乎用這種方式比較好。

也曾經試過 ADOdb 的方式,但好像連不上,底層似乎是使用 php 的 mssql_connect 吧,總之這方式就沒有繼續深究了。

之前提過的 odbtp 方案,若 PHP 在 Windows 環境時,odbtp 提供的相依版本似乎有些老舊。我想在 Windows 上就採用微軟自家的解決方案試試囉。

它就是:SQL Server Driver for PHP Version 1.1

可以在這裡取得:

http://www.microsoft.com/downloads/details.aspx?FamilyID=ccdf728b-1ea0-48a8-a84a-5052214caad9&displaylang=en

這邊是相關的說明:

http://technet.microsoft.com/zh-tw/library/cc296170(SQL.90).aspx

1.0 的時候,此方案對於 UTF-8 字元還是必須用 iconv 轉來轉去,麻煩的很。

1.1 則終於支援了 UTF-8 字元處理,根據官方的說明,只要滿足以下兩個條件就能正常處理 UTF-8 字元:

1. Make sure that the source or destination column is of type nchar or nvarchar.

這個就是有 n 沒 n 的欄位屬性啦。詳細去查 SQL Server 的文件吧。

2. Specify the PHP type as SQLSRV_PHPTYPE_STRING(‘UTF-8’) in the parameters array. Or, specify “CharacterSet” => “UTF-8” as a connection option.

我會比較喜歡用後者,在連線的時候就設定好。

我的測試環境如下:

SQL Server 2008 x64 / Windows 2008 x64

XAMPP 1.7.3

SQL Server Driver for PHP v1.1

PHP 端

  1. 首先,先設置好 XAMPP 的環境,然後將 SQL Server Driver for PHP v1.1 解壓開來,依照說明文件中的 System Requirements,複製對應的 .dll 檔到 php\ext。(本例用 php_sqlsrv_53_ts_vc6.dll)
  2. 修改 php.ini,增加 extension=php_sqlsrv_53_ts_vc6.dll,然後重啟 apache。
  3. 如果想確認一下是否有載入成功,跑一下 phpinfo() 吧。正常的話應該會出現 sqlsrv 這個項目。
  4. 嗯,然後安裝一下 Microsoft SQL Server 2008 Native Client (sqlncli10.dll) (適用於 SQL Server Driver for PHP 1.1 版)。可以在這下載,請下載與環境對應的版本。
  5. 必須提一下說明網頁上這句話
  6. Microsoft SQL Server Native Client 必須安裝在正在執行 PHP 的相同電腦上。

    當初沒看到,一直鐵齒在 SQL Server 端安裝,難怪一直連不上。

SQL Server 端

  1. 設置好相關的資料庫、供連線用的帳號密碼等資料。
  2. 如果要開放非本機的連線,可以參考這篇。簡單提一下,就是在「SQL Server 組態管理員」中設置 TCP/IP 的內容。

PHP 連線到 SQL Server 的寫法:

稍微修改了一下說明文件的範例,參考一下。

自己測過,INSERT 與 SELECT 出的 UTF-8 字元都很正常。

<?php
header('Content-type: text/html; charset=utf-8');
/* Specify the server and connection string attributes. */
$serverName = "SQLServer的位置";
/* Get UID and PWD from application-specific files.  */
$uid = "帳號";
$pwd = "密碼";
$connectionInfo = array(
  "UID" => $uid,
  "PWD" => $pwd,
  "Database" => "資料庫名",
  "CharacterSet" => "UTF-8"
);
/* Connect using SQL Server Authentication. */
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
  echo "Unable to connect.<br />";
  die(print_r(sqlsrv_errors() , true));
}

/* Query SQL Server for the login of the user accessing the
database. */
$tsql = "SELECT * FROM MyData";
$stmt = sqlsrv_query($conn, $tsql);

if ($stmt === false) {
  echo "Error in executing query.</br>";
  die(print_r(sqlsrv_errors() , true));
}

/* Retrieve and display the results of the query. */
$row = sqlsrv_fetch_array($stmt);
echo $row[0] . "<br />";
/* Free statement and connection resources. */
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

OK,大致如上囉。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *