2013年12月21日 星期六

PHP5.x + sqlsrv

PHP 3.x 以上要連 MS SQL 的話,要開始改用 sqlsrv 。
有兩個東西要裝:
Microsoft Drivers 3.0 for PHP for SQL Server
Microsoft® SQL Server® 2012 Native Client

前者包含這些 dll:
php_sqlsrv_53_nts.dll
php_sqlsrv_53_ts.dll
php_pdo_sqlsrv_53_nts.dll
php_pdo_sqlsrv_53_ts.dll
php_sqlsrv_54_nts.dll
php_sqlsrv_54_ts.dll
php_pdo_sqlsrv_54_ts.dll
php_pdo_sqlsrv_54_nts.dll
要把這些 dll 檔放到 php/ext 的目錄裡面。並修改 php.ini。53 代表 php 5.3,54 是 php 5.4

Native Client 那個是安裝程式,要在 Windows(網頁主機)裡執行它。那如果網頁主機是 Linux ,只有MSSQL 資料庫是 Windows Server 呢?還沒用到,所以目前不知道。

sqlsrv 有兩種使用方式。
1. php_sqlsrv 是微軟自己開發的 sqlsrv,它有自己的函數。各種函數使用方法可參考:微軟說明文件
2. php_pdo_sqlsrv 是被包在 pdo 裡面的 sqlsrv。 使用 pdo 的函數去連接 MSSQL。
這兩種擇一使用。

我之前是使用 php_sqlsrv,因為那時候連接 mysql 資料庫還是用傳統的 php_mysql,不知道 pdo 是啥鬼。使用 sqlsrv 也是被迫不得已,因為新版 php 規定要用 sqlsrv 連 MSSQL。

現在我連接 mysql 資料庫都改用 pdo 了,所以以後 sqlsrv 也會用 pdo 的方式。


範例
假設 MSSQL 連線資訊如下
$DBTYPE='sqlsrv';
$DBHOST="192.168.1.1";
$DBUSER="sa";
$DBPASSWORD="mypassword";
$DBNAME="TestDB";
pdo_sqlsrv
$serverName = "192.168.1.1";
$connectionInfo = array( "Database"=>$DBNAME,"UID" =>$DBUSER, "PWD" => $DBPASSWORD,"CharacterSet" => "UTF-8");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
    echo "Connection established.<br />";
}else{
    echo "Connection could not be established.<br />";
    die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT TOP 50 FROM product";
$result = sqlsrv_query( $conn, $tsql, array(), array("scrollable" => 'keyset'));
if($result === false ){
    die( print_r( sqlsrv_errors(), true));
}
$rows_stmt = sqlsrv_num_rows($stmt);
$cols_stmt = sqlsrv_num_fields($stmt);
while($row = sqlsrv_fetch_array( $result,SQLSRV_FETCH_ASSOC)){
    echo "<pre>".print_r($row,1)."</pre>";
}

php_pdo_sqlsrv
try{
    $dsn = $DBTYPE.':Server='.$DBHOST.';Database='.$DBNAME; echo "<pre>".print_r($dsn ,1)."</pre>";
    $dbh = new PDO($dsn, $DBUSER, $DBPASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die($e->getMessage());
}

try{
    $sql = "SELECT TOP 50 FROM product";
    $result = $dbh->prepare($sql);
    $result->execute();   
    $Rowset = $result->fetchAll(PDO::FETCH_ASSOC);
    echo "<pre>".print_r($Rowset,1)."</pre>"; exit;
} catch (PDOException $e) {
    die($e->getMessage());
}
要注意紅色字體,在 pdo 裡面,sqlsrv 跟 mysql 的字串不一樣。
MySQL 是這樣
$dsn = $DBTYPE.':host='.$DBHOST.';dbname='.$DBNAME;


*補充一個2年前發生過的問題:
在 xampp,要使用 extension=php_sqlsrv_53_ts_vc9.dll 

咦 ~~ vc9 ??不是說, IIS 是 vc9,apache 是 vc6 嗎?為什麼 xampp 裡面的 apache + php ,要用 vc9 ?我也不知道。如果我在 apache 的 php.ini 這樣寫:extension=php_sqlsrv_53_ts_vc6.dll  啟動 apache 反而會出現錯誤訊息:



但是剛下載回來的 dll 檔( 2013-12-21 )已經拿掉了 vc6, vc9 這幾個字。像我的電腦 Windows 7 64 bit,Apache(xampp) 使用的是  extension=php_sqlsrv_54_ts.dll

沒有留言:

張貼留言