ADODB 是 PHP 通用數據庫抽象層,支援 `PrepareSP` / `InParameter` / `OutParameter` 標準化調用預存過程,屏蔽底層驅動差異。
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
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
";
?>
SQLINT4 (int)、SQLVARCHAR (varchar)、SQLFLT8 (float) 等,需與預存過程定義匹配。PrepareSP 返回語句句柄,後續所有操作基於此句柄。$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";