簡體   English   中英

從准備好的語句調用的存儲過程的INOUT參數失敗

[英]INOUT parameter failure for stored procedure called from 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()似乎是多余的,因為我實際上沒有結果集(而且我認為它的存在會在以后導致錯誤,因為我沒有結果集),但是沒有它,這段代碼就會崩潰(我的實際代碼沒有)但我不知道為什么)。 不過那可能是沒有意思的。

請任何人告訴我如何更改此代碼以使其起作用?

PHP手冊指出您必須使用會話變量(MySQL會話,而不是PHP)

INOUT / OUT參數

使用會話變量可以訪問INOUT / OUT參數的值。

mysqli_stmt_bind_result()用於綁定來自SELECT語句等結果mysqli_stmt_bind_result()值。 這可以是存儲過程中的SELECT語句,請參見MySQL手冊的“ 存儲例程語法 ”一章:

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

注意:錯誤處理僅作為練習,以僅顯示主要問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM