PREPARATION
受験対策

OSS-DB入門

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

これまでの回を通して、PostgreSQLの基本を学んできました。
読者のみなさんの多くが、実際には、データベースシステムを単独で利用するのではなく、何らかのシステム/アプリケーションのバックエンドで使うのではないでしょうか。
そこで今回はその実例のサンプルとして、データベースを使った簡単なWebアプリケーションについて見てみることにしましょう。

データベースに格納されているデータを画面に一覧表示してみます。

データの準備

データは第3回から第5回で作成した商品仕入れ情報を使います。
第3回 データベースとテーブルの作成
第4回 データベースの正規化
第5回 SQL基礎 I

仕入れ情報であるordersというテーブルがあると思います。
このテーブルには各注文を一意に識別できるカラムがないので、order_noという名称のカラムを付与し注文番号として使用できるようにしておきます。 
以下のSQLを実行してください。

ALTER TABLE orders ADD COLUMN order_no serial UNIQUE NOT NULL;

連番型(serial)は「第3回 データベースとテーブルの作成」でも出てきました。「オススメ!OSS-DB情報 第6回 シーケンス」も併せてご覧ください。

※ordersテーブルには、name(商品名), farm_name(仕入先名), arrival_date(入荷日)の3つのカラムからなる主キーが存在していますが、もし主キーがない場合には、以下のSQLのように連番かつ主キーとなるカラムを追加してもよいでしょう。
ALTER TABLE orders ADD COLUMN id serial CONSTRAINT orders_pkey PRIMARY KEY(id);

ApacheとPHPのインストール

PHP
PHPはWebアプリケーションを作る際によく用いられる言語です。PostgreSQLはPHPをサポートしており、他にもC/C++, ODBC, JDBC, Perlといった様々なプログラムインタフェースをサポートしています。ここでは、PHP5を使うことにします。

Apache
Webサーバーとして広く使われているソフトウェアです。ここでは、Apache2系のバージョンを使うことにします。
ApacheとPHPをインストールするにはコマンドラインで以下を実行します。(OSのスーパーユーザーで行います)
$ sudo apt-get install apache2 php5 php5-pgsql

※基本的なプログラミングに関する説明、PHP, Apache, HTMLなどの言語やソフトウェアに関する詳しい説明は割愛します。
PostgreSQLを使ったWebアプリケーションの全体像を掴んでいただければと思います。

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

sampleApplication1.tar.gz

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

/var/www/ ディレクトリはドキュメントルートと呼ばれ、HTMLファイルなどのWebコンテンツを配置することで、Webサイト/アプリケーションとして動作します。

/var/www/sample/ というディレクトリができていると思います。
Webブラウザを起動して
http://localhost/sample/
にアクセスしてみましょう。
以下のようなページが表示されたでしょうか。

もし、表示されなかった場合も、以降の説明を読み進めてみてください。

サンプルアプリケーション
/var/www/sample/ のディレクトリ、ファイル構成は以下の通りです。
|― index.php ・・・・・・ トップページとなるファイル
|― common/ ・・・・・・ アプリケーションで共通で使う設定や関数を記述したクラスをまとめておく
|― config.php ・・・・・・ データベース接続設定を記述
|― dbAccess.php ・・・・・・ データベースに接続して操作を行う処理を記述
|― css/ ・・・・・・ CSS(Cascade Style Sheet)ファイルを格納
|― base.css ・・・・・・ index.phpが読み込むCSSファイル

まずは、index.phpを見てみましょう。
このファイルでは、HTMLにPHPのコードを埋め込んでいます。1行目から19行目までがHTMLで、21行目からPHPの処理になっています。
21行目で共通クラスをインクルードし、インクルードしたクラスを使用できるように25行目でインスタンスを作成しています。
28行目で、DbAccessクラスのgetAllOrdersという関数を呼び出し、$result変数に取得した結果を格納しています。
データベースに接続した際にエラーが発生したら、エラー処理を行いましょう。ここではエラーメッセージを表示してユーザーに通知しています(31行目から34行目)

ここでいったんindex.phpを閉じて、dbAccess.phpを見てみます。
common/dbAccess.phpを開いてください。
3行目で、config.phpをインクルードしていますので、config.phpを見てみることにします。common/config.phpを開いてください。
このファイルでは、データベース接続情報を定義しています。データベース接続情報をこのファイルに集約するようにしておけば、実行環境で接続情報が異なる場合でも変更は1ファイルのみで済みます。また、先ほど ブラウザから http://localhost/sample/ にアクセスしてみたかと思いますが、表示ができなかった場合の原因はこの接続情報が正しくないというのがほとんどです。

もう一度、dbAccess.phpに戻りましょう。
15行目から22行目までがコンストラクタです。
ここでconfig.phpで定義した内容を取得してグローバル変数に格納しています。これでデータベース接続情報を以降の処理で使いまわすことができます。
そして、27行目以降のgetAllOrders関数で仕入れ情報を取得しています。

index.phpに戻ります。
28行目で全仕入れ情報を取得し、変数$resultにセットしました。
37行目で、pg_fetch_array関数を使って結果を一件ずつ取り出して変数$rowにセット、さらに42,48,54,60,66行目で各カラムの値を取得しています。

まとめ

PHPには”pg_”で始まる関数が用意されていて、これらの関数を使うことによりPostgreSQLにアクセスすることができます。
例えば、

pg_connect:DB接続情報を引数として、DBに接続する処理をします(dbAccess.php 30行目)

pg_query:接続オブジェクトと実行したいSQL文を引数にして、クエリーを発行します(dbAccess.php 40行目)

pg_num_rows:pg_queryを実行して得られた結果の件数を取得する(dbAccess.php 43行目)

pg_close:DB接続を切断する(dbAccess.php 34, 41行目)

pg_fetch_array:結果を一行ずつ取得する(index.php 37行目)

他にもPHPのPostgreSQL関数は多数あります。
http://php.net/manual/ja/ref.pgsql.php

しかし、基本的な流れは

・データベースに接続

・SQLの実行

・結果取得

であり、いずれの処理でもほぼ変わりはありません。

データベースにアクセスしてデータを表示するまでを駆け足で追ってみました。
このWebアプリケーションは極々簡単なものですが、pg_queryにセットするSQLをより複雑なものにしたりといった工夫や改善をすることができると思います。
次回はこのWebアプリケーションを元にして、更新、削除をしてみたいと思います。

執筆:
村上 恵 氏(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

関連資格