搜尋

首頁  >  問答  >  主體

PHP:使用輸入和輸出參數(不是「INOUT」)呼叫 MySQL 預存程序

我想從 PHP 呼叫 MySQL 中的預存程序。過程採用輸入輸出參數-不是“INOUT”參數。

舉一個簡單的例子,假設我在 MySQL 中有以下預存程序:

DELIMITER $$

DROP PROCEDURE IF EXISTS `test_proc`$$
CREATE PROCEDURE `test_proc`(
    in input_param_1 int,
    in input_param_2 int,
    in input_param_3 int,
    out output_sum int,
    out output_product int,
    out output_average int
)
BEGIN
    set output_sum = input_param_1 + input_param_2 + input_param_3;
    set output_product = input_param_1 * input_param_2 * input_param_3;
    set output_average = (input_param_1 + input_param_2 + input_param_3) / 3;
END$$

DELIMITER ;

現在,從PHP 腳本/頁面方面,假設我有以下變數(我們將其稱為“proc 輸入變數”),我想將它們作為輸入參數提供給儲存過程當我調用它時:

$procInput1 = "123";
$procInput2 = "456";
$procInput3 = "789";

假設在PHP 腳本/頁面端,我還有以下變數(我們稱之為“proc 輸出變數”),我想將它們作為輸出參數提供給預存程序當我調用它時,由預存程序設定

$procOutput_sum;
$procOutput_product;
$procOutput_average;

所以,本質上,在 PHP 腳本/頁面方面,我想要做的,本質上(我意識到以下程式碼無效),是...< /p>

call test_proc($procInput1, $procInput2, $procInput3, $procOutput_sum, $procOutput_product, $procOutput_average);

...一旦調用,就會出現以下 PHP 程式碼...

echo "Sum: ".$procOutput_sum;
echo "Product: ".$procOutput_product;
echo "Average: ".$procOutput_average;

...應該產生以下輸出:

Sum: 1368
Product: 44253432
Average: 456

要注意的是,如果可能的話,我希望能夠使用 MySQLi 過程函數/介面來完成此操作。如果不可能,那麼我將使用讓它工作的方法。

我已經編程有一段時間了,但 PHP 語言對我來說是一個相對較新的嘗試。我發現了大量關於從 PHP 呼叫 MySQL 預存程序的教學課程。有些是使用輸入參數呼叫預存程序的教學課程,有些則是使用輸出參數呼叫預存程序的教學課程,有些則是使用inout<调用存储过程的教程/strong> 參數。我還沒有找到任何關於呼叫同時同時輸入輸出參數的預存程序的教學或範例,而具體使用「輸入輸出」參數。我無法弄清楚如何對參數綁定進行編碼(例如:mysqli_stmt_bind_param 和 mysqli_stmt_bind_result)並使其正常工作。

任何幫助將不勝感激,我提前致謝!

P粉502608799P粉502608799450 天前808

全部回覆(2)我來回復

  • P粉122932466

    P粉1229324662023-10-20 15:06:04

    DB::select('call SP_fci_cb_emp_comp_salary_revision_add(?,?,?,@,@)',
                            [
                                $my_compensation['detail']['employee_master_id'],
                                Carbon::createFromFormat('d/m/Y', $salary_revised_result['detail']->effective_date)->format('Y-m-d'),
                                $request->user_id
                            ]);

    回覆
    0
  • P粉576184933

    P粉5761849332023-10-20 13:23:10

    不幸的是,MySQLi 沒有對輸出預存程序參數的任何本機支援;必須改為輸出到MySQL 用戶變數,然後使用單獨的SELECT 取得值聲明。

    使用程式介面:

    $procInput1 = 123;
    $procInput2 = 456;
    $procInput3 = 789;
    
    $mysqli = mysqli_connect();
    
    $call = mysqli_prepare($mysqli, 'CALL test_proc(?, ?, ?, @sum, @product, @average)');
    mysqli_stmt_bind_param($call, 'iii', $procInput1, $procInput2, $procInput3);
    mysqli_stmt_execute($call);
    
    $select = mysqli_query($mysqli, 'SELECT @sum, @product, @average');
    $result = mysqli_fetch_assoc($select);
    $procOutput_sum     = $result['@sum'];
    $procOutput_product = $result['@product'];
    $procOutput_average = $result['@average'];

    或者,使用物件導向的介面:

    $procInput1 = 123;
    $procInput2 = 456;
    $procInput3 = 789;
    
    $mysqli = new mysqli();
    
    $call = $mysqli->prepare('CALL test_proc(?, ?, ?, @sum, @product, @average)');
    $call->bind_param('iii', $procInput1, $procInput2, $procInput3);
    $call->execute();
    
    $select = $mysqli->query('SELECT @sum, @product, @average');
    $result = $select->fetch_assoc();
    $procOutput_sum     = $result['@sum'];
    $procOutput_product = $result['@product'];
    $procOutput_average = $result['@average'];

    回覆
    0
  • 取消回覆