サンプルでDTO、DAOパターンを学ぶ(3)
では、データベース操作を一まとめにしたItemDaoクラスを見てみましょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
外部から参照不可なpublicメソッド、内部からのみ参照可能なprivateメソッドについては先ほど紹介しました。なお、内部から内部のメソッドや変数を呼び出す場合は「$this->」を使用します。
以下、ItemDaoクラス内部からのみ参照可能なメソッド(private)です。
- connect()
MySQLサーバに接続し、mysqliインスタンスを生成。主に__construct()メソッドから実行される - disconnect()
MySQLサーバと接続されているか(mysqliインスタンスが生成されているか)どうかを確認し、接続されていれば切断。主に__destruct()メソッドから実行される - getItem(文字列)
SQLクエリーを引数に該当する商品アイテムをitemテーブルから検索し、結果をItem型で引き渡す。getItemById()、getItemByName()メソッドは引き渡された商品idや商品名をSQLクエリーに変換し、ItemDaoクラス内でgetItem()を実行
注:MySQLサーバの接続手順、挿入、抽出などの手続きは第5回を参考のこと。
基本的な操作は、第5回で紹介したとおりです。ただし、今回はデータの引き渡しにItemクラスを使用しています。MySQLサーバからデータを抽出した後、Itemクラスのセッターメソッドを使って変数をセット(40〜46行目、61〜66行目)し、Itemクラスを受け取ったクラスはゲッターメソッドを使って各変数を取得します。
なお、第5回でMySQLサーバからデータを抽出する際、「fetch_array(MYSQLI_NUM)」を使用し、「$row[0]、$row[1]……」のように数字を添え字にカラムデータを取得しました。しかし、今回のItemDao.php(リスト5)では「fetch_array(MYSQLI_ASSOC)」を使用し(39、60行目)、「$row["id"]、$row["name"]……」のようにカラム名で値を取得しています。
itemテーブルから該当データを検索するgetItem()メソッドは、SQLクエリーを引数に取りますが、直接外部から使用されることはありません。getItemById()やgetItemByName()メソッドを通してのみ実行されます。
54行目の「is_null()」では、mysqliインスタンスの有無を確認します。mysqliがnullならMySQLサーバと接続されていないと判断して、connect()メソッドで接続を行います。
検索結果が1件以上あれば(59行目)、Itemクラスにitemテーブルから抽出した値をセットします(61〜66行目)。なお、getItem()では指定されたSQLに対し、2件以上該当があっても最初の1件のみが引き渡されます。
updateItem()、insertItem()、deleteItem()は、Itemクラスを引数に取ります。Itemクラスから各変数を取り出して処理を行います。更新や削除では、該当データを何らかの手段で特定する必要がありますが、商品idが不変なため、idをWHERE句の条件に指定し処理を行っています。それぞれのメソッドはSQLクエリーを作成、実行します。結果があれば受け取り、Item型にして戻しています。
検索以外の「挿入」「更新」「削除」の実行例は、それぞれsample4ソースファイルの「sample4-2.php〜sample4-4.php」で確認できます(下記、参照)。実行は、コマンドラインphpで行います。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
なお、itemテーブルから全商品アイテムを検索するgetAllItem()メソッドでは、Itemクラスを複数戻す必要があるため、配列arrayを利用しています。ItemDao.php(リスト5)の37〜49行目のようにすれば、配列arrayにItem型を格納することができます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
また、取り出す際は、sampe4.phpの10〜15行目のような処理を行います。getAllItem()メソッドの使用例は、以下のとおりです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
次回は、今回解説したItemクラスやItemDaoクラスを実際に「在庫管理システム」に組み込み、在庫管理システム本体の処理がいかに簡素化されるかを確認してみましょう。 (次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.