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

PHP+MySQLリファレンス!

mysqli で引数を与えてストアドプロシージャを呼び出す方法

スポンサードリンク

PHP で引数を与えて MySQL のストアドプロシージャを実行し、戻り値を受け取る方法を説明します。

次のサンプルコードは、 ITEM_LIST というテーブルを作成し、そのテーブルに対してデータを登録するストアドプロシージャを定義しています。

ストアドプロシージャは1つ目の IN の引数で登録する ITEM_NAME を受け取りテーブルに登録します。登録すると AUTO_INCREMENT の ITEM_ID を取得して戻り値として返します。

今回はこのストアドプロシージャを PHP から呼び出して戻り値を受け取ってみます。まずは次の全てのコードを MySQL サーバーに接続して実行してみてください。もし TEST データベースが無い場合は他のデータベースを使用するか TEST データベースを作成してください。

事前準備(mysqld で MySQL サーバーに接続して実行)
/* TEST データベースを使用 */
USE TEST;

/* テストデータを格納する ITEM_LIST テーブルを作成 */
CREATE TABLE ITEM_LIST(
  ITEM_ID   INT AUTO_INCREMENT,
  ITEM_NAME VARCHAR(100),
  INDEX(ITEM_ID)
);

/* テスト用のストアドプロシージャを作成 */
DELIMITER //
CREATE PROCEDURE insertItem(
    IN  in_item_name VARCHAR(100), /* 引数1:登録する名称を指定 */
    OUT out_item_id INT            /* 引数2:登録したIDを返す   */
  )
BEGIN
  /* データ登録。 ITEM_ID は AUTO_INCREMENT なので自動採番 */
  INSERT INTO ITEM_LIST(ITEM_NAME)VALUES(in_item_name);
  
  /* AUTO_INCREMENT で自動採番した ITEM_ID を戻り値で返す */
  SELECT LAST_INSERT_ID() INTO out_item_id;
END
//
DELIMITER ;

次のように何もエラーが出なければ事前準備は OK です。

mysql> /* TEST データベースを使用 */
mysql> USE TEST;
Database changed
mysql>
mysql> /* テストデータを格納する ITEM_LIST テーブルを作成 */
mysql> CREATE TABLE ITEM_LIST(
    ->   ITEM_ID   INT AUTO_INCREMENT,
    ->   ITEM_NAME VARCHAR(100),
    ->   INDEX(ITEM_ID)
    -> );
Query OK, 0 rows affected (0.13 sec)

mysql>
mysql> /* テスト用のストアドプロシージャを作成 */
mysql> DELIMITER //
mysql> CREATE PROCEDURE insertItem(
    ->     IN  in_item_name VARCHAR(100), /* 引数1:登録する名称を指定 */
    ->     OUT out_item_id INT            /* 引数2:登録したIDを返す   */
    ->   )
    -> BEGIN
    ->   /* データ登録。 ITEM_ID は AUTO_INCREMENT なので自動採番 */
    ->   INSERT INTO ITEM_LIST(ITEM_NAME)VALUES(in_item_name);
    ->
    ->   /* AUTO_INCREMENT で自動採番した ITEM_ID を戻り値で返す */
    ->   SELECT LAST_INSERT_ID() INTO out_item_id;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql>

これで MySQL サーバー側の準備はできました。続いて次のような PHP のコードを用意します。

サンプルコード(mysqli からストアドプロシージャを引数有で呼び出して戻り値を受け取る)
<?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');

//ストアドプロシージャを呼び出し実行
if($mysqli->query("CALL insertItem('人参', @item_id)")){
    //正常終了した場合、戻り値を取得。
    //@付きの変数名だと取り出せないので AS で別名を設定
    $result = $mysqli->query("SELECT @item_id AS item_id");
    
    //戻り値は1行なのでループは不要
    $obj = $result->fetch_object();
    
    print "最新のITEM_ID:" . $obj->item_id . "\n";
}else{
    print $mysqli->error . "\n";
}

//MySQL から切断
$mysqli->close();

print "-------------  END  -------------\n";
?>

実際に実行してみると次のように表示されます。 AUTO_INCREMENT は 1 から自動採番するので、初回実行時は ITEM_ID に 1 が返されます。

C:\temp>d:\app\php5.6.3\php.exe test.php
------------- START -------------
最新のITEM_ID:1
-------------  END  -------------

C:\temp>

初回実行後に MySQL のテーブルを参照してみると、データが 1 件登録されていることが分かります。

mysql> SELECT * FROM ITEM_LIST;
+---------+-----------+
| ITEM_ID | ITEM_NAME |
+---------+-----------+
|       1 | 人参      |
+---------+-----------+
1 row in set (0.00 sec)

mysql>

続いて 2 回、 3 回と連続して実行してみます。 AUTO_INCREMENT で連番が自動採番されている様子が分かります。

C:\temp>d:\app\php5.6.3\php.exe test.php
------------- START -------------
最新のITEM_ID:2
-------------  END  -------------

C:\temp>d:\app\php5.6.3\php.exe test.php
------------- START -------------
最新のITEM_ID:3
-------------  END  -------------

C:\temp>

テーブルからデータを SELECT してみると、実行した回数だけデータが INSERT されています。

mysql> SELECT * FROM ITEM_LIST;
+---------+-----------+
| ITEM_ID | ITEM_NAME |
+---------+-----------+
|       1 | 人参      |
|       2 | 人参      |
|       3 | 人参      |
+---------+-----------+
3 rows in set (0.00 sec)

mysql>
スポンサードリンク

ストアドプロシージャ

その他のカテゴリー一覧