這是之前面試的時候的問題與事後筆記,補記一下。
PHP 直連 MSSQL 似乎會有不少編碼的問題,得用 iconv 轉個不停很麻煩。
當然也有 Microsoft 官方釋出的 SQL Server 2005 Driver for PHP 的解法,不過還是記一下 odbtp 的解法囉。

odbtp,最後更新在 2006 年,這是讓我有點擔心的事情 … 。
本來看 adodb5 也有包 odbtp 的樣子,但用 adodb5 怎麼樣都連不上,超怪。

參考網址:

從 LINUX 用 PHP 連結 Windows 2003 上面的 SQL Server 2005

※ SQL Server 端

請注意,odbtp 的服務(winservice)請安裝在 SQLServer 上哦。

1. 解開 odbtp-1.1.4

2. 將裡面的 winservice 資料夾複製到 C:\odbtp\

3. 開啟命令提示字元(cmd),用管理員權限執行

4. 進去 winservice 目錄後,打入:
odbtpctl install
odbtpctl start
正常來說,在 Windows 的 "服務" 中就會多出 Odbtp Server 的項目。

※ PHP 若是 FreeBSD 環境

1. 首先去 odbtp 官網下載 odbtp-1.1.4.tar.gz
執行 zcat odbtp-1.1.4.tar.gz | tar xf -

2. 進去 odbtp-1.1.4/php/ext

3. ee Makefile, 把 PHP_INCROOT 改成 /usr/local/include/php

4. 然後跑 make

5. 編輯 /usr/local/etc/php.ini 加入:

[odbtp]
odbtp.interface_file = "/etc/odbtp.conf"
odbtp.datetime_format = mdyhmsf
odbtp.detach_default_queries = yes

編輯 /etc/odbtp.conf 加入:

[global]
convert datetime = yes
use row cache = yes
right trim text = yes

[mysqls]
type = mssql
odbtp host = 192.168.1.12 <- sql server 的位置
database = patw <- 資料庫名稱
unicode sql = yes

6. 把剛剛 make 產生的 php_odbtp.so 丟到 /usr/local/lib/php/20060613-debug/

7. ee /usr/local/etc/php/extensions.ini

8. 加入 extension=php_odbtp.so、並把 mssql 相關的都註解掉。

9. 重開 apache

應該就支援 odbtp 連線囉 !!
phpinfo() 裡頭會有 odbtp !

※ PHP 若是 Windows 環境

1. 再來是 php 的設定,

將相應版本的 php_odbtp_mssql.dll 複製到 php 的 ext 目錄中。
官網包的 odbtp-1.1.4 只有支援到 PHP-5.1.1,
再高他就不吃了,無法載入。
因此請至 http://odbtp.cvs.sourceforge.net/viewvc/odbtp/odbtp/php/bin_win32/
抓相應的版本,不過目前(2009/10/18)最高也吃到 5.2.6 而已。

2. 打開 php.ini,在 extension 區多加一個 extension=php_odbtp_mssql.dll
並且把其他 mssql 相關的 extension 通通註解掉。

3. 在 php.ini 最下方加入:
[odbtp]
odbtp.interface_file = "C:\xmapplite\php\odbtp.conf" <- 此路徑請依照實際設定
odbtp.datetime_format = mdyhmsf
odbtp.detach_default_queries = yes

* 對了,若使用 xampp,實際上 xampp 執行的設定檔在 apache\bin 底下。
比較以前的 xampp 版本會這樣,像 1.6.6 版。

4. 將 odbtp-1.1.4\examples 裡頭的 odbtp.conf 複製到上面設定的目錄中

5. 打開 odbtp.conf 編輯:

[global]
convert datetime = yes
use row cache = yes
right trim text = yes

[mysqls]
type = mssql
odbtp host = 192.168.1.12 <- ms sql server 位置
database = patw <- 資料庫名稱
unicode sql = yes

6.應該都沒問題了,那麼就把 apache restart 吧!

7.如果都順利的話,應該可以在 phpinfo() 中看到 odbtp 了!

※ 順便記錄一下

MS SQL SERVER 的欄位型態

有 n 在前面的呢, 可以吃 unicode, utf8 沒問題

像是 nvarchar, ntext, nchar 之類的,

若用 varchar, text, char 可能輸出 utf8 頁面就會變亂碼囉

* 對 mssql 的 text 欄位長度 可能要增加屬性
( 修改php.ini )

mssql.textlimit = 4096
mssql.textsize = 4096