gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:57:29 25 4
gpt4 key购买 nike

这是我的存储过程:

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() 似乎是多余的,因为我实际上没有结果集(而且我认为它的存在稍后会导致错误,因为我没有结果集),但是这段代码落下了没有它就结束了(我的实际代码没有,但我不知道为什么)。不过,这可能没有实际意义。

谁能告诉我如何更改此代码以使其正常工作?

最佳答案

PHP manual声明您必须使用 session 变量(MySQL session ,而不是 PHP)

INOUT/OUT parameter

The values of INOUT/OUT parameters are accessed using session variables.

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

MySQL supports a very useful extension that enables the use of regular SELECT statements (that is, without using cursors or local variables) inside a stored procedure. The result set of such a query is simply sent directly to the client.

所以你可以这样做

// 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"
}

注意:错误处理留作练习以仅显示主要问题。

关于php - 从准备语句调用的存储过程的 INOUT 参数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25654522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com