• 検索結果がありません。

データベースとファイル編成

第5章 PHP と PostgreSql データベースの連携プログラミング

5.1 データベースとファイル編成

一般的に、データベースには、①階層モデルによるデータベース、②ネットワークデータモデルによる データベース、及び③リレーショナルなデータベースがあります。階層モデルのデータベースは、一つの レコードに対し一つの親を持つという構造体で実現されたデータベースであり、ネットワークモデルは、

レコード同士がネットワーク上に関連を持った構造体として実現されています。これに対し、現在最もポ ピュラーなものが、リレーショナルデータベースで、2次元の表の概念を利用したデータベースです。本 コースではこのリレーショナルデータベース使ったモデルを活用します。

5.1.1 データベースが使用するファイル編成とは

各種のデータベースモデルは、使用者から見たモデルであり、実際にデータが格納される観点から 見た場合、各データベースモデルは、以下の示すような3種類の基本的なファイル編成ファイルを使 用することによりデータベースモデルを実現しています。

① 順編成ファイルの仕組み

記憶装置の先頭から順番に記憶する方法で、記録効率(空きがない)としては良いのですが、

データを順次アクセスしかできませんので、データの検索、挿入及び削除が困難である欠点があ ります。

② 索引編成ファイルの仕組み

索引編成は、索引域(インデックス域)と実際にデータが書き込まれる基本域、及びあふれ域 から構成されるもので、通常は基本域にデータは格納されますが削除/更新を繰り返すとデータは 基本域に格納できず、あふれ域に格納することとなり、記録効率が务化します。

③ 直接編成ファイルの仕組み

実際のデータに、記憶装置のアドレスに変換できるようなキーを持たせ、そのキーをハッシュ 変換等で実際の物理アドレスに変換してアクセスする方式で、高速なアクセスが可能ですが、記 憶装置に無駄が発生しますので、記録効率は良くありません。

追記:

ハッシュ法とは、ハッシュ関数を用いてインデックスとして設定した列の値を変換し、物理的 な格納アドレスを知る方法ですが、関数の計算結果が同じ値となった場合(シノニムと言います)

に、その位置にデータ格納ができない為に別の領域に格納することになり、この処理による効率 は务化することになります。(ハッシュ関数には、平方抽出法や合同法(除算法)があります)

5.1.2 リレーショナルデータベースとは

リレーショナルデータベースとは、データベースファイル(スキーマ)に複数のテーブルを作成し、そ の各々のテーブルを主キー及び外部キーにより関連づけることにより、テーブル間の相関関係を維持した 状態で情報の効率的なデータの格納(重複したデータ保存の回避等)と必要情報の迅速な抽出を可能とし

ます。(主キーとして登録されるデータには同じ値が登録されてはいけません。例えば、学生番号別に学生

の個人情報をまとめた表においては、学生番号で他の表と関連付けられますので一般的には主キーと定義 されます。勿論、同じ学生番号の学生は存在してはいけません。)また、このデータベースは SQL 言語にて 構築されます。

SQL 言語とはリレーショナルデータベースを構築したり、参照する為に使われる標準的な言語です。マ イクロソフト社のアクセスデータベースソフト等はGUI(グラフィックユーザインターフェース)を使 い、スキーマの作成、テーブル(表)の作成、及び各テーブル(表)へのデータ入力を行いますが(入力条 件の設定等も行います)内部的にはこの SQL を使ってデータベースを作成/参照しています。

また、各種のテーブル(表)から必要な項目を抜き出したり、各種の集計処理等を行ったものを表とし て表示する為のクエリ(仮想表として作成され、実際のデータは各テーブルに存在しますので、テーブル が更新された場合はクエリも更新されたように見えます)を作成したりします。勿論内部的には、これら の処理も全てSQLという言語を使い実現されています。

補足:

ある表から条件を満たした行のみを選択する演算を“選択、又は制限”といい、SQL上ではSele ctという概念で処理されます。また、特定の項目(列)のみを取り出す演算を“射影”と呼び、SQL ではProjectionという概念で処理されます。

データベースサーバを利用したクライアントサーバーシステムにおいて、クライアント側で直接SQLコ マンドを実行し、サーバー上のデータベースをアクセスするとSQL 処理そのものが通信回線を使って実 行されますので、通信上の負荷が大きくなる弊害があります。この問題を解決する方法として、ストアド プロシージャ機能を利用する方法があります。この機能は、サーバー上のデータベースに対するアクセス をできる限りデータベースサーバー側で実行してもらい、クライアントはその結果だけを得る方法で、こ の目的として作られたデータサーバー上に登録されたプロシージャ(ストアードプロシージャ)がクライ アントの要求に応じてサーバー側のCPU上で動作し、結果を返す方式です。

5.2 SQL 言語によるデータベースアクセス

SQL データベース言語とは、リレーショナルデータベースの定義言語(DDL:DataDefinitionLanguage)、

操作(DML:DataManipulationLanguage)、及び制御(DCL:DataControlLanguage)を行う言語であり、ISO により標準化されたものです。

PHP 言語はデータベースに対する以下のおのおのの処理を関数(例えば、SELECT 文を実行する為の pg_query 関数)を使って要求することにより、データベースとのやりとりを実現します。

1) リレーショナルデータベースの定義(DDL:DataDefinitionLanguage)

以下のコマンドから構成されるもので、データベースの構造や表を定義します。

CREATE :表等の定義

例:create table tbl01(id1 integer,id2 date);

例:自動発番機能を使った場合の例

create table tbl01(id1 serial primary key,id2 text) 補足:Mysql の場合の自動発番は以下のように設定します。

create table tbl01(id1 integer auto_increment primary key,id2 text)

