連載
» 2007年06月07日 00時00分 公開

今から始める MySQL入門(7):DTO・DAOパターンのメリットを体験しよう (2/2)

[鶴長鎮一,@IT]
前のページへ 1|2       

簡易在庫管理システムの作成(2)

簡易在庫システム − updateStock.php

 続いて、updateStock.phpのソースコードをのぞいてみましょう。

1   <?php
2
3   require_once("Item.php");
4   require_once("ItemDao.php");
5
6   $item = new Item();
7   $item_dao = new ItemDao();
8
9   #フォーム値の取得。addslashes()でSQLインジェクションを防ぐ
10  $item->setId(addslashes($_POST["id"]));
11  $item->setName(addslashes($_POST["name"]));
12  $item->setDetail(addslashes($_POST["detail"]));
13  $item->setPrice(addslashes($_POST["price"]));
14  $item->setQty(addslashes($_POST["qty"]));
15
16  switch($_POST["button"]){          #ボタンのラベルで条件分岐
17    case "UPDATE":                   #更新処理
18      $item_dao->updateItem($item);
19      display("更新しました");
20      break;
21    case "INSERT":                   #挿入処理
22      $item_dao->insertItem($item);
23      display("一件追加しました");
24      break;
25    case "DELETE":                   #削除処理
26      $item_dao->deleteItem($item);
27      display("削除しました");
28      break;
29    default:                         #それ以外
30      display("指定された処理が不正です");
31      break;
32  }
33
34  #引き渡されたメッセージをHTMLで表示
35  function display($message){
36    print <<<EOS
37  <HTML lang="ja">
38  <HEAD>
39  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
40  <title>在庫管理:データ更新</title>
41  </HEAD>
42
43  <BODY TEXT="black" BGCOLOR="white">
44  <!-- タイトル -->
45  <div align="center"><font size="5"><b>在庫管理 </b></font><font size="3">データ更新</b><br></font>
46  </div>
47  <hr width="600" align="center">
48
49  <!-- メッセージ -->
50  <p>
51  <div align="center"><font size=+2>$message</font><p>
52  <a href=displayStock.php><font size=+1>在庫一覧へ戻る</font></a>
53  </div><p>
54
55  <!-- フッター -->
56  <hr width="600" align="center">
57  <table width="600" border="0" align="center">
58  <tr>
59  <td align="right"><font size="2">@IT LinuxSquare「今から始める MySQL入門」<br>
60  2007/04/10作成</font></td>
61  </tr>
62  </table>
63
64  </BODY>
65  </HTML>
66  EOS;
67  }
68
69  ?>
      リスト2 updateStock.php

 3〜32行目がメインの処理です。35〜67行目でdisplay()関数を定義しています。display()で引数の文字列をブラウザに表示します。更新/削除/挿入どれも結果の表示は似ているため、メッセージだけ交換できるものを用意することで、表示処理を共通化します。

 それでは、メインの処理を詳しく見ていきましょう。

3、4行目

 Item.php・ItemDao.phpファイルをrequire_onceで読み込みます。

6、7行目

 Itemクラス、ItemDaoクラスを生成(インスタンス化)します。

10〜14行目

 フォームの値を取り出します、その際、SQLクエリーで特別な意味を持つ文字をaddslashes()でエスケープ処理し、悪意のあるSQLクエリーが作成されないようにします(連載第5回「MySQLの基礎を学ぼう [サンプル開発編]」)。

16〜32行目

 buttonの値($_POST["button"])で処理を分岐し実行します。

17〜20行目

 更新処理を行います。

21〜24行目

 挿入処理を行います。

25〜28行目

 削除処理を行います。

 それぞれの処理がItemDaoクラスを使用することで、簡素化されていることが分かります(18、22、26行目)。後は、処理が終了したことをdisplay()関数で表示します。なお、MySQLサーバに接続できない場合のみエラー処理が用意されています。そのほかのエラーについては、特に設けられていません(コラム2参照)

コラム2 MySQLのエラーとワーニング

MySQLのデフォルトでは、型違いのデータを挿入した場合でもエラーにはなりません。例えば、sample_db2のitemテーブルで次のようなSQLクエリーを実行します。

mysql> INSERT INTO item VALUES ('100',"商品名","商品詳細","価格",12);
Query OK, 1 row affected, 1 warning (0.01 sec)

priceカラムはDECIMAL型のため、文字列の挿入はできずエラーになることが予想されます。ところが、調べてみると次のように挿入が成功していることが確認できます。

mysql> SELECT * FROM item WHERE id = '100';
+-----+-----------+--------------+-------+-----+
| id  | name      | detail       | price | qty |
+-----+-----------+--------------+-------+-----+
| 100 | 商品名    | 商品詳細     |  0.00 |  12 |
+-----+-----------+--------------+-------+-----+
1 row in set (0.00 sec)

priceカラムは0になっていますが、エラーにはなっていません。先ほどのSQLクエリー実行後のメッセージを再度確認すると「1 warning」と表示されています。それでは警告内容を表示させてみましょう。

mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------------
----------------+
| Level   | Code | Message                                       
                |
+---------+------+-----------------------------------------------
----------------+
| Warning | 1366 | Incorrect decimal value: '価格' for column
 'price' at row 1   |
+---------+------+-----------------------------------------------
----------------+
1 row in set (0.00 sec)

DECIMAL型に対して異なるデータ型が挿入されたことが警告されています。このように、エラーに出ない警告は「SHOW WARNINGS」クエリーで別途拾う必要があります。こうした“型違い”をエラーとして扱いたい場合は、MySQLサーバ側でストリクトモードを「TRADITIONAL」などに変更します。そのほかのモードについては、MySQL ABの「MySQL 5.0 リファレンスマニュアル」を参考にしてください。

mysql> set sql_mode="TRADITIONAL";
mysql> INSERT INTO item VALUES ('101',"商品名","商品詳細","価格",12);
ERROR 1366 (HY000): Incorrect decimal value: '価格' for column 'price' at row 1

関連リンク:

MySQL AB「MySQL 5.0 リファレンスマニュアル」
http://dev.mysql.com/doc/refman/5.0/en/precision-math-expressions.html


動作確認

 動作確認は、ブラウザで行います。ブラウザで「http://サーバ/sample4/displayStock.php」にアクセスし、在庫一覧が表示されることを確認します。

画面1 displayStock.phpの表示 画面1 displayStock.phpの表示

 サンプルでは1件だけ商品が登録されています。在庫一覧画面の確認ができたところで、適当な商品の情報を入力し、UPDATEやINSERTボタンをクリックし処理を確認してみましょう。

画面2 updateStock.phpの表示 画面2 updateStock.phpの表示

 今回は、簡易在庫管理システムを通してDTO・DAOパターンのメリットを確認できました。次回は、これまで作成した在庫管理システムとオンラインストアを統合させてみます。 (次回に続く)


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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