在早期的 PHP 開發環境中(PHP 4 時代),開發者常面臨如何從 PHP 呼叫資料庫預存程序的需求。預存程序儲存在資料庫伺服器端,執行效率高、減少網路傳輸,但也有綁定特定資料庫、移植性較差的缺點。本文示範如何在 Windows 平台上,透過 PHP 的 COM 元件呼叫 ADO 物件,進而執行 SQL Server 的預存程序。
com_dotnet 延伸模組首先在 SQL Server 中建立一個預存程序,查詢客戶基本資料:
CREATE PROCEDURE [sp_mystoreprocedure] AS
SELECT companyname, contactname, city FROM customers
使用 COM("ADODB.Connection") 建立連線物件,透過 OLEDB 連線字串連接資料庫,然後直接執行預存程序名稱:
<?php
define("OLEDB_CONNECTION_STRING",
"Provider=SQLOLEDB; Data Source=zzb; Initial Catalog=Northwind; User ID=sa; Password=");
$dbc = new COM("ADODB.Connection");
$dbc->Open(OLEDB_CONNECTION_STRING);
$command = "sp_mystoreprocedure";
$rs = $dbc->Execute($command); // 取得 Recordset
// 輸出 HTML 表格
echo '<table cellspacing="1" cellpadding="3" width="600" align="center" bgcolor="#000000" border="0">';
echo '<tr valign="bottom" bgcolor="#9999cc"><th>公司名稱</th><th>聯絡人</th><th>城市</th></tr>';
$i = 0;
while (!$rs->EOF) {
$i++;
$fld0 = $rs->Fields(0);
$fld1 = $rs->Fields(1);
$fld2 = $rs->Fields(2);
$bg = ($i % 2 == 0) ? "#cccccc" : "#ffffff";
echo "<tr valign='baseline' bgcolor='$bg'>";
echo "<td bgcolor='#ccccff'><b>{$fld0->value}</b></td>";
echo "<td align='center'>{$fld1->value}</td>";
echo "<td align='center'>{$fld2->value}</td>";
echo "</tr>";
$rs->MoveNext();
}
echo "</table>";
$rs->Close();
$dbc->Close();
?>
sqlsrv、pdo_sqlsrv)。現代 PHP(7.0+)建議使用 PDO 搭配 sqlsrv 驅動:
<?php
$dsn = "sqlsrv:Server=zzb;Database=Northwind";
$pdo = new PDO($dsn, "sa", "");
$stmt = $pdo->query("EXEC sp_mystoreprocedure");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 處理資料
}
?>
PDO 提供參數綁定、例外處理、跨資料庫支援,是更佳的長期選擇。