PDOを使用してストアドプロシージャを呼び出す
PDOのドキュメントには次のように書かれています。
「PHP Data Objects(PDO)エクステンションは、PHPからデータベースにアクセスするための軽量で一貫性のあるインターフェースを定義するものです。このPDOインターフェースを実装する個々のデータベースドライバが、データベース固有の機能をいつものエクステンション機能として公開できるようにします。PDOエクステンションだけではデータベースの機能は実行できません。データベースサーバにアクセスするためには、データベース固有のPDOドライバを使う必要があります」
原文では上記引用内のURLがリンク切れだったため、修正しました。
PDOエクステンションを使うと、アクセスメソッドを変えなくてもバックエンドデータベースを変更できる柔軟性が生まれます。PDOには、MySQLのバージョンに関係なく同じデータアクセスメソッドを使えるメリットがあります。そのため、旧バージョンのMySQLでは標準のMySQLエクステンションを使い、新バージョンではMySQLiエクステンションを使うといったことをしなくて済みます。また、MySQLのバージョンに関係なくオブジェクト指向コードを利用できるメリットもあります。従って、データベース抽象化レイヤに柔軟性が必要なときはPDOでコードの堅牢性と移植性を高め、アプリケーションの動作を高速化したいときは2つのインターフェースのどちらか(MySQLまたはMySQLi)を使います。
このエクステンションを使うには、次の2行をphp.iniに追加します。
extension=php_pdo.dll extension=php_pdo_mysql.dll
上の2行目は、このエクステンションを動かすために必須のMySQLドライバです。次の例では、total_price
ストアドプロシージャを呼び出します。
<?php $pdo = new PDO('mysql:dbname=books;host=127.0.0.1', 'root', ''); print 'PDO: simple select'; $pdo->query( 'CALL total_price(@t)' ); foreach($pdo->query( 'SELECT @t' ) as $row) { print_r($row); } ?>
出力は次のようになります。
PDO: simple select Array ( [@t] => 4300 [0] => 4300 )
特定の行を選択するプロシージャを書くのは簡単です。例えば、次のプロシージャはbookstore
テーブルのレコードのうち、IDが3に等しいものを選択します。
CREATE PROCEDURE proc_new () BEGIN SELECT * from bookstore where id=3; END
次の例では、proc_new()
を呼び出し、結果を表示します。
<?php //Connecting to MySQL server and to the books database $pdo = new PDO('mysql:dbname=books;host=127.0.0.1', 'root', ''); print 'Calling the proc_new() stored procedure using PDO'; foreach($pdo->query( 'CALL proc_new()' ) as $row) { print_r($row); } ?>
出力は次のようになります。
Calling the proc_new() stored procedure using PDO Array ( [id] => 3 [0] => 3 [book] => Introduction to PHP [1] => Introduction to PHP [author] => Weeling Tom [2] => Weeling Tom [isbn] => 4334-2323-23233-434 [3] => 4334-2323-23233-434 [price] => 300 [4] => 300 )
本稿では、簡単なストアドプロシージャ/ストアドファンクションの作り方と、それらをPHPから呼び出すためのデータベースエクステンション(MySQL、MySQLi、PDO)の使い方を説明しました。これらを必要なときにいつでも利用できるようにしておけば、コードの単純化と高速化を実現でき、同時にアプリケーションがバックエンドデータベースの変更に影響されないようになるので、エラーが全般的に抑えられます。