从准备语句调用的存储过程的INOUT参数失败

时间:2014-09-03 22:19:02

标签: php mysql stored-procedures prepared-statement

这是我的存储过程:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `testProc`(INOUT num INT(11), INOUT num2 INT(11))
BEGIN
    set num2 = num+7;
END

以下是调用它的代码:

$newId = 1;
$type - 2;

if ($stmt = mysqli_prepare($con, 'call testProc(?,?)')) {
    mysqli_stmt_bind_param($stmt, 'ii', $type,$newId);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $type,$newId);
    echo $newId;
    exit;
    }

我预计$ newId会持有9.它仍然持有1.

mysqli_stmt_bind_result()似乎是多余的,因为我实际上没有结果集(而且我认为它的存在会导致错误,因为我没有结果集),但是这段代码已经过了没有它(我的实际代码不是,但我不知道为什么)。但这可能没有实际意义。

任何人都可以告诉我如何更改此代码以使其正常工作吗?

1 个答案:

答案 0 :(得分:0)

PHP manual表示你必须使用会话变量(MySQL会话,而不是PHP)

  

INOUT / OUT参数

     

使用会话变量访问INOUT / OUT参数的值。

mysqli_stmt_bind_result()将用于绑定结果集中的值,如SELECT语句。这可能是存储过程中的SELECT语句,请参阅MySQL手册的Stored Routine Syntax章节:

  

MySQL支持一个非常有用的扩展,可以使用常规   SELECT语句(即不使用游标或局部变量)   在存储过程中。这种查询的结果集很简单   直接发送给客户。

所以你可以用

来做
// set your IN parameter using a prepared statement
if ($stmt = mysqli_prepare($con, 'SET @type := ?')) {
    mysqli_stmt_bind_param($stmt, 'i', $type);
    mysqli_stmt_execute($stmt);
}

// do the same for your second parameter 
if ($stmt = mysqli_prepare($con, 'SET @newId := ?')) {
    mysqli_stmt_bind_param($stmt, 'i', $newId);
    mysqli_stmt_execute($stmt);
}

// No need to use a prepared statement for the procedure call anymore
$result = mysqli_query($con, 'call testProc(@type, @newId)');
// If the procedure would return something else than the INOUT or OUT parameter
// then you would get this result now

// getting the value of the INOUT parameter
$result = mysqli_query($con, 'SELECT @newId as newId');
$row = mysqli_fetch_assoc($result);             
var_dump($row);

输出:

Connected to databasearray(1) {
  ["newId"]=>
  string(1) "9"
}

注意: 作为练习留下的错误处理只显示主要问题。