PHPからデータベースを扱う時に便利な「PEAR::MDB2」

PHPからデータベースを扱う時に便利な「PEAR::MDB2」

明日から12月ですね、ichikawaです。
今年はサンタさんに「足専用湯たんぽ」をお願いするつもりです。

今回は今さらかも知れませんが、先日マニュアルを読む機会があったので「PEAR::MDB2」をご紹介します。
PEAR::MDB2は、PEAR(PHPのライブラリ)のパッケージの1つで、PHPからDBを扱う際などに使用します。
PEAR::DBをお使いの方もいらっしゃるかもしれませんが、現在はこちらの「PEAR::MDB2」が推奨されています。(参考記事:まだ、PEAR::DBをお使いの方へ

インストール

PEAR::MDB2のインストールは以下の通りです。
お使いのDBの種類によって適切なドライバもインストールして下さい。

pear install MDB2

MySQLの場合

pear install MDB2_Driver_mysql

PostgreSQLの場合

pear install MDB2_Driver_pgsql

共有のレンタルサーバの場合など、自由にインストールができない場合もあるかと思います。
その場合には、PEAR::MDB2をインストール済みか、(されていなかったら)インストールしてもらえるか、などお問い合わせが必要です。

接続

接続は以下の通りです。

<?php
    $user = 'name';
    $password = 'passwd';
    $server = 'localhost';
    $db = 'db_name';
    $dsn = 'mysql://'.$user.':'.$password.'@'.$server.'/'.$db;

    // DB接続
    $mdb2 =& MDB2::connect($dsn);

    // 上記接続がエラーの場合
    if (PEAR::isError($mdb2)) {
        die($mdb2->getMessage());
    }
?>

MDB2::connect()を使うと、すぐにデータベースとの接続をします。
他にもMDB2::factory()というメソッドがあり、インスタンスは作成しますが必要になるまでデータベースには接続しません。
上記以外にもメソッドがありますので、詳しくはこちらのマニュアルをご覧ください。

切断

上記の接続を切断する時は以下のようにします。

<?php
    $mdb2->disconnect();
?>

フェッチモードの設定

フェッチモードの設定は以下の通りです。
デフォルトは「MDB2_FETCHMODE_ORDERED」です。

<?php
    $mdb2->setFetchMode(MDB2_FETCHMODE_ORDERED); // デフォルト
    $res = $mdb2->queryAll('SELECT * FROM users');
    echo "<pre>";
    print_r($res);
    echo "</pre>";
?>

出力は以下のようになります。

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 9
            [2] => 1
            [3] => 山田 太郎
            [4] => 2009-04-26 00:00:00
            [5] => 2009-06-10 11:59:43
        )

)
<?php
    $mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC); //カラム名をキーとする場合
    $res = $mdb2->queryAll('SELECT * FROM users');
    echo "<pre>";
    print_r($res);
    echo "</pre>";
?>

出力は以下のようになります。

Array
(
    [0] => Array
        (
            [id] => 1
            [status] => 9
            [delete_flag] => 1
            [name] => 山田 太郎
            [created] => 2009-04-26 00:00:00
            [modified] => 2009-06-10 11:59:43
        )

)

コールのたびにフェッチモードを設定する事もできます。

<?php
    $res =& $mdb2->query('SELECT * FROM users');
    while ($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC)) {
        print_r($row);
    }
?>

クエリの実行

データベースに対してクエリを実行するためのメソッドがいくつか用されています。 代表的なのは以下です。

  • query() : (SELECT など結果を返すような場合に使用)
  • exec() : (INSERT,UPDATE,DELETE など結果を返さない場合に使用)
<?php
    $select_sql  = "SELECT * FROM clients";
    $res =& $mdb2->query($select_sql);

    $insert_sql  = "INSERT INTO clients (name, address) VALUES ('山田 太郎', '横浜市')";
    $affected =& $mdb2->exec($insert_sql);
?>

クエリ結果からの個々の行の取得

上記で取得した結果から、個々の行のデータを取得するメソッドは以下の4種類が用意されています。

  • fetchRow() : (行全体を1行取得。メソッドがコールされるたびに次の行に移動)
  • fetchOne() : (特定のカラムを1行取得。メソッドがコールされるたびに次の行に移動)
  • fetchAll() : (行全体のデータを全ての行取得)
  • fetchCol() : (特定のカラムのデータを全ての行取得)

詳細はマニュアルをご覧ください。

<?php
    $res =& $mdb2->query('SELECT * FROM clients');

    // 各行のデータを順に取得し、行がなくなるまで続けます
    while (($row = $res->fetchRow())) {
        print_r($row);
    }
?>

そしてすべてのフェッチメソッドには、クエリの実行も同時に行うバージョンのメソッドがあります。

  • queryOne()
  • queryRow()
  • queryCol()
  • queryAll()
<?php
    $data = $mdb2->queryAll('SELECT * FROM clients');
    print_r($data);
?>

プリペアドステートメントを使用したい場合

<?php
    // SELECTの場合
    $mdb2->loadModule('Extended');
    $query = 'SELECT * FROM clients WHERE id = ?';
    //プリペアド・ステートメントの実行
    $data = $mdb2->extended->getRow($query, null, array(1), array('integer'));
    print_r($data);

    // INSERTの取得の場合
    $insert_sql = "INSERT INTO clients (name , phone) VALUES (?, ?) ";
    $type = array('text', 'integer'); //変数に代入する値のタイプ
    $sth = $mdb2->prepare($insert_sql, $type, MDB2_PREPARE_MANIP);
    $data = array('鈴木 一郎', '03-123-4567'); //変数に代入される値を配列で指定
    //プリペアド・ステートメントの実行
    $res = $sth->execute($data);

    // UPDATEの取得の場合
    $update_sql = "UPDATE clients SET name = ?, phone = ? WHERE id = ?";
    $type = array('text', 'text', 'integer'); //変数に代入する値のタイプ
    $sth = $mdb2->prepare($update_sql, $type, MDB2_PREPARE_MANIP);
    $data = array('山田 太郎', '045-123-4567', 2); //変数に代入される値を配列で指定
    //プリペアド・ステートメントの実行
    $res = $sth->execute($data);
?>

以上、簡単ですが「PEAR::MDB2」のご紹介でした。
もっと詳しく知りたい方はこちらの公式のマニュアルをご覧ください。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