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

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

[鶴長鎮一,@IT]

サンプルのインストールと実行

 続いて、MySQLサーバと連携(データベースへのアクセスが発生)するサンプルを使って解説します。

 sample4のソースファイルをダウンロードして、Apacheのドキュメントルートに展開してみましょう。

サンプルダウンロード:

sample4のtarアーカイブ


# cd /var/www/html/
(ソースからインストールした場合は/usr/local/apache2/htdocs/)
# tar xvfz /..pathto../sample4.tgz
# cd sample4

 sample4ディレクトリの下には、次のようなファイルが展開されます。

/var/www/html/sample4
(Apacheをソースからインストールした場合/usr/local/apache2/htdocs/)
┣ CommandLine
┃   ┣ Test.php
┃   ┣ TestClass.php
┃   ┣ sample4-1.php
┃   ┣ sample4-2.php
┃   ┣ sample4-3.php
┃   ┣ sample4-4.php
┃   ┗ sample4.php
┣ Item.php
┣ ItemDao.php
┣ displayStock.php
┣ sample4_db.sql
┗ updateStock.php

 sample4ディレクトリ直下には、簡易在庫管理システムのためのPHPファイルがあります。また、sample4/CommandLineの下にはコマンドラインphpで使用するサンプルファイルがあります。ちなみに先ほど使用したTest.php(リスト2)やTestClass.php(リスト1)もここに収録されています。

 まず、「sample4_db.sql」ファイルを使用しMySQLの準備を行います。第5回までの作業で、MySQLサーバが起動しているはずです。起動していない場合は、前回までの記事を参考にして作業を行ってください。

 今回使用するデータベース「sample_db2」を新規に作成し、sample4.tgzに含まれるsample_db2.sqlファイルを使って、テーブルの作成、サンプルデータの挿入を行います。最後にPHPスクリプトからデータベースが操作できるよう権限設定を行います。

MySQLサーバ側の準備と確認

 下記のようにサンプルDB、テーブルの作成、サンプルデータの挿入を実行します。

# mysqladmin -uroot -p create sample_db2 ←データベースの作成
Enter password: ←パスワードの入力
(rootにパスワードが設定されていない場合は「-p」は不要)

# mysql -uroot -p sample_db2 < sample_db2.sql ←テーブルの作成、サンプルデータの挿入

 続いて、作成したテーブルの確認を行います。

# mysql -uroot -p sample_db2
mysql> SHOW TABLES;
+----------------------+
| Tables_in_sample4_db |
+----------------------+
| item                 | 
+----------------------+
1 row in set (0.00 sec)

 最後に、権限の設定(ユーザー名:php、パスワード:password)を行います。

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON sample_db2.* TO 'php'@'localhost' IDENTIFIED BY 'password';
mysql> quit
      Apache HTTPDサーバ上でMySQLを起動している場合

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON sample_db2.* TO 'php'@'Apache HTTPDサーバのIPアドレス' IDENTIFIED BY 'password'; mysql> quit
      Apache HTTPDサーバとMySQLサーバが別々に用意されている場合

 さらに、作業ディレクトリを移動して、サンプルPHPスクリプトsample4.phpを実行し、インストールが完了していることを確認します。

# cd CommandLine
# php -f ./sample4.php

######################アイテム一覧#########################
-----------------------------------------------------------
1       有機野菜のApache風グリーンサラダ        有機野菜の....省略

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

 ここでは、DTO、DAOパターンを使って、データベースアクセスに関連する操作をItemDaoというクラスに集約する例を紹介します。

 DAOパターンを利用することで、データベースアクセスのような煩雑な手順を本来必要な処理から切り離すことができ、PHPコードを簡素化することができます。

 先ほどのTestClass.php(リスト1)では、$idという変数のみを扱いましたが、今回作成するItem.php(リスト3)では、在庫管理を意識してもう少し変数を増やしてあります。それに伴い、セッター、ゲッターメソッドの数も増えていることに注目してください。

1  <?php
2  class Item {
3
4    //プロパティー
5    private $id = "";
6    private $name = "";
7    private $detail = "";
8    private $price = "";
9    private $qty = "";
10
11    //echo()やprint()で文字列への変換が必要なときに
呼び出されるメソッド
12    //各プロパティーをタブ区切りで表示
13    public function __toString(){
14      return (string)($this->id . "\t" . $this->name . "\t" .
 $this->detail . "\t" . $this->price . "\t" .$this->qty);
15    }
16
17    //idプロパティのゲッター
18    public function getId(){
19      return $this->id;
20    }
21    //idプロパティのセッター
22    public function setId($id){
23      $this->id = $id;
24    }
25
26    //nameプロパティのゲッター
27    public function getName(){
28      return $this->name;
29    }
30    //nameプロパティのセッター
31    public function setName($name){
32      $this->name = $name;
33    }
34
35    //detailプロパティのゲッター
36    public function getDetail(){
37      return $this->detail;
38    }
39    //detailプロパティのセッター
40    public function setDetail($detail){
41      $this->detail = $detail;
42    }
43
44    //priceプロパティのゲッター
45    public function getPrice(){
46      return $this->price;
47    }
48    //priceプロパティのセッター
49    public function setPrice($price){
50      $this->price = $price;
51    }
52
53    //qtyプロパティのゲッター
54    public function getQty(){
55      return $this->qty;
56    }
57    //qtyプロパティのセッター
58    public function setQty($qty){
59      $this->qty = $qty;
60    }
61  }
62  ?>
      リスト3 Item.php

5〜9行目

 在庫管理を意識して、$name(商品名)、$detail(商品説明)、$price(価格)、$qty(在庫数)といった変数を追加しています。

17〜60行目

 変数の追加に伴い、それに対応したセッター、ゲッターメソッドを用意します。

13〜15行目

 TestClassではコンストラクタ、デストラクタを用意しましたが、必要がなければあえて用意する必要はありません。echoやprintで文字列への変換が必要なときには、タブ区切りで変数値を出力するようにします。

 なお、$idや$nameなど文字列を直接扱うよう処理を書くこともできます。しかし、クラス間でデータを交換する際、データの受け渡しを行うItemクラスのようなDTO(Data Transfer Object)を用意した方が、各変数のカプセル化やデータ要素に変更が発生した際の柔軟さなどで多くのメリットを享受できます。

図1 Itemクラスを使用する 図1 Itemクラスを使用する

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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