2016年3月23日 星期三

[PHP] PHP 5.4 (for Windows)之後版本連接Microsoft SQL Server

Screen Shot 2013-08-26 at 12.50.45 PM  
PHP要怎麼連Microsoft SQL Server?網路上教學很多
但很多是舊版,這是新版的做法
只有Windows平台受影響

敝人愛用XAMPP所以就用這套講起
它好像自從其中一個版號之後...
XAMPP for Windows把原本mssql的連接方式抽掉了
只能用Native Client的連接方式

而其它平台則不受影響
-------
簡單講一下差異...
Screen Shot 2013-08-26 at 8.28.07 PM  
這裡有三個流程圖...
Mac / Linux 是看最右邊的方式,底層採用FreeTDS連接SQL Server
Windows則有二種方式連接,中間的是舊版做法,左邊的是新版做法

簡單來說...就是換Library了啦!
SQLSRV的話,是微軟提供&維護的Driver,

在Microsoft官網有完整的API Reference
http://msdn.microsoft.com/en-us/library/cc296152.aspx
當然,php官方也Mirror了一份
http://php.net/manual/en/book.sqlsrv.php

所以這篇,主要教怎做這個更換Library的動作


-------
剛開始,你在Configure Command裡面看到類似 "--without-mssql" "--without-pdo-mssql"的字眼就不要太緊張
因為它換模組名稱

-------
敝人愛用XAMPP所以就用這套講起
首先你需要裝一個Native Client
依照這個網址指示
http://msdn.microsoft.com/en-us/library/cc296170.aspx
Screen Shot 2013-08-26 at 1.08.39 PM  
這就看你的SQL Server版本不同平台不同裝不一樣的

我的話,用Microsoft SQL Server 2008,系統是64位元的
所以裝這個
http://go.microsoft.com/fwlink/?LinkID=188401&clcid=0x409
(它有特別提到,系統如果是64位元的SQL Server就一定要裝64位元的)
----------------
到這網址
http://www.microsoft.com/en-us/download/details.aspx?id=20098
抓檔案 

但這也要看PHP版本,以我的版本XAMPP 1.8.2 for Windows來說
Screen Shot 2013-08-26 at 1.16.48 PM  
我的圖面上很清楚看到的是php 5.4
然後比照php資料夾裡的dll是Thread Safe 還是 non-Thread Safe的版本

Screen Shot 2013-08-26 at 1.11.14 PM  


以我的版本XAMPP 1.8.2 for Windows來說
我在C:\xampp\php\裡面
找不到php5.dll但有php5ts.dll
所以我知道我的版本是Thread Safe版本
SQLSRV30.EXE檔案,用7-zip等程式直接解壓縮(本身執行檔是壞的,不用在雙點了)
就會得到
php_sqlsrv_54_ts.dll
php_pdo_sqlsrv_54_ts.dll
這二個檔案

把它複製到C:\xampp\php\ext\ 裡面
然後手動在php.ini裡面加上
extension=php_sqlsrv_54_ts.dll
extension=php_pdo_sqlsrv_54_ts.dll
然後重開Apache
-----------------
看phpinfo(),找sqlsrv就會看到類似以下畫面
Screen Shot 2013-08-26 at 12.49.33 PM  
就完成了

因為模組有變更,程式碼也變更
所以以下這段在Windows底下就棄用了喔(Mac / Linux的話不受影響,還是用這一段)
$conn = mssql_connect($serverName, $DBUsername, $DBPassword)
or die("Couldn't connect to SQL Server on $myServer");
if (!$conn) {
die('Something went wrong while connecting to MSSQL');
}
?>

改成新版的寫法 
$serverName = "localhost"; //serverName\instanceName
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
echo "Connection established.
";
}else{
echo "Connection could not be established.
";
die( print_r( sqlsrv_errors(), true));
}
?>

網路找了個半天,終於解出來問題了
之後來測試一下連線

至於更詳細sqlsrv和mssql使用上的差異
可以參考這一篇
http://blogs.msdn.com/b/brian_swan/archive/2010/03/10/mssql-vs-sqlsrv-what-s-the-difference-part-2.aspx

--------------
參考資料:
整個模組Reference
http://php.net/manual/en/book.sqlsrv.php
http://msdn.microsoft.com/en-us/library/cc296152.aspx
安裝準備
http://msdn.microsoft.com/en-us/library/cc296170.aspx
官方的範例
http://msdn.microsoft.com/en-us/library/cc296196(v=sql.105).aspx

http://blogs.msdn.com/b/brian_swan/archive/2010/03/08/mssql-vs-sqlsrv-what-s-the-difference-part-1.aspx
http://blogs.msdn.com/b/brian_swan/archive/2010/03/10/mssql-vs-sqlsrv-what-s-the-difference-part-2.as
http://www.apachefriends.org/f/viewtopic.php?f=16&t=49670&p=191610&hilit=SQLSRV#p191610


reference : http://j796160836.pixnet.net/blog/post/32652509-%5Bphp%5D-php-5.4-(for-windows)%E4%B9%8B%E5%BE%8C%E7%89%88%E6%9C%AC%E9%80%A3%E6%8E%A5microsoft-sql-s

沒有留言:

wibiya widget