2014-09-03 63 views
1

這裏是我的存儲過程:INOUT參數故障存儲過程從準備好的聲明中呼籲

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()似乎是多餘的,因爲我實際上沒有一個結果集(我認爲它的存在會導致錯誤,因爲我沒有結果集),但是這個代碼fal ls沒有它(我的實際代碼不,但我不知道爲什麼)。這可能是沒有意義的。

請任何人都可以告訴我如何更改此代碼,使其工作?

回答

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

注: 錯誤處理作爲一個練習,只顯示了主要問題。