データベース処理ライブラリ「MDB2」
PEARには、データベースと連携する処理に利用できる「MDB2」というライブラリがあります。このライブラリを利用することで、さまざまなメリットが享受できます。
今回はまず、このMDB2を用いて過去に作成したプログラムをブラッシュアップしてみましょう。
MDB2を利用するメリット
MDB2を使う大きなメリットの1つとして、データベース製品が変更になった際にメンテナンスが楽にできることが挙げられます。今回のECサイトの構築では、練習のために無償で利用可能なMySQLを使用していますが、現実のECサイトなどでは、長く運用している間に既存のデータベースからOracleなど別の製品に切り替えるということも起こり得ます。これまでは、データベース処理としてmysql_connectやmysql_query命令などを使っていましたが、この命令はOracleデータベースでは使用できません。

MDB2は、PHPとデータベースの中間に立ち、データベースの違いを吸収してくれます。MDB2を使うことで、データベース製品が変更になっても、PHPプログラムの変更を極力少なくできます。
今までの記述方法との違い
それでは、実際の例を見てみましょう。サンプルソースの「mdb2_sample.php」をC:\xampp\htdocs\ec\以下に置き、http://localhost/ec/mdb2_sample.phpにアクセスしてください。このプログラムは、データベースm_itemsからレコードを取得し、画面に表示します。このプログラムは以下のSQLを実行しています。
SELECT * FROM m_items WHERE category = 1 or category = 3
画面での表示が確認できたら、メモ帳などで開いてみましょう。
まず、プログラムの最初の方に、下記のような記述があります。
require_once("MDB2.php");
ここで初めて登場しているrequire_onceという命令は、外部にあるファイルを読み込むための命令です。MDB2ライブラリを使用するために、「MDB2.php」というファイルを読み込んでいます。ファイルの実体はC:\xampp\php\PEAR\MDB2.phpにあります。
次に、下記のような記述があります。
PEAR::setErrorHandling( PEAR_ERROR_CALLBACK, 'handleError' );
function handleError( $error )
{
die('エラーが発生しました。管理者までお問い合わせ下さい。');
}
これはエラー処理を記述しています。エラーが発生すると「エラーが発生しました。管理者までお問い合わせ下さい。」というメッセージを表示し、処理を中断します。これまでの記事では、データベース接続やSQL実行のたびにエラー処理をif文で記述していましたが、MDB2を使うことで毎回エラー処理を記述する必要がなくなります。
function…で始まるブロックは「関数」と呼ばれるものですが、関数の説明はここでは割愛します。関数より後の処理は、これまで記述したプログラムにどこか似ているように感じたかと思います。
下記の表は、これまで使用してきた命令とMDB2での命令の対応表です。
| これまで使用してきた命令 (MySQL専用) |
MDB2に置き換えた命令 (MySQL以外にも使用可) |
| mysql_connect | MDB2::connect |
| mysql_set_charset | $mdb2->setCharset |
| mysql_query | $mdb2->prepare および $stmt->execute |
| mysql_fetch_array | $res->fetchRow |
| mysql_free_result | $res->free |
connect命令やquery命令は、MDB2ライブラリ独自の命令です。従って、命令の前にコロン2つ(::)や矢印記号(->)を付け、MDB2::connectなどの表記をする必要があります。
SQLを実行しているのは、$mdb2->prepareと$stmt->execute命令です。
$stmt = $mdb2->prepare( "SELECT * FROM m_items WHERE category = ? or category = ? " ); $res = $stmt->execute( array( "1", "3" ) );
$mdb2->prepare命令では、変数などを埋め込みたい箇所をクエスチョンマークで表現します。その後、$stmt->execute命令に、?の箇所に指定したい変数をカンマ区切りで順番に指定します。1つ目の?に「1」という文字を、2つ目の?に「3」という文字を指定したい場合はサンプルの通り、
$res = $stmt->execute( array( "1", "3" ) );
と記述します。しかしこれでは「1」と「3」という固定の文字しか指定できないためあまり意味はありません。実際には
$res = $stmt->execute( array( $_REQUEST["category_a"], $_REQUEST["category_b"] ) );
のように、変数を指定します。

