有兩個東西要裝:
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';pdo_sqlsrv
$DBHOST="192.168.1.1";
$DBUSER="sa";
$DBPASSWORD="mypassword";
$DBNAME="TestDB";
$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{要注意紅色字體,在 pdo 裡面,sqlsrv 跟 mysql 的字串不一樣。
$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());
}
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
沒有留言:
張貼留言