首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 連接 Microsoft SQL Server (MSSQL) 完整指南與類別封裝

     編輯:PHP 相關知識

PHP 連接 MSSQL 資料庫,早期常用 mssql_* 擴展(PHP 5.3 內建),但該擴展已於 PHP 7.0 移除。現代專案建議使用 Microsoft Drivers for PHP for SQL Server(sqlsrv / pdo_sqlsrv)。本文整理傳統 mssql 流程並提供物件導向封裝類別,供維護舊專案參考;新專案請改用 PDO 或 sqlsrv。

環境準備(傳統 mssql 擴展)

  1. 安裝 MSSQL Server 及 Client Tools。
  2. 啟用 PHP php_mssql.dll 擴展:編輯 php.ini,移除 ;extension=php_mssql.dll 前的分號。
  3. 重啟 Web 伺服器(Apache/IIS/Nginx+PHP-FPM)。

基本連線與操作流程

<?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);
?>

物件導向封裝類別(SQL Class)

以下類別整理連線、查詢、分頁、錯誤處理等常用功能,採用持久連線 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;
?>

遷移建議:改用 PDO (sqlsrv)

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 版本長期支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved