![](/img/trans.png)
[英]Prepared Statement Inside Stored Procedure Called by PHP Prepared Statement
[英]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.