之前曾經談過 odbtp 的解決方案,大半是為了編碼的問題吧,在 FreeBSD/Linux 環境下似乎用這種方式比較好。
也曾經試過 ADOdb 的方式,但好像連不上,底層似乎是使用 php 的 mssql_connect 吧,總之這方式就沒有繼續深究了。
之前提過的 odbtp 方案,若 PHP 在 Windows 環境時,odbtp 提供的相依版本似乎有些老舊。我想在 Windows 上就採用微軟自家的解決方案試試囉。
它就是:SQL Server Driver for PHP Version 1.1
可以在這裡取得:
這邊是相關的說明:
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 端
- 首先,先設置好 XAMPP 的環境,然後將 SQL Server Driver for PHP v1.1 解壓開來,依照說明文件中的 System Requirements,複製對應的 .dll 檔到 php\ext。(本例用 php_sqlsrv_53_ts_vc6.dll)
- 修改 php.ini,增加 extension=php_sqlsrv_53_ts_vc6.dll,然後重啟 apache。
- 如果想確認一下是否有載入成功,跑一下 phpinfo() 吧。正常的話應該會出現 sqlsrv 這個項目。
- 嗯,然後安裝一下 Microsoft SQL Server 2008 Native Client (sqlncli10.dll) (適用於 SQL Server Driver for PHP 1.1 版)。可以在這下載,請下載與環境對應的版本。
- 必須提一下說明網頁上這句話
Microsoft SQL Server Native Client 必須安裝在正在執行 PHP 的相同電腦上。
當初沒看到,一直鐵齒在 SQL Server 端安裝,難怪一直連不上。
SQL Server 端
- 設置好相關的資料庫、供連線用的帳號密碼等資料。
- 如果要開放非本機的連線,可以參考這篇。簡單提一下,就是在「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,大致如上囉。