single.php

PHPからMySQLのストアドプロシージャを動作させる(PDO PREPARE)

使ってみたら、意外に簡単だったので備忘録的に投稿します。PHPのPDOを使ってMySQL内のストアドプロシージャを呼び出す場合の手順です。

MySQLでストアドを作成

今回は[Workbench]を使って、ストアドプロシージャを作っていきます。

+------------------+
| id  | name       |
+------------------+
|  1  | apple      | 
|  2  | orange     |
|  3  | pine       |
|  4  | grape      |
|  5  | banana     |
+------------------+

こんな感じのテーブル[sampletable]を用意されているとして、Workbenchを起動して、[Navigator]画面の[Stored Procedures]をマウスの右ボタンでクリックして表示されたポップアップメニューから[Create Stored Procedure]を選択します。

表示された[new_procesure]画面されます。

テンプレを次のように編集します。

CREATE PROCEDURE sp_sampleproc()
BEGIN
  SELECT * FROM sampletable;
END

[Apply]ボタンをクリックして、編集したストアドを反映します。

これで準備は完了です。

PHPで呼び出し

今回もPDOからストアドを呼び出していきます。呼び出し側はこんな感じです。

$sql = $pdo->prepare ( 'call sp_sampleproc()' );

簡単ですね。

HTMLにデータの内容をすべて表示する場合の具体的なコードにすると、こんな感じになります。

<html>
<body>
<?php try { $pdo = new PDO('mysql:host=localhost;dbname=sampledb', 'root', 'password', array(PDO::ATTR_EMULATE_PREPARES => false));

  $sql = $pdo->prepare ( 'call sp_sampleproc()' );
  $sql->execute();

  foreach ( $sql->fetchAll () as $row ) {
    echo $row ['id'];
    echo $row ['name']
  }

} catch (PDOException $e) {
  exit('データベース接続失敗。'.$e->getMessage());
}
?>
</body>
</html>

引数付きで呼び出し

ストアドを使う場合に引数を渡して、呼び出しすること普通です。パラメタ付きで呼び出す場合は、こんな感じになります。

MySQL側のストアドを少し変更して引数を受け取れるようにします。

CREATE PROCEDURE sp_sampleproc_ex(in p int)
BEGIN
  select * from sampletable where id = p;
END

PHP側もパラメタを入力する部分を追加します。

$sql = $pdo->prepare ( 'call sp_sampleproc_ex(?)' );
$p = 2;
$sql->bindParam(1, $p, PDO::PARAM_INT);

引数の受け渡しも簡単です。

実際に、HTMLで表示する具体的なコードにすると、こんな感じになります。

<html>
<body>
<?php try { $pdo = new PDO('mysql:host=localhost;dbname=sampledb', 'root', 'password', array(PDO::ATTR_EMULATE_PREPARES => false));

  $sql = $pdo->prepare ( 'call sp_sampleproc_ex(?)' );
  $id = 2;
  $sql->bindParam(1, $id, PDO::PARAM_INT);
  $sql->execute();

  foreach ( $sql->fetchAll () as $row ) {
    echo $row ['id'];
    echo $row ['name']
  }

} catch (PDOException $e) {
  exit('データベース接続失敗。'.$e->getMessage());
}
?>
</body>
</html>

実行すると、orangeの行が表示されるはずです。

まとめ

PHP側でクエリーを発行した方が、ストアドを開発する手間が無くなるのでアプリの開発自体は効率的です。

実際に運用する場合になると、何かの変更があった場合にストアドのみで解決するケースもある(クエリーの場合は、コード編集が必要)のでメリットがあります。

SQLインジェクションなどセキュリティ的にもストアドを使うメリットはあるので、覚えておいて損にはならない技術です。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です