PHP 連接 MSSQL 資料庫,早期常用 mssql_* 擴展(PHP 5.3 內建),但該擴展已於 PHP 7.0 移除。現代專案建議使用 Microsoft Drivers for PHP for SQL Server(sqlsrv / pdo_sqlsrv)。本文整理傳統 mssql 流程並提供物件導向封裝類別,供維護舊專案參考;新專案請改用 PDO 或 sqlsrv。
php_mssql.dll 擴展:編輯 php.ini,移除 ;extension=php_mssql.dll 前的分號。<?php
// 1. 建立連線
$conn = mssql_connect('伺服器IP或實例名', '帳號', '密碼');
if (!$conn) {
die('連線失敗: ' . mssql_get_last_message());
}
echo '連線成功<br>';
// 2. 選擇資料庫
mssql_select_db('資料庫名稱', $conn);
// 3. 執行查詢
$rs = mssql_query('SELECT TOP 1 id, username FROM tbname', $conn);
// 或執行 UPDATE/INSERT(不需接收結果)
mssql_query("UPDATE tbname SET username='niunv' WHERE id=1", $conn);
// 4. 取得筆數
echo '筆數: ' . mssql_num_rows($rs) . '<br>';
// 5. 逐筆讀取資料
if ($row = mssql_fetch_array($rs)) {
$id = $row[0]; // 或 $row['id']
$username = $row[1]; // 或 $row['username']
echo "ID: $id, Username: $username<br>";
}
// 6. 取得新增資料的自動遞增 ID
mssql_query("INSERT INTO tbname (username) VALUES ('nv')", $conn);
$rsId = mssql_query('SELECT @@IDENTITY AS id', $conn);
if ($row = mssql_fetch_array($rsId)) {
echo '新增 ID: ' . $row['id'] . '<br>';
}
// 7. 釋放結果集記憶體
mssql_free_result($rs);
// 8. 關閉連線
mssql_close($conn);
?>
以下類別整理連線、查詢、分頁、錯誤處理等常用功能,採用持久連線 mssql_pconnect 提升效能:
<?php
class SQL {
var $server, $userName, $passWord, $dataBase;
var $linkID = 0, $queryResult, $lastInsertID, $pageNum = 0, $ER;
function __construct($Server='', $UserName='', $PassWord='', $DataBase='') {
$this->server = $Server;
$this->userName = $UserName;
$this->passWord = $PassWord;
$this->dataBase = $DataBase;
}
// 連線資料庫
function db_connect() {
$this->linkID = mssql_pconnect($this->server, $this->userName, $this->passWord);
if (!$this->linkID) {
$this->ER = "db_connect error";
return 0;
}
if (!mssql_select_db($this->dataBase, $this->linkID)) {
$this->ER = "mssql_select_db error";
return 0;
}
return $this->linkID;
}
// 執行 SQL
function query($Str) {
if ($this->linkID == 0) { $this->ER = "資料庫未連線!!"; return 0; }
$this->queryResult = mssql_query($Str, $this->linkID);
if (!$this->queryResult) {
$this->ER = "$Str 查詢失敗!!";
return 0;
}
return $this->queryResult;
}
// 取得單筆資料
function fetch_array($result = '') {
if ($result != '') $this->queryResult = $result;
$rec = mssql_fetch_array($this->queryResult);
return is_array($rec) ? $rec : 0;
}
// 取得影響筆數
function num_rows($result = '') {
if ($result != '') { $this->queryResult = $result; }
return mssql_num_rows($this->queryResult);
}
// 取得多筆資料(陣列)
function result_ar($str = '') {
if (empty($str)) return 0;
$back = [];
$this->queryResult = $this->query($str);
while ($row = $this->fetch_array($this->queryResult)) {
$back[] = $row;
}
return $back;
}
// 分頁查詢
function page($Str, $Page = 0, $ShowNum = 5) {
$back = []; $maxNum = 0;
if ($Str == '') { $this->ER = "無資料"; return 0; }
$this->queryResult = $this->query($Str);
if ($this->queryResult) {
$nopa = ($Page <= 1) ? 0 : ($Page - 1) * $ShowNum;
$maxNum = $this->num_rows($this->queryResult);
$i = 0; $dd = $this->fetch_array($this->queryResult);
while ($dd && $nopa <= $maxNum && $i < $ShowNum) {
if ($nopa >= $maxNum) $nopa = $maxNum;
mssql_data_seek($this->queryResult, $nopa);
$row = $this->fetch_array($this->queryResult);
$nopa++; $i++; $back[] = $row;
if ($nopa >= $maxNum) break;
}
}
$this->pageNum = $maxNum;
return $back;
}
// 產生分頁 HTML
function page_html($DataNum = 0, $Page = 1, $ShowNum = 3, $web = '#', $Post = '') {
if ($DataNum == 0) return '無查詢資料';
$pageNum = ceil($DataNum / $ShowNum);
$top = ($Page <= 1) ? '首頁<<' : "<a href='$web?page=0&$Post'>首頁<<</a>";
$upPage = ($Page !== 1) ? "<a href='$web?page=" . ($Page-1) . "&$Post'>上一頁</a>" : '上一頁';
$downPage = ($Page < $pageNum) ? "<a href='$web?page=" . ($Page+1) . "&$Post'>下一頁</a>" : '下一頁';
$foot = ($Page == $pageNum) ? '>>尾頁' : "<a href='$web?page=$pageNum&$Post'>>尾頁</a>";
return "<div>共 $pageNum 頁 第 $Page/$pageNum 頁 $top $upPage $downPage $foot</div>";
}
// 釋放資源
function freeResult($result = '') {
if ($result != '') $this->queryResult = $result;
return mssql_free_result($this->queryResult);
}
}
?>
<?php
require_once 'SQL.class.php';
$db = new SQL('127.0.0.1', 'sa', 'password', 'MyDB');
if (!$db->db_connect()) {
die('連線失敗: ' . $db->ER);
}
// 查詢
$rows = $db->result_ar('SELECT * FROM users WHERE status=1');
foreach ($rows as $row) {
echo $row['username'] . '<br>';
}
// 分頁
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$list = $db->page('SELECT * FROM logs ORDER BY id DESC', $page, 10);
$pager = $db->page_html($db->pageNum, $page, 10, 'list.php');
echo $pager;
?>
PHP 7+ 專案請安裝 sqlsrv 與 pdo_sqlsrv 擴展,使用 PDO 統一介面:
<?php
$dsn = 'sqlsrv:Server=127.0.0.1;Database=MyDB';
$pdo = new PDO($dsn, 'sa', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
?>
優點:支援預備語句(防 SQL 注入)、多資料庫可攜、現代 PHP 版本長期支援。