PHP调用SQL Server SP返回数据,输出参数和返回值

时间:2018-11-27 09:29:38

标签: php sql-server stored-procedures


我是PHP编程的初学者。 我在SQL Server中有一个SP,带有输入,输出和ReturnValue参数,可以从示例表中返回数据。

CREATE PROCEDURE [dbo].[sp_PHP]
@in1 int, @in2 int, @out3 int OUTPUT
WITH EXEC AS CALLER
AS
SET @out3 = @in1 * @in2

SELECT * FROM PHP

RETURN @in1 + @in2

这是我的PHP代码

<?php
try
{
    $conn = new PDO("sqlsrv:Server=xxxxx,1433;Database=xxxxxx", "xx", "xx");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (Exception $e)
{
die(print_r($e->getMessage()));
}

$query = '{? = CALL sp_PHP(?, ?, ?)}'; 
$stmt = $conn->prepare($query); 

$returnVariable = -1;
$inputVariable1 = 18;
$inputVariable2 = 24;
$outputVariable3 = -1;

$stmt->bindParam(1,$returnVariable, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 100);
$stmt->bindParam(2,$inputVariable1, PDO::PARAM_INT);
$stmt->bindParam(3,$inputVariable2, PDO::PARAM_INT);
$stmt->bindParam(4,$outputVariable3, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 100);

$stmt->execute();

$results = $stmt->fetchAll(PDO::FETCH_BOTH);

foreach($results as $row) {
    echo $row['PHP_ID'].' '.$row['PHP_Char'].'<br>';
}

echo '<hr>';
echo 'Return value: '.$returnVariable.'<br>';
echo 'Output parameter: '.$outputVariable3.'<br>';

?>

如果我删除SP中的行

SELECT * FROM PHP

并且不要读取通过以下代码在PHP中接收到的数据

$results = $stmt->fetchAll(PDO::FETCH_BOTH);

foreach($results as $row) {
    echo $row['PHP_ID'].' '.$row['PHP_Char'].'<br>';
}

我收到正确的值$ returnVariable(42)和$ outputVariable3(432)。

但是,如果我读取(并显示)从SP读取的数据,则$ returnVariable和$ outputVariable3等于-1(分配的值)

我想同时读取输出参数,ReturnValue和数据。

有可能吗?我在哪里错了?

谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案:

当您使用存储过程返回的所有结果(PDO而非PDO版本)时,可以访问output(或输入/输出)参数的值。在您的情况下,您需要使用PDOStatement::nextRowset移动throw结果集以获取输出参数的值。

示例:

我已经复制了您的示例,接下来的代码对我有用。

<?php
$server = 'server\instance,port';
$database = 'database';
$uid = 'user';
$pwd = 'password';

try {
    $conn = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server".$e->getMessage());
}

try {
    $sql = "{? = CALL sp_PHP(?, ?, ?)}";
    #$sql = "EXEC ? = sp_PHP(?, ?, ?)";
    $stmt = $conn->prepare($sql);

    $returnVariable  = -1;
    $inputVariable1  = 18;
    $inputVariable2  = 24;
    $outputVariable3 = -1;

    $stmt->bindParam(1, $returnVariable, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);
    $stmt->bindParam(2, $inputVariable1, PDO::PARAM_INT);
    $stmt->bindParam(3, $inputVariable2, PDO::PARAM_INT);
    $stmt->bindParam(4, $outputVariable3, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);    
    $stmt->execute();

    do {
       echo 'Result set:'."<br>";
       while ($row = $stmt->fetch( PDO::FETCH_ASSOC) ){
          print_r($row)."<br>";
       }    
       echo "<br>";
       echo "<br>";
    } while ($stmt->nextRowset());  

} catch( PDOException $e ) {
    die( "Error executing query" );
}

$stmt = null;
$conn = null;

echo 'Stored procedure return value: '.$returnVariable."</br>";
echo 'Stored procedure output parameter: '.$outputVariable3."</br>";
?>