続いて、MySQLサーバと連携(データベースへのアクセスが発生)するサンプルを使って解説します。
sample4のソースファイルをダウンロードして、Apacheのドキュメントルートに展開してみましょう。
# 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スクリプトからデータベースが操作できるよう権限設定を行います。
下記のようにサンプル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パターンを使って、データベースアクセスに関連する操作を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クラスを使用する