PREPARATION
受験対策

OSS-DB入門

第12回 Webアプリケーションとの連携(後編)

今回も前回と同じく、データベースを使ったWebアプリケーションについて見ていきます。

前回はデータベースに登録されている仕入れ情報を一覧表示したところまででした。
今回は、前回までのアプリケーションに、データの登録、更新、削除、検索機能を追加したものについて見ていきましょう。

サンプルアプリケーションの配置

前回同様、まずはサンプルコードのダウンロードと配置をして、アプリケーションを動かしつつ、その処理がどのようになっているかソースを見ながら流れを追っていくことにします。

sampleApplication2.tar.gz

上記から、sampleApplication2.tar.gz をダウンロードしてください。
このファイルを /var/www/ に置きます。このファイルは複数のファイルをアーカイブし圧縮したファイルですので、以下を実行して解凍・展開します。
$ cd /var/www
$ sudo tar zxvf sampleApplication2.tar.gz

/var/www/sample2/ というディレクトリができていると思いますので、Webブラウザを起動し
http://localhost/sample2/
にアクセスしてみてください。
前回と基本は同じですが、ボタンが幾つか追加されています。

図1. トップページ

この画面の表示するためのファイル index.phpを見てみましょう。
(青い点線の部分は途中を省略しています)

12行目から21行目は、「新規登録」(図1. ①)「検索」(図1. ②)ボタンを表示するためのテーブルです。
85行目は更新ボタン、86行目は削除ボタンです。
(30行目に<th></th>が前回のサンプルに対し追加されています。これがあることで、84行目から87行目の"列"を表示できます。)

登録 ― INSERT

新たな仕入れ情報を登録する機能です。
index.phpの15行目
<input type="button" value="新規登録" onclick="location.href='page/show_register.php'"/>
により、「新規登録」と表示されているボタンをクリックすることで、
sample2/page/show_register.php
に遷移することがわかります。
それでは、トップページの「新規登録」ボタンをクリックしてみましょう。画面が変わり、登録情報を入力するためのフィールドが表示されます。
入荷日と入荷数はユーザーに数字を入力してもらうことにし、商品と仕入先は予めデータベースに存在するものから選んでもらうようプルダウンメニューにしました。
また、必須入力ということを示すために、項目名の後ろにアスタリスクをつけています。

それでは、show_register.php を見てみることにします。
18行目から21行目は、index.phpと同様、必要な定義・クラスをロードして使えるようにするためのコードです。
23行目で登録されている商品を取得しています。
dbAccess.phpの76行目から100行目がその処理の内容です。
前回の記事で触れた処理と同様に、まずデータベースに接続し(82行目)、SQLを実行し(92行目)、実行して得られた結果を返却(99行目)しています。
show_register.phpに戻ります。
28行目から32行目で取得した商品をプルダウンメニューにセットしています。34行目から43行目で、仕入先について商品と同様の処理を行っています。
45行目から65行目が、プルダウンメニューとテキスト入力フィールドを表示するコードです。
画面で入力した後は、「登録」ボタンをクリックすることで登録処理を行いますが、そのために14行目で、処理の定義をしておきます。
14行目から78行目のformタグで囲まれた部分の入力(プルダウンでの選択も含む)情報をonsubmitで、つまり、68行目のtype="submit"のボタンがクリックされたタイミングで送信することを意味します。
送信方法はPOSTというもので、HTTP通信でリクエストを送る方法の一つです。
onsubmitに"return chk(this)"がセットされていますが、これは、6行目でインクルードしたErrorCheck.jsというファイルにある、入力チェック(バリデーションと呼ばれます)のためのJavaScriptのchk()関数を実行し戻り値がtrue、つまり、入力値が適切ならば、exec_register.phpを実行します。

・POSTメソッド、GETメソッド
HTTPメソッドはいくつかありますが、中でもPOST, GETがよく使われます。
URLの最後に ?key1=value1&key2=value2 というのが付いているのを見たことはないでしょうか。これはGETメソッドと呼ばれるリクエスト方法であり、パラメータ名と値をイコールで繋いで情報をURLに付けて送信するものです。一方、POSTメソッドは、リクエストボディと呼ばれるものにメッセージボティを格納して情報を送信します。
一般的に、情報量が少ないときはGETを、多い場合はPOSTを使用します。

・ライブラリ・フレームワーク
バリデーションを行う処理をErrorCheck.jsに記述しましたが、項目数が増えた場合や、同じような処理を何度も行う場合などにこうした処理を一から全て記述していては大変手間です。このような場合にはライブラリ・フレームワークの便利なしくみを利用すると簡単に実装ができます。show_register2.phpというファイルがありますが、その中でバリデーションの処理を実装する手間を省くためにjQueryというJavaScriptライブラリを使用しています。また、PHPにもPEARなど多くのライブラリがあります。

新規登録処理の続きを見てみましょう。
以下は、exec_register.phpです。
このコードにはHTMLタグが含まれていませんので、ページとしては表示されません。
show_register.phpからPOSTメソッドで送られてきた値を6行目から9行目で取得しています。
取得した値を引数に登録、つまり、INSERTを実行します。
dbAccess.phpの102行目から123行目がその処理の内容です。
118行目で引数の値をSQL文に付加して、INSERT処理を行っています。

