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

PHP 使用 ADODB 調用 MSSQL 預存過程(含輸出參數)

     編輯:PHP 相關知識

場景:PHP 需調用 SQL Server 預存過程並獲取輸出參數

ADODB 是 PHP 通用數據庫抽象層,支援 `PrepareSP` / `InParameter` / `OutParameter` 標準化調用預存過程,屏蔽底層驅動差異。

MSSQL 預存過程示例

CREATE PROCEDURE at_date_interval
    @days INTEGER,
    @start VARCHAR(20) OUTPUT,
    @end   VARCHAR(20) OUTPUT
AS
BEGIN
    SET @start = CONVERT(VARCHAR(20), GETDATE(), 101);
    SET @end   = CONVERT(VARCHAR(20), DATEADD(day, @days, GETDATE()), 101);
END

PHP ADODB 調用代碼

<?php
require_once 'adodb/adodb.inc.php';  // 載入 ADODB

$db = NewADOConnection('mssql');     // 或 'odbc_mssql', 'pdo_mssql'
$db->Connect('host', 'user', 'pass', 'dbname');
$db->debug = true;                   // 開啟調試,輸出 SQL

$stmt = $db->PrepareSP('at_date_interval');

$days = 10;
$begin_date = '';  // 必須預先初始化為空字符串!
$end_date   = '';

// 輸入參數
$db->InParameter($stmt, $days, 'days', 4, SQLINT4);

// 輸出參數:變量引用傳遞,過程執行後將被賦值
$db->OutParameter($stmt, $begin_date, 'start', 20, SQLVARCHAR);
$db->OutParameter($stmt, $end_date,   'end',   20, SQLVARCHAR);

$db->Execute($stmt);

echo "開始日期: $begin_date
"; echo "結束日期: $end_date
"; ?>

關鍵坑點總結

  1. 輸出參數變量必須預初始化(如 `$begin_date = ''`),否則 ADODB 無法正確綁定內存地址,導致取不到值(這是原作者踩坑 N 久的原因)。
  2. 參數類型常數:SQLINT4 (int)、SQLVARCHAR (varchar)、SQLFLT8 (float) 等,需與預存過程定義匹配。
  3. PrepareSP 返回語句句柄,後續所有操作基於此句柄。
  4. 調試時開啟 `$db->debug = true` 可見實際執行的 SQL 及參數綁定情況。

擴展:無輸出參數的簡單調用

$stmt = $db->PrepareSP('usp_GetUserById');
$db->InParameter($stmt, $uid, 'uid', 4, SQLINT4);
$rs = $db->Execute($stmt);
while (!$rs->EOF) {
    echo $rs->fields['username'];
    $rs->MoveNext();
}

現代替代方案

新項目建議使用 PDO 或 PDO_SQLSRV 原生驅動,語法更標準、性能更好、無第三方依賴:

$pdo = new PDO("sqlsrv:Server=host;Database=db", "user", "pass");
$stmt = $pdo->prepare("{CALL at_date_interval(?, ?, ?)}");
$days = 10;
$start = $end = null;
// PDO::PARAM_INPUT_OUTPUT 需指定長度
$stmt->bindParam(1, $days, PDO::PARAM_INT);
$stmt->bindParam(2, $start, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 20);
$stmt->bindParam(3, $end,   PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 20);
$stmt->execute();
echo "Start: $start, End: $end";
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved