Recent changes

2013-04-14 2013-04-02 2013-02-17 2013-01-29 2013-01-20 2013-01-18 2012-12-08 2012-11-06 2012-09-04 2012-08-02

halt/:mook

火曜日までに提出か。やばいな。

halt

テストサイト - http://sonata.zive.net:81/dbdo

目次

PEAR::DB_DataObjectとは

PEAR::DB_DataObjectとはPEAR::DBを利用したSQLビルダーです。 テーブルをオブジェクトとして扱えるようになり、 SQLを書くことなくテーブルの操作が可能となります。

インストール

インストールにはpearコマンドを利用します。

pear install DB
pear install DB_DataObject

DBの作成

次にデータベースの作成を行います。 ユーザ名をdbdo、パスワードをdbdo、DB名をaddressとして データベースを作成し、以下のSQLを実行してテーブルを作成します。

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(128) NOT NULL default '',
  `address` varchar(128) default NULL,
  `tel` varchar(32) default NULL,
  UNIQUE KEY `id` (`id`)
) TYPE=MyISAM;

DataObjectの作成

テーブル作成後、テーブルに基づくDataObjectクラスを作成します。 DB_DataObjectにはテーブル情報から自動的にDataObjectクラスを生成する createTables.phpが付属しているので今回はこれを利用してDataObjectを自動生成 してみます。

設定ファイルの作成

自動生成するための設定を記述するiniファイルを作成します。 各項目は、

  • database
    • データベースにアクセスするためのDSN
  • schema_location
    • スキーマ定義ファイル(DB名.ini)の保存ディレクトリの絶対パス
  • class_location
    • DataObjectクラスを保存するディレクトリの絶対パス
  • class_prefix
    • DataObjectクラスにつけるプリフィクス名
  • debug
    • デバッグレベルの指定。数値を上げると内部で実行されているSQLなどを見ることができる。

となっています。

config.ini

[DB_DataObject]
database        = mysql://dbdo:[email protected]/address
schema_location = (ディレクトリまでの絶対パス)/dbdo/DataObjects
class_location  = (ディレクトリまでの絶対パス)/dbdo/DataObjects
class_prefix    = DataObjects_
debug = 0

createTables.phpの実行

次に、createTables.phpを実行します。 createTables.phpはCLI版のphpで実行する必要があります。

Windowsの場合(PHPをc:phpにインストールした場合)

c:phpcliphp c:phppearDBDataObjectcreateTables.php (ディレクトリまでの絶対パス)/dbdo/config.ini

Linuxの場合

/usr/local/bin/php /usr/local/lib/php/DB/DataObject/createTables.php (ディレクトリまでの絶対パス)/dbdo/config.ini

address.iniファイルとUser.phpが生成されていれば作業完了です。

DataObjectの使い方

インスタンスの作成

ではDataObjectを使ってみましょう。 まずはDataObjectのインスタンスを作成します。 以下のプログラムは自動生成を行うために設定したconfig.iniファイルを読み込み その情報を元にDB_DataObject::factoryメソッドを利用して userテーブルのDataObjectクラスを呼んでいます。

require_once('DB/DataObject.php');
$config = parse_ini_file( dirname(__FILE__).'/config.ini', true);
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$options = $config['DB_DataObject'];
if (!$options) {
    PEAR::raiseError("

ERROR: could not read ini file

", null, PEAR_ERROR_DIE);

    exit;
}
$User = DB_DataObject::factory('user');

データの登録

データの登録を行うには、 Userクラスにある、テーブルのカラムと同名のメンバ変数に値を入れた後、 insert()メソッドを実行するだけです。 具体的には以下のようになります。

require_once('DB/DataObject.php');
$config = parse_ini_file( dirname(__FILE__).'/config.ini', true);
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$options = $config['DB_DataObject'];
if (!$options) {
    PEAR::raiseError("

ERROR: could not read ini file

", null, PEAR_ERROR_DIE);

    exit;
}
$User = DB_DataObject::factory('user');
$User->name    = $_POST['name'];
$User->address = $_POST['address'];
$User->tel     = $_POST['tel'];
$User->insert();

これだけでDataObjectが自動的にSQLを生成し実行してくれます。 "INSERT INTO hogehoge"などと書く必要はありません。 更新(UPDATE)や削除(DELETE)についても 同じようにメンバに値を入れた後、update()やdelete()を呼ぶことで 更新や削除ができます。

データの検索と取得

データの検索は検索したい条件を事前に登録し、findメソッドを実行します。 検索条件は、メンバに値を入れることで、そのメンバと同じ値を持つレコードを 検索することが可能ですが、whereAddメソッドを利用してより細かい条件を 指定することも可能です。

findメソッドで検出したデータが複数ある場合は fetchメソッドを使用することで取得することができます。 具体的なコードは以下のようになります。

<?php
require_once('DB/DataObject.php');
$config = parse_ini_file( dirname(__FILE__).'/config.ini', true);
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$options = $config['DB_DataObject'];
if (!$options) {
    PEAR::raiseError("

ERROR: could not read ini file

", null, PEAR_ERROR_DIE);

    exit;
}
$q_field = addslashes($_POST['field']);
$q_value = addslashes($_POST['value']);
$where = "{$q_field} = '%{$q_value}%'";

$User = DB_DataObject::factory('user');
$User->whereAdd($where);
$User->find();
while ( $User->fetch() ) {

print <<<EOD
id:{$User->id}<br>
name:{$User->name}<br>
address:{$User->address}<br>
tel:{$User->tel}
EOD;

}
?>

まとめ

このようにDB_DataObjectを利用することでSQL文を書くことなく 直感的にデータベースを操作することができます。

また今回は単純なINSERT、SELECT程度しか行っていませんが実際には テーブルの結合などの複雑な操作も行うことができます。

PHPを使うようになって初めてSQL文を使うようになったという人や PHPコードの中に、おもむろにSQL文が書いてあるのがイヤだという方は 是非利用してみてはいかがでしょうか?

関連リンク

技術系関連

関連ページ