web-dev-qa-db-ja.com

PHP:MySQLストアドプロシージャをINPUTパラメータとOUTPUTパラメータの両方で呼び出す( "INOUT"ではない)

からPHP MySQLでストアドプロシージャを呼び出したいと思います。プロシージャは入力および出力パラメータを受け取ります- not "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 input variables」と呼びます)。ストアドプロシージャにinput呼び出すときのパラメーター:

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

PHP script/page side)には、次の変数(「proc出力変数」と呼びます)があり、ストアドプロシージャにoutputパラメータをset toストアドプロシージャに設定すると、次のようになります。

$procOutput_sum;
$procOutput_product;
$procOutput_average;

つまり、本質的にPHPスクリプト/ページ側で、私が実行できるようにしたいこと、本質的に(次のコードは有効)、は...

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

1つの注意点は、可能であれば、MySQLiproceduralfunctions/interfaceを使用してこれを実行できるようにしたいということです。それが不可能な場合は、機能させることができますが、使用します。

私はかなり長い間プログラミングをしてきましたが、PHP言語は私にとって比較的新しい試みです。PHPからMySQLストアドプロシージャを呼び出すチュートリアルがたくさんありました。 inputパラメータを持つプロシージャ、outputパラメータを持つストアドプロシージャの呼び出しに関するチュートリアル、およびinoutパラメータ。both入力および同時に出力パラメーター、特に「inout」パラメーターを使用しないパラメーターバインディングのコーディング方法を理解できません(例:mysqli_stmt_bind_paramとmysqli_stmt_bind_result)を実行し、すべて正常に機能するようにします。

どんな助けでも大歓迎です、そして私は事前に感謝します!

10
John Doe

残念ながら、MySQLi しない は、出力sprocパラメーターをネイティブでサポートしています。代わりに、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'];
21
eggyal