入力パラメータと出力パラメータの両方 (INOUT パラメータを除く) を必要とする MySQL ストアド プロシージャを呼び出す場合、 PHP の接続インターフェイスとステートメント インターフェイスの微妙な違いを理解することが重要です。
プロシージャのセットアップ
次の 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 接続とステートメント
このプロシージャを呼び出すには、MySQLi の手続き型インターフェイスまたはオブジェクト指向インターフェイスのいずれかを使用できます。
手続き型インターフェイス:
$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);
オブジェクト指向インターフェイス:
$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();
パラメータ バインディング
どちらのインターフェイスでも、パラメーター バインディングの手順が重要です。通常、入力パラメータは整数の「i」でバインドされ、出力パラメータはパラメータ名が続く「@」を使用してバインドされます。
出力取得
CALL ステートメントを実行すると、別の SELECT ステートメントが実行され、ストアド プロシージャが設定した MySQL ユーザー変数 (@sum、@product、@average) から値が取得されます。
結論
MySQLi は出力パラメータの直接バインディングをネイティブにサポートしていませんが、開発者はユーザー変数と後続の SELECT ステートメントを使用して、入力パラメータと出力パラメータの両方を必要とするプロシージャを操作できます。
以上がPHP で入力パラメータと出力パラメータの両方を使用して MySQL ストアド プロシージャを呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。