PHP で MySQL を操作するのに役立つリファレンス

PHP+MySQLリファレンス!

mysqli でストアドプロシージャから戻り値を受け取る方法

スポンサードリンク

PHP の mysqli でストアドプロシージャ呼出し時に戻り値を受け取る方法について説明します。

  • 戻り値を@ではじまる変数で受け取る方法(1個の場合)
  • 戻り値を@ではじまる変数で受け取る方法(複数の場合)
  • 戻り値を@ではじまる変数で受け取る方法(1個の場合)

    まずは事前準備として戻り値を返すストアドプロシージャを準備します。次のコードを MySQL サーバー上で実行してください。

    事前準備(戻り値を返すストアドプロシージャの準備)
    DELIMITER //
    CREATE PROCEDURE returnTest(OUT out_result INT)
    BEGIN
      /* 戻り値に 1234 をセット */
      SET out_result = 1234;
    END
    //
    DELIMITER ;
    

    MySQL サーバー上で実行して、次のように何もエラーが出なければ事前準備は OK です。

    mysql> DELIMITER //
    mysql> CREATE PROCEDURE returnTest(OUT out_result INT)
        -> BEGIN
        ->   /* 戻り値に 1234 をセット */
        ->   SET out_result = 1234;
        -> END
        -> //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DELIMITER ;
    mysql>
    

    続いて次のような PHP のコードを用意します。ポイントは次の通りです。

    • ストアドプロシージャ呼出し時に OUT, INOUT の引数に @ で始まる変数を渡す。
    • 戻り値を SELECT する際に、 AS で別名を設定する。
      ( @ で始まる変数名だと PHP 側で取り出せないので注意。)
    • SELECT で取り出した値はオブジェクトのフィールド変数としてアクセスできる。
    サンプルコード(ストアドプロシージャから戻り値を受け取る)
    <?php
    //接続設定
    // ユーザー taro@localhost を パスワード abcd で接続し、
    // test データベースに接続する場合の設定。
    $host          = 'localhost';//ホスト名
    $user_name     = 'taro';     //ユーザー名
    $user_password = 'abcd';     //パスワード
    $database_name = 'test';     //データベース名
    
    print "------------- START -------------\n";
    
    //接続設定に従って MySQL に接続
    $mysqli = new mysqli($host, $user_name, $user_password, $database_name);
    
    //MySQLサーバーの character_set_client と同じ文字コードを設定
    $mysqli->set_charset('CP932');
    
    //ストアドプロシージャを呼び出し実行する
    //@test という変数で戻り値を受け取る
    if($mysqli->query("CALL returnTest(@test)")){
        //正常終了した場合、戻り値を取得。
        //@付きの変数名のままだと取り出せないので AS で別名を設定
        $result = $mysqli->query("SELECT @test AS test");
    
        //戻り値は1行なのでループは不要
        $obj = $result->fetch_object();
    
        //SELECT 時に AS で別名設定した test で戻り値を取り出す
        print $obj->test . "\n";
    }else{
        //エラーが発生した場合はその内容を表示
        print $mysqli->error . "\n";
    }
    
    //MySQL から切断
    $mysqli->close();
    
    print "-------------  END  -------------\n";
    ?>
    

    実際に実行してみると次のように表示されます。ストアドプロシージャが返した 1234 という戻り値が取得できたことが分かります。

    C:\temp>d:\app\php5.6.3\php.exe test.php
    ------------- START -------------
    1234
    -------------  END  -------------
    
    C:\temp>
    

    戻り値を@ではじまる変数で受け取る方法(複数の場合)

    mysqli で複数の戻り値を受け取る方法です。

    まずは次のように複数(今回の場合は2個)の戻り値を返すストアドプロシージャを定義します。

    ちなみに INOUT の引数は、戻り値を受け取るだけでなく事前にセットした値を渡すこともできます。今回の例では 1 個目の引数を INOUT で定義してみます。

    事前準備(戻り値を2個返すストアドプロシージャの準備)
    DELIMITER //
    CREATE PROCEDURE returnTest2(
        INOUT inout_test1 INT, /* 引数1個目 */
        OUT out_test2 TEXT     /* 引数2個目 */
      )
    BEGIN
      /* 1個目の戻り値に引数として渡された値の5倍の値をセット */
      SET inout_test1 = inout_test1 * 5;
    
      /* 2個目の戻り値に文字列をセット */
      SET out_test2 = 'MySQLストアドプロシージャテスト';
    END
    //
    DELIMITER ;
    

    MySQL サーバー上で実行して、次のように何もエラーが出なければ事前準備は OK です。

    mysql> DELIMITER //
    mysql> CREATE PROCEDURE returnTest2(
        ->     INOUT inout_test1 INT, /* 引数1個目 */
        ->     OUT out_test2 TEXT     /* 引数2個目 */
        ->   )
        -> BEGIN
        ->   /* 1個目の戻り値に引数として渡された値の5倍の値をセット */
        ->   SET inout_test1 = inout_test1 * 5;
        ->
        ->   /* 2個目の戻り値に文字列をセット */
        ->   SET out_test2 = 'MySQLストアドプロシージャテスト';
        -> END
        -> //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DELIMITER ;
    mysql>
    

    続いて次のような PHP のコードを用意します。ポイントは次の通りです。

    • ストアドプロシージャ呼出し時に OUT, INOUT の引数に @ で始まる変数を渡す。
    • 戻り値を SELECT する際に、 AS で別名を設定する。
      ( @ で始まる変数名だと PHP 側で取り出せないので注意。)
    • SELECT で戻り値を取り出す際には複数の変数を一気に抽出できる。
    <?php
    //接続設定
    // ユーザー taro@localhost を パスワード abcd で接続し、
    // test データベースに接続する場合の設定。
    $host          = 'localhost';//ホスト名
    $user_name     = 'taro';     //ユーザー名
    $user_password = 'abcd';     //パスワード
    $database_name = 'test';     //データベース名
    
    print "------------- START -------------\n";
    
    //接続設定に従って MySQL に接続
    $mysqli = new mysqli($host, $user_name, $user_password, $database_name);
    
    //MySQLサーバーの character_set_client と同じ文字コードを設定
    $mysqli->set_charset('CP932');
    
    //INOUT の引数は、戻り値を受け取るだけでなく値を渡すこと可能。
    $mysqli->query("SET @var1=45;");
    
    //@var1 と @var2 で戻り値を受け取る。@
    $mysqli->query("CALL returnTest2(@var1, @var2)");
    
    //@付きの変数名のままだと取り出せないので AS で別名を設定
    $result = $mysqli->query("SELECT @var1 AS var1, @var2 AS var2");
    
    //戻り値は1行なのでループは不要
    $obj = $result->fetch_object();
    
    //SELECT 時に AS で別名設定した test で戻り値を取り出す
    print "@var1に返された値:" . $obj->var1 . "\n";
    print "@var2に返された値:" . $obj->var2 . "\n";
    
    //MySQL から切断
    $mysqli->close();
    
    print "-------------  END  -------------\n";
    ?>
    

    実際に実行してみると次のように表示されます。ストアドプロシージャから複数の異なる戻り値を受け取っていることが確認できます。

    C:\temp>d:\app\php5.6.3\php.exe test.php
    ------------- START -------------
    @var1に返された値:225
    @var2に返された値:MySQLストアドプロシージャテスト
    -------------  END  -------------
    
    C:\temp>
    
    スポンサードリンク

    ストアドプロシージャ

    その他のカテゴリー一覧