連載
» 2000年11月09日 00時00分 公開

PHP4で作るWeb-DBシステム(4):実践編:データベースアプリケーションの作成 前編 (3/3)

[一志達也,株式会社東洋情報システム]
前のページへ 1|2|3       

データベースとの接続

 当然のことながら、データベースに接続しなければデータベースに対する操作は一切行えません。まずはデータベースへの接続方法から説明します。

 Webアプリケーションの場合、HTTPというステートレスプロトコルを使う都合上、データベースへの接続は各プログラムで必要になります。この点が、一度接続してしまえばつなぎっぱなしにできるクライアント/サーバアプリケーションと、Webアプリケーションの大きな違いです。今回作成するプログラム(ページ)は、すべてデータベースと連動しますので、全ページに接続関数を組み込む必要があります。

■Oracleの場合

 Oracleの場合、データベースへの接続は「ocilogon関数」を利用します。この関数は、

ocilogon("ユーザー","パスワード","接続文字列");

のように、接続するデータベースとユーザーを指定します。関数の返り値として、接続IDが返されるので、そのIDを変数に受け取るようにしておきます(リスト3)。

<?php
 $conn=ocilogon("scott","tiger","orcl");
 print $conn;
?>

リスト3 ocilogon関数の構文

 この接続IDは、接続後に発行する各種の命令(関数)に引数として引き渡され、どの接続に対して命令を実行するのかを指定するのに使われます。従って、複数の接続を行う必要がある場合でも、接続IDによって命令の発行先を切り替えられるのです。また、ここで接続文字列を指定することによって、Webサーバとは別のサーバで稼働しているデータベースへの接続も可能です。

 実際に接続を確認する方法ですが、環境に合わせてリスト3の内容を書き換え、そのままブラウザで実行してみるといいでしょう。この時点で問題があればエラーが表示されますし、問題なければ真っ白のページが表示されます。エラーが表示された場合はそのエラーの内容を確認して対処してください。

 この段階でありがちなエラーは、概ね以下のとおりです。

  • ユーザー名やパスワードに間違いがある
  • 無効な接続文字列を指定している
  • OracleやNet8リスナーが起動していない
  • Apacheが起動していない
  • 環境の設定に間違いがある

 これらを順に確認していけば、大抵の問題は解決すると思います。Oracleに接続可能かどうか、設定に間違いがないかどうかは、SQL*PLUSやTNSPINGを使って確認してください。

■PostgreSQLの場合

 PostgreSQLの場合、データベースへの接続に「pg_Connect関数」(表3)を利用します。pg_Connect関数の構文についてはリスト4を参照してください。

<?php
 $conn=pg_Connect("host=cinderella dbname=employee port=5432");
?>

リスト4 pg_Connect関数の構文

 この関数にはさまざな利用法があるのですが、最も手っ取り早いのは、リスト4のようにサーバとデータベースを指定する方法です。このとき、サーバ(host)とともにポート番号(port)が必要ですが、これはPostgreSQL起動時に決定されています。特に設定を変更していなければポート番号は5432ですので、これを指定します。

 プログラムとしては、これでPostgreSQLに接続できるのですが、このままでは実際の接続はできません。なぜなら、PostgreSQL側のセキュリティの設定で、ほかのホスト(コンピュータ)からの接続を拒否しているからです。この設定ファイルはpg_hba.confという名前で、/usr/local/pgsql/dataなどに作成されています。

 このファイルは、データベース所有者に読み取り権限しか与えていませんので、ファイルの権限を変更して編集します。編集する際は、リスト5を参考に、最終行にアクセスを許可するホストを追加します。ファイルの冒頭にも説明書き(英語)がありますが、左から順に「ホストのタイプ、データベース名、IPアドレス、サブネットマスク、許可/非許可/認証、ユーザー名」となっています。

# By default, allow anything over UNIX domain sockets and localhost.
local   all                     trust
host    all 127.0.0.1   255.255.255.255     trust
host    all 0.0.0.0     0.0.0.0         trust

リスト5 pg_hba.confの例

 リスト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)

株式会社東洋情報システム



前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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