【问题标题】:PHP call SQL Server SP returning data, output parameters and return valuePHP调用SQL Server SP返回数据、输出参数和返回值
【发布时间】:2018-11-27 09:29:37
【问题描述】:


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

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 和数据。

有可能吗?我哪里错了?

谢谢!!

【问题讨论】:

  • 可能已解决更改的连接方法 $conn = sqlsrv_connect($serverName, $connectionInfo)

标签: php sql-server stored-procedures


【解决方案1】:

解决方案:

当您使用存储过程(PDO 而非 PDO 版本)返回的所有结果时,可以访问输出(或输入/输出)参数的值。在您的情况下,您需要使用 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>";
?>

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多