exec_register.phpに戻ります。
登録が成功すると、トップページに戻ります。
一覧の最後に登録したレコードが表示されているでしょうか。

更新 ― UPDATE

登録済みの仕入れ情報の変更、更新を行う機能です。
新規登録と処理は似ていますが、既に登録されているレコードを更新するため、そのレコードを一意に識別できるorder_noを「更新」ボタンをクリック後の遷移先であるshow_update.phpにGETメソッドで送信しています。
以下の画面のURLの最後に"?no=364"というのがあります。これによりshow_update.phpで、GETメソッドによって送信された値を取得することができます。
その後の処理は、登録と同じような処理をしますが、実行するSQLにWHEREを付けて、更新対象のレコードを一つに絞ります。是非、ソースコードを追って確かめてみて下さい。

削除 ― DELETE

登録済みの仕入れ情報を削除する機能です。
これまでは、show_*.php → exec_*.php と遷移しましたが、削除の場合はshow_delete.phpというファイルはなく「削除」ボタンをクリックすると、exec_delete.phpに遷移します。
index.phpの86行目を見てみましょう。
exec_delete.phpに遷移する前に、削除確認のJavaScriptの関数もここに記述しています。確認ダイアログで「OK」をクリックすればexec_delete.phpへ進み、「キャンセル」をクリックすればページを移動しません。
その後の処理の流れは更新と同様ですが、実行するSQLがDELETE文になります。

検索 ― SELECT

条件を指定して仕入れ情報を検索する機能です。
検索ボタンを押すと、検索条件を入力するフィールドが表示されます。この画面は、新規登録時に表示される画面とよく似ていますが、商品、仕入先が未選択になっていること、入荷日、入荷数はそれぞれ入力フィールドを2つ設け、範囲を指定することができるようになっている点が異なります。
show_search.php で入力された検索条件を exec_search.php に送る際は、パラメータの数が多いのでPOSTメソッドを使っています。
exec_search.phpの47行目で、dbAccess.phpのsearchOrderという関数を呼んでいます。ここでの処理は少々厄介です。指定された検索条件に従ってWHERE句を作成していますが、WHERE句の最初ならまずWHEREを、そうでなければANDを文字列に追加して...ということをやっています。こういった時に先ほど触れたフレームワークを使用すると、簡単に見やすい、すなわち、メンテナンスしやすいコードを記述することができます。
検索結果が得られたら、画面に一覧表示します。
条件を変えて色々検索をしてみましょう。

・SQLインジェクション
データベースと連動するWebシステムでは、パラメータを受け取ってSQLを実行することが多いですが、このときSQL文の断片として解釈できるパラメータを含めることで、不正にデータベースの内容を変えたり、本来アクセスしてはならない情報を取得することができてしまうことがあります。これを利用して攻撃することをSQLインジェクションといいます。
例えば、以下のようにURLの後ろにSQLをつけてリクエストを送信しまうことも場合によってはできてしまいます。
http://localhost/sample2/page/show_update.php?no=1;update orders set order_num=999 where order_no=1;select * from orders where order_no=1
(※実行できてしまうと、ordersテーブルの情報が見えてしまうだけでなく、order_numカラムの値が一部書き換わってしまいますので注意してください!)
SQLインジェクション対策として、入力チェックとサニタイジング(タグやSQLで使われる特殊文字を変換して無害化すること)を行うことが重要です。

2回にわたってデータベースをつかったサンプルアプリケーションを見てきました。
これまでの記事で取り上げたSQLの復習と、Webシステムについて簡単に説明をしてきましたが、ここで触れた内容は非常に入門的なものですので、実際にシステムを構築する場合は、セキュリティ、冗長化、負荷分散、障害対応など考慮すべきことが多々あります。これまでの記事では、
第2回 ユーザー管理とセキュリティ

第8回 バックアップ・リストア

第9回 パフォーマンス・チューニング(前編)

第10回 パフォーマンス・チューニング(後編)

他にも、オススメ!OSS-DB情報の
第4回 バックアップとリストア、リカバリ

第10回 レプリケーションについて(その1) 

第11回 レプリケーションについて(その2)

第14回 トランザクションログ

第16回 権限管理

などを参考にしてください。

今回で、OSS-DB入門は最終回です。
これまで読んでくださってありがとうございました。
これからもOSS-DBに触れ、学び、活用し、一緒にOSS-DBのプロフェッショナルを目指しましょう!

執筆:
村上 恵 氏(OSS-DB Silver認定者)株式会社オークニーにて、PostGISを含むFOSS4G(Free Open Source Software for Geospatial)ソフトウェアを軸としたアプリケーションやサービスの開発に従事。

岡林 遼 氏

アドバイザー:
森 亮 氏 株式会社オークニー代表取締役
2002年にオークニーを設立し、代表取締役に就任。マッピング・ GIS・LBS・ITS関連プロジェクトのビジネスコンサルティングを経て、現在は会社経営の傍ら、『入門Webマッピング』(Tyler Mitchell原著;オライリー・ジャパン発行)の翻訳、Open Source Geospatial財団日本支部の代表者を務めるなど、FOSS4G(オープンソース地理空間ソフトウェア)の普及活動に取り組んでいる。

監修:
松田 神一

LPI-Japan
Platinum Sponsors

関連資格