这是我的存储过程:
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()
似乎是多余的,因为我实际上没有结果集(而且我认为它的存在会导致错误,因为我没有结果集),但是这段代码已经过了没有它(我的实际代码不是,但我不知道为什么)。但这可能没有实际意义。
任何人都可以告诉我如何更改此代码以使其正常工作吗?
答案 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"
}
注意:强> 作为练习留下的错误处理只显示主要问题。