簡體   English   中英

如何從存儲過程中獲取返回值? PHP | PDO

[英]How to get the return value from a stored procedure? PHP | PDO

我想顯示 SQL Server 的 SP 的返回值。 我嘗試使用這種方式,但沒有成功。

我正在使用 PHP PDO 進行數據庫連接,並且正在執行 SQL Server 存儲過程。

$feesObj = new FeesConfig('config/fees.ini');
$feesConfig = $feesObj->getFeesConfig();
                                
$studentId = $user->getSyStudentId();
$statement = $conn->prepare('exec ?= usp_GetStudentDegreeLevel ?');
$statement->bindParam(1, $retval, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$statement->bindParam(2, $studentId, PDO::PARAM_INT);
$statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC);

var_dump("return value". $retval);exit;

此 SP 執行的輸出

NULL

預期結果

1

這段代碼我錯在哪里。 我正在調用 SQL Server SP。

您需要考慮以下幾點:

  • 存儲過程的返回值是一個整數,因此您需要使用適當的綁定。
  • 如果是OUTPUT參數,您需要在PDOStatement::bindParam調用中設置maxLength參數。 正如文檔中所解釋的,要...指示參數是來自存儲過程的 OUT 參數,您必須顯式設置 length
  • 您需要獲取所有可能的結果集(使用PDOStatement::nextRowset )以獲取輸出參數的值。

下面是一個使用 SQL Server 2017、PHP 7.4.8 和 PHP Driver for SQL Server 5.8 的簡化示例:

存儲過程:

CREATE PROCEDURE usp_GetStudentDegreeLevel 
    @StudentId INT  
AS  
BEGIN
    SELECT 'Information about the student' AS StudentInfo;
    RETURN 1;
END

PHP代碼:

<?php
$server   = 'server\instance,port';
$database = 'database';
$username = 'username';
$password = 'password';
try {
    $conn = new PDO("sqlsrv:server=$server;Database=$database", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server".$e->getMessage());
}

try { 
    // 
    $sql = "EXEC ? = usp_GetStudentDegreeLevel ?";
    $statement = $conn->prepare($sql);
    if ($statement === false) {
        echo print_r($conn->errorInfo(), true);
        exit;
    }
    // Execution
    $retval    = 0;
    $studentId = 1;
    $statement->bindParam(1, $retval, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);
    $statement->bindParam(2, $studentId, PDO::PARAM_INT);
    if ($statement->execute() === false) {
        echo print_r($conn->errorInfo(), true);
        exit;
    }   
    // Fetch data. 
    do {
       if ($statement->columnCount() > 0) {
           while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
              echo print_r($row, true); 
           };
        };  
    } while ($statement->nextRowset());
    //
    var_dump("Return value: " . $retval); 
    $statement = null;
} catch (PDOException $e) {
    echo $e->getMessage();
    exit;   
}

$conn = null;
?>

結果:

Array ( [StudentInfo] => Information about the student ) string(15) "Return value: 1"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM