連載
» 2007年05月15日 00時00分 公開

DAOパターンですっきりコーディング!今から始める MySQL入門(6)(3/4 ページ)

[鶴長鎮一,@IT]

サンプルでDTO、DAOパターンを学ぶ(2)

 先ほど行ったサンプルのインストール作業で、MySQL側には$id、$name、$detail、$price、$qtyに相当するカラムがsample_db2データベースのitemテーブルに用意されています。

 idカラムに「auto_increment」属性を付与し、新規データが挿入されるごとに1つずつカウントアップされるようにしています。また、価格は消費税の計算など精度が要求されるため「int型」ではなく「decimal型」を使用しています。decimal(10,2)とは、けた数10けたでそのうち2けたが小数点以下になります。

 では、実際にitemテーブルを確認してみましょう。下記のコマンドを実行してください。

mysql> use sample_db2
mysql> desc item;
+-------+-----------------------+-----+----+--------+---------------+
| Field | Type                  | Null| Key| Default| Extra         |
+-------+-----------------------+-----+----+--------+---------------+
| id    | int(10) unsigned      | NO  | PRI| NULL   | auto_increment|
| name  | varchar(50)           | NO  | UNI|        |               |
| detail| varchar(200)          | NO  |    |        |               |
| price | decimal(10,2) unsigned| NO  |    |        |               |
| qty   | int(10) unsigned      | NO  |    |        |               |
+-------+-----------------------+-----+----+--------+---------------+

5 rows in set (0.02 sec)

 Itemクラスの各変数とitemテーブルの各カラムの値が連携できるよう、Itemクラスにデータベースを操作する機能を追加したいところですが、ここではデータベースに関連した機能を一まとめにした新たなItemDaoクラスを別途作成します。なぜなら、データベース操作部分を外部のPHPファイルに切り離すことで、コードの可読性を高めることができるからです。

 また、データベースへの接続や操作手順は類似しているため、各PHPファイルに個別に記述するより、一まとめにした方がデータベースのメンテナンス性が向上します。ItemDaoクラスの詳細は後ほど確認するとして、まずは参照可能なメソッドに着目します。

 以下、ItemDaoクラス外部から参照可能(public)なメソッドです。

  • getAllItem()
    itemテーブルに登録されている商品の情報を検索し、結果をItem型配列で受け取る
  • getItemById(文字列)
    検索したい商品をidで検索し、結果をItem型で受け取る
  • getItemByName(文字列)
    検索したい商品をnameで検索し、結果をItem型で受け取る
  • updateItem(Item型)
    引数で渡されたItem型インスタンスを基にitemテーブルを更新
  • insertItem(Item型)
    引数で渡されたItem型インスタンスを基にitemテーブルに挿入
  • deleteItem(Item型)
    引数で渡されたItem型インスタンスを基にitemテーブルから削除
  • deleteItemById(文字列)
    引数で渡された商品idを基にitemテーブルから削除

 ItemDaoクラスにおいて、外部からの参照が可能なのはメソッドのみで変数を参照することはできません。データは、Itemクラスを介して交換されます。

 では、商品アイテム検索をItem、ItemDaoクラスを使って実行するsample4-1.php(リスト4)を見ていきましょう。sample4-1.phpは、サンプルアーカイブ中のCommandLineディレクトリ以下にあります。

1  <?php
2
3  require_once("../Item.php");
4  require_once("../ItemDao.php");
5
6  $item_dao = new ItemDao();
7
8  #検索テスト idで検索
9  $item = $item_dao->getItemById('2');
10  if($item != null){
11    print $item;
12    print "\n";
13    #print "$item\n"; PHP5.2.0以上で使用可能
14  }else{
15    print "該当なし\n";
16  }
17
18  #検索テスト nameで検索
19  $item = $item_dao->getItemByName('有機野菜のApache風グリーンサラダ');
20  if($item != null){
21    print $item;
22    print "\n";
23    #print "$item\n"; PHP5.2.0以上で使用可能
24  }else{
25    print "該当なし\n";
26  }
27
28  $item = null;
29  $item_dao = null;
30
31  ?>
      リスト4 sample4-1.php

3、4行目

 require_onceでItem.php(リスト3)とItemDao.php(リスト5)ファイルを読み込みます。1つ上の階層のディレクトリに保存されているため相対パス「../」で指定します。

6行目

 ItemDaoクラスをインスタンス化($item_dao)します。

 8〜16行目が商品idによる検索、18〜26行目が商品名による検索例です。違いは9行目19行目、ItemDaoクラスに対し使用するメソッドが異なる点です。id検索では「getItemById()」、商品名検索では「getItemByName()」を使用しています。そして、検索結果をItemクラスのインスタンス「$item」で受け取り、10、20行目で検索結果の有無を確認し、11、21行目のprintでItemクラスの「__toString()」メソッドを呼び出し中身を表示させています。

 それでは、phpコマンドでsample4-1.php(リスト4)を実行してみましょう。

# php -f ./sample4-1.php
該当なし
1       有機野菜のApache風グリーンサラダ...省略

 sample4-1.php(リスト4)には、MySQLサーバへの接続手続きやSQLクエリーといったデータベース操作に必要な記述はありません。ItemDaoクラスのメソッドを実行し、Itemクラスを介してデータを受け渡しするだけです。

 データベース操作は、ItemDaoクラス内に隠ぺいされています。そのため、sample4-1.php(リスト4)ではどのようなデータベース操作が行われているか関知する必要はありません。

 データベースの操作を一まとめにしたことで、sample4-1.php(リスト4)は見通しの良い簡潔なコードに仕上がっていることが分かります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。