実践編:データベースアプリケーションの作成 前編:PHP4で作るWeb-DBシステム(4)(3/3 ページ)
PHP4プログラミングについてはひととおり理解できたと思う。しかし、まとまった本格的なアプリケーションを開発するとなると話は別で、言語仕様を学んだだけでは十分とはいえない。そこで、最後の仕上げとして本格的なアプリケーションの作成を行う。作業の進め方、プログラミングの考え方についても学んでほしい。
データベースとの接続
当然のことながら、データベースに接続しなければデータベースに対する操作は一切行えません。まずはデータベースへの接続方法から説明します。
Webアプリケーションの場合、HTTPというステートレスプロトコルを使う都合上、データベースへの接続は各プログラムで必要になります。この点が、一度接続してしまえばつなぎっぱなしにできるクライアント/サーバアプリケーションと、Webアプリケーションの大きな違いです。今回作成するプログラム(ページ)は、すべてデータベースと連動しますので、全ページに接続関数を組み込む必要があります。
■Oracleの場合
Oracleの場合、データベースへの接続は「ocilogon関数」を利用します。この関数は、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のように、接続するデータベースとユーザーを指定します。関数の返り値として、接続IDが返されるので、そのIDを変数に受け取るようにしておきます(リスト3)。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
この接続IDは、接続後に発行する各種の命令(関数)に引数として引き渡され、どの接続に対して命令を実行するのかを指定するのに使われます。従って、複数の接続を行う必要がある場合でも、接続IDによって命令の発行先を切り替えられるのです。また、ここで接続文字列を指定することによって、Webサーバとは別のサーバで稼働しているデータベースへの接続も可能です。
実際に接続を確認する方法ですが、環境に合わせてリスト3の内容を書き換え、そのままブラウザで実行してみるといいでしょう。この時点で問題があればエラーが表示されますし、問題なければ真っ白のページが表示されます。エラーが表示された場合はそのエラーの内容を確認して対処してください。
この段階でありがちなエラーは、概ね以下のとおりです。
- ユーザー名やパスワードに間違いがある
- 無効な接続文字列を指定している
- OracleやNet8リスナーが起動していない
- Apacheが起動していない
- 環境の設定に間違いがある
これらを順に確認していけば、大抵の問題は解決すると思います。Oracleに接続可能かどうか、設定に間違いがないかどうかは、SQL*PLUSやTNSPINGを使って確認してください。
■PostgreSQLの場合
PostgreSQLの場合、データベースへの接続に「pg_Connect関数」(表3)を利用します。pg_Connect関数の構文についてはリスト4を参照してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
この関数にはさまざな利用法があるのですが、最も手っ取り早いのは、リスト4のようにサーバとデータベースを指定する方法です。このとき、サーバ(host)とともにポート番号(port)が必要ですが、これはPostgreSQL起動時に決定されています。特に設定を変更していなければポート番号は5432ですので、これを指定します。
プログラムとしては、これでPostgreSQLに接続できるのですが、このままでは実際の接続はできません。なぜなら、PostgreSQL側のセキュリティの設定で、ほかのホスト(コンピュータ)からの接続を拒否しているからです。この設定ファイルはpg_hba.confという名前で、/usr/local/pgsql/dataなどに作成されています。
このファイルは、データベース所有者に読み取り権限しか与えていませんので、ファイルの権限を変更して編集します。編集する際は、リスト5を参考に、最終行にアクセスを許可するホストを追加します。ファイルの冒頭にも説明書き(英語)がありますが、左から順に「ホストのタイプ、データベース名、IPアドレス、サブネットマスク、許可/非許可/認証、ユーザー名」となっています。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
リスト5の例では、IPアドレスとネットマスクに「0.0.0.0」を指定して、すべてのホストにアクセスを許可しています。特に許可するホストに制限を設けたり、複雑な設定をする必要がなければ、リスト5と同様に設定すると簡単です。
もう1つ、ユーザーの問題を解決しておかなければなりません。この問題は、ApacheがPHPを使ってPostgreSQLに接続する際、Apacheのプロセスオーナーとして接続することから発生します。Apacheのプロセスオーナーは通常、実行権限が最も弱いnobodyユーザーになっています。
nobodyユーザーはPostgreSQLのオーナーではないので、PostgreSQLに接続できません。そこで、PostgreSQLの新しいユーザーとして、Apacheのプロセスオーナーを作成します。PostgreSQLでユーザーを作成するには、PostgreSQLオーナーでLinuxにログインし、createuserコマンドを発行します。
nobodyユーザーを追加するのであれば、「createuser nobody」と入力してやればユーザーを作成してくれます。このとき、新しく作るユーザーにデータベース作成権やユーザー追加権を与えるかを質問されます。通常は、権限を与える必要はないので「n」(No)と入力しておけばいいでしょう。
以上の設定を行っておけば、Oracleの場合と同様に空白のページが表示されるはずです。Apacheのプロセスオーナーを変更する方法を使えば上記の手順を省略することもできますが、Webサーバのセキュリティ上お勧めできません。
次回は最終回です。データベースに接続できるようになったので、データの取得や操作などの処理をプログラムしていくことにします。次回もぜひお付き合いください。
関数名 | 役割 | 例 | |
---|---|---|---|
pg_Connect | PostgreSQLへの接続を確立する。 | pg_Connect("host", "5555", "", "DB"); | |
pg_pConnect | PostgreSQLへ持続的な接続を確立する。 | pg_pConnect("host", "5555", "", "DB"); | |
pg_Close | PostgreSQLへの接続を終了する。 | pg_Close($conn); | |
pg_Exec | SQLを実行する。実行結果として、結果セットへのアクセスIDを取得する。 | $result = pg_Exec($conn, $sql); | |
pg_Fetch_Array | 実行したSQLの結果セットの行を配列に取得する。各列へのアクセスは数字でも列名でも可能。 | $row_array = pg_Fetch_Array($result, $row_num); | |
pg_Fetch_Object | 実行したSQLの結果セットの行をオブジェクトに取得する。各列へのアクセスは列名でのみ可能。 | $row_object = pg_Fetch_Object($result, $row_num); | |
pg_Fetch_Row | 実行したSQLの結果セットの行を配列に取得する。各列へのアクセスは数字でのみ可能。 | $row = pg_Fetch_row($result, $row_num); | |
pg_FieldIsNull | 指定した行の列データがNULLであるかを確認する。 | pg_FieldIsNULL($result, $row_num, $field); | |
pg_FieldName | 結果セットに含まれる列の名称を取得する。 | pg_FieldName($result, $fileld_num); | |
pg_FieldNum | 結果セットに含まれる列の番号を取得する。 | pg_FiledNum($result, $field); | |
pg_FieldPrtLen | 指定した行の列データを表示した場合の長さを取得する。 | pg_FieldPrtLen($result, $row_num, $field); | |
pg_FieldSize | 結果セットに含まれる列の長さを取得する。可変長の場合は「-1」になる。 | pg_Field_Size($result, $field_num); | |
pg_FieldType | 結果セットに含まれる列のデータ型名を取得する。 | pg_FieldType($result, $field_num); | |
pg_NumFields | 結果セットに含まれる列の数を取得する。 | pg_NumFields($result); | |
pg_NumRows | 結果セットに含まれる行の数を取得する。 | pg_NumRows($result); | |
pg_Result | 指定した行の列データを取得する。 | pg_Result($result, $row_num, $filed); | |
pg_FreeResult | 結果セットをメモリから開放する。 | pg_FreeResult($result); | |
pg_GetLastOid | pg_Exec関数で操作されたタプル(行)のオブジェクトID(oid)を取得する。 | pg_GetLastOid($result); | |
pg_cmdTuples | SQL(selectは除く)実行時に、操作された行数(タプル数)を取得する。 | pg_cmdTuples($result); | |
pg_Dbname | 指定した接続が確立されているデータベースの名称を取得する。 | pg_Dbname($conn); | |
pg_Host | 接続しているPostgreSQLデータベースのホスト名を取得する。 | pg_Host($conn); | |
pg_Options | PostgreSQL接続時に指定されたオプションを取得する。 | pg_Options($conn); | |
pg_Port | PostgreSQL接続時に指定されたポート番号を取得する。 | pg_Port($conn); | |
pg_tty | サーバ側のデバッグ出力が送られるtty名を取得する。 | pg_tty($conn); | |
pg_Error_Message | 直近のエラーに関するメッセージを取得する。 | pg_ErrorMessage($conn); | |
pg_loclose | pg_loopen関数でオープンされたラージオブジェクトをクローズする。 | pg_loclose($fd); | |
pg_locreate | ラージオブジェクトを生成し、そのオブジェクトID(oid)を返す。 | $oid = pg_locreate($conn); | |
pg_loopen | ラージオブジェクトを開き、そのファイルIDを返す。 | $fd = pg_loopen($conn, $oid, "rw"); | |
pg_loread | ラージオブジェクトから指定された長さだけデータを取得する。 | pg_loread($fd, "64"); | |
pg_loreadall | ラージオブジェクト全体を取得する。 | pg_loreadall($fd); | |
pg_lounlink | ラージオブジェクトを削除する。 | pg_lounlink($conn, $oid); | |
pg_lowrite | ラージオブジェクトにデータを書き込む。 | pg_lowrite($fd, $buf); | |
表3 PostgreSQL関数の一覧 |
著者紹介
一志達也(ichishi@pochi.tis.co.jp)
株式会社東洋情報システム
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 特集:オブジェクト指向に生まれ変わるPHP5[前編]
現在開発中のPHP5は、オブジェクト指向機能が大幅に強化される。次世代PHPはどのような言語になるのか? - 特集:Windows開発者に贈る Kylixの全貌
注目の開発環境「Borland Kylix」がいよいよ見えてきた。ここに、英語版の発売を目前に控えたKylixの機能やアーキテクチャを紹介しよう - 特集:Kylixプログラミング作法
GUIの構築やコンポーネントとコードの関係、 Object Pascalの仕様など。 これらの点を、実際に日本語ベータ版でプログラミングしながら分かりやすく解説 - 連載:PHP4で作るWeb-DBシステム(全5回)
PHPはWebサーバとデータベースを結びつけるものだ。そのためPHPでの開発を開始するには、OS、データベース、Webサーバ、そしてPHPと、多くのソフトウェアのインストールを行う必要がある - 連載:ステップ・バイ・ステップ・シェルスクリプト(全7回)
Linuxの中でシェルスクリプトはネットワークの設定、デーモンの起動など重要な役割を果たしている。この連載では、シェルスクリプトで実用的なプログラムを組むことを目標にして、シェルの基本的な知識を説明する - 連載:Kylix 3とDB2で作るWebサービス・アプリ(全5回)
Kylix 3とDB2 V8.1を使って、Webサービス・アプリを作ってみよう。トライアル版も用意されているので、実際に試しながら読んでほしい - プログラミング関連記事一覧