使用PHP从SQL存储过程中获取返回值


Get Return Value from SQL Stored Procedure using PHP

所以我有一个php脚本,使用存储过程与我的SQL数据库进行交互。存储过程工作得很好,问题是我不知道如何让我的php从存储过程中返回值。存储过程基本上是使用激活密钥激活一个帐户,并设置用户名和密码。

它基本上说"如果提供的激活键还没有用户名,将其设置为提供的激活键并返回1,如果已经有用户名则返回2,如果激活键不存在则返回3"。它在SQL中完美地工作,甚至给出正确的返回值。如何让php回显这个呢?我尝试了以下操作:

$link = sqlsrv_connect($myServer, array('Database' => $myDB, 'UID' => $myUser, 'PWD' => $myPass));
if($link === FALSE) {
    die('Could not connect: ' . sqlsrv_errors(SQLSRV_ERR_ALL));
}
$key = $_REQUEST['key'];
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$query = "EXEC Activate_Account";
$query .=" @key = ";
$query .= $key;
$query .=", @user = ";
$query .= $username;
$query .=", @pass = ";
$query .= $password;
$result = sqlsrv_query($link, $query);
while($row = sqlsrv_fetch_array($result))
{
    echo $row[0];
}
sqlsrv_close($link);

while($row = sqlsrv_fetch_array($result))
{
    echo $row['Return Value'];
}

它们都不回显任何内容。

使用存储过程返回一个值:

例如:

SQL:

CREATE DEFINER=`user`@`localhost` PROCEDURE `ProcedureName`(IN `Input_Value` INT, OUT `Out_val` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
// Your SQL Code
    SET Out_val= Your Value;
    SELECT Out_val;
END
PHP代码:

$insert = "CALL ProcedureName(:Input_Value,
                             @Out_val)";
$bdd = new PDO('mysql:host=localhost;dbname=db-name', 'user', 'password');
$stmt = $bdd->prepare($insert);     
$stmt->bindParam(':Input_Value', $an_input_value, PDO::PARAM_STR); 
$stmt->execute();
$tabResultat = $stmt->fetch();
$Out_val = $tabResultat['Out_val'];
var_dump($Out_val);

下面的示例使您能够从存储过程检索RETURN值,并允许您检索OUTPUT值。

CREATE PROCEDURE [ProcedureName]
    @input_parameter as int,
    @output_parameter as int out
AS
BEGIN
    -- Your SQL code
    SELECT @output_parameter = @input_parameter;
    RETURN 2
END
PHP

:

// Connect.
$link = sqlsrv_connect($myServer, array('Database' => $myDB, 'UID' => $myUser, 'PWD' => $myPass));
$returnValue = 0;
$inputParameter = 10;
$outputParameter = 0;
$parameters = [
    [&$returnValue, SQLSRV_PARAM_OUT],
    [$inputParameter, SQLSRV_PARAM_IN],
    [&$outputParameter, SQLSRV_PARAM_OUT],
];
$sql = "EXEC ? = ProcedureName ? ?";
$stmt = sqlsrv_query($link, $sql, $parameters);
if ($stmt === false)
{
    // Throw/Handle Error.
}
// $returnValue and $outputParameter should be updated here because they were passed by Reference.
// Retrieve query rows if any.
$rows = [];
while (($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) ?? false) !== false) {
    $rows[] = $row;
}

关于此主题的更多阅读可以在以下链接中找到:如何使用sqlsrv驱动程序和sqlsrv查询检索输入和输出参数