ALTER :列等の変更

例:ALTER table tbl01 add id1 text;

例:ALTER table tbl01 add id1 integer primary key;

例:ALTER table tbl01 drop id1;

例:ALTER table tbl01 modify id1 text DROP :表及び列等の削除

例:drop table tbl01;

2) リレーショナルデータベースの操作(DML:DataManipulationLanguage)

以下のコマンドから構成され、データベースからデータを取り出したり、追加、更新、削除等を 行うものです。

SELECT :行の問い合わせ等を行います。

例:SELECT * from tbl01;

INSERT :行の挿入を行います。

例:INSERT into tbl01 values(1000,’2003/11/14’);

例:INSERT into tbl01(item2) values('2003/11/15');

UPDATE :行の更新を行います。

例:UPDATE tbl01 set id1=20,id2=’2003/11/17’where id1=20;

DELETE :行の削除を行います。

例:DELETE from tbl01 where id1=20;

3) リレーショナルデータベースの制御(DCL:DataControlLanguage)

以下のコマンドから構成され、データベースの制御を行うものです。

GRANT :権限の付与を行います。

例:GRANT ALL ON tbl01 to apache;

例:GRANT SELECT ON tbl01 to yamada;

REVOKE :権限の削除を行います。

例:REVOKE ALL ON tbl01 from apache;

例:REVOKE SELECT ON tbl01 from yamada;

COMMIT :コミットを行います。

ROLLBACK:ロールバック処理を行います。

5.3 PHP から PostgreSql データベースをアクセスするライブラリ

PHP から PostgreSql データベースに処理要求を行う場合、所定のインターフェース(API)を介して行 います。以下の、主なインターフェース仕様を紹介します。

詳細な構文に関しては、インターネット等で紹介されている説明書を参照ください。

例:http://www.mdbl.sfc.keio.ac.jp/docs/php3/

重要 API 名 機能説明 使用例

◎ pg_connect PostgerSql データベースに接続し、

PHP プログラムからのデータベース アクセスを可能とします

$con=pg_connect("dbname=DB01");

注:返却値である$con は切断処理要求 時等で使用します

◎ pg_query PostgreSql データベースに対し、任 意のコマンド(右記例では SELECT 文)を実行し、その結果を取得(右 記では$result で)します

$result=pg_query($con,”SELECT * FROM a_table ORDER BY item01);

◎ pg_num_rows pg_query 関数による SELECT 文実行 により取得した結果から、その時の 総行数を得ます

$row=pg_numrows($result);

注:$result は、pg_query で指定した 変数名です

◎ pg_num_fields pg_query 関数による SELECT 文実行 により取得した結果から、その時の 総列数を得ます

$col=pg_numfields($result);

注:$result は、pg_query で指定した 変数名です

◎ pg_fetch_result pg_query 関数による SELECT 文実行 により取得した結果から、特定の行/

列のデータを取得します

$str=pg_fetch_result($result,1,1);

注:パラメータの1,1は、取得した い情報の行、及び列番号です

結果は、$str 変数に返却されます

◎ pg_freeresult pg_query 関数により、所得内容を保 存する為に確保されたメモリを解放 します

pg_freeresult($result);

注:$result は、pg_query で指定した 変数名です

◎ pg_close pg_connect 関数により確立された PostgreSql データベースとの接続状 態を切断します

pg_close($con);

注:$con は、pg_connect 関数で設定し た変数名です

pg_pconnect pg_connect 関数と基本的には同じで すが、この場合、pg_close では切断 できません(終了時にのみ切断され ます)

$con=pg_pconnect("dbname=DB01");

◎ pg_errormessage pg_query 関数でエラーが発生した場 合の詳細を取得できます

$str=pg_errormessage($con);

注:$str 変数に詳細が返却されます

◎ pg_field_name pg_query 関数による SELECT 文実行 により取得した結果から、特定の列 に付けられている名前を取得します

&str=pg_fieldname($result,1);

注:1は列番号です pg_fetch_array pg_query 関数による SELECT 文実行

により取得した結果から、特定の行 のデータを取得します

$rowstr=pg_fetch_array($result,1);

注:パラメータの1は、取得したい情 報の行番号です。結果は、$rowstr 変 数に返却されます

pg_fetch_row pg_fetch_array 関数と同じで、特定 の行を取得します。違いは、返却さ れる配列のタイプが普通の配列に固 定かされている点です。

pg_fetch_array はタイプ指定可能

$rowstr=pg_fetch_row($result,1);

注:パラメータの1は、取得したい情 報の行番号です。結果は、$rowstr 変 数に返却されます

pg_fetch_object 機能的には pg_fetch_array 関数と 同じで、特定の行を取得します。

但し、返却される内容はオブジェク トです

$obj=pg_fetch_array($result,1);

補足1:

上記以外の関数として、pg_dbname、pg_host などのいろいろな関数が用意されていますが、導入レベルで は必要ありませんので割愛します。

補足2:

Mysql において使用できる主な関数は以下の通りです。

重要 API 名 機能説明 使用例

◎ mysql_connect mysql データベースに接続し、

PHP プログラムからのデータ ベースアクセスを可能としま す

$con=mysql_connect("localhost","uitec

","uitec1353");

localhost:server-name uitec:user name

uitec1353:password

注:返却値である$con は切断処理要求時 等で使用します

◎ mysql_select_db 使用するデータベースを定義

します。 mysql_select_db("uitecdb");

uitecdb:データベース名

◎ mysql_query mysql データベースに対し、任 意のコマンド(右記例では SELECT 文)を実行し、その結

$result=mysql_query($con,”SELECT * FROM a_table ORDER BY item01);