|Home|私のLinux活用記録-Home-|

私のLinux活用記録

-Page20-

項目

kh20-01[PostgreSQL データベースの設計と作成]
kh20-02[PostgreSQL 簡易マニュアル]
kh20-03[PHP 簡易マニュアル]

 

[PostgreSQL データベースの設計と作成]

作成:2004年09月05日
更新:2004年09月29日

RDBMS(Relational Data Base Management System) の説明、テーブルの作成とクエリの実行方法、ビュー、などの基本概念を説明しています。

[参考資料]
■ PostgreSQL 日本語マニュアル
http://www.postgresql.jp/document/pg721doc/index.html
■ PHP4徹底攻略PDF版
http://www.geocities.jp/rui_hirokawa/php/

kh20-01.01 データベースの設計
kh20-01.02 テーブルの定義と関係
kh20-01.03 テーブルを作成するクエリー文
kh20-01.04 クエリー文の実行方法
kh20-01.05 ビューについて

戻る

データベースの設計

PostgreSQL は、リレーショナルデータベース(RDB) を作成し、データの挿入、更新、削除、検索及び検索結果による演算などを行う管理システムです。一般に、RDBMS(Relational Data Base Management System) または単に DBMS(Data Base Management System) と言われるものです。

RDB(Relational Data Base) とはどのようなものかというと、単純には、表形式のデータの集合で、表の各列はデータの意味が定義されています。表の各行はそれらの定義されたデータの集合(レコード) で、一つの事象を表現するものです。表全体は、これらの事象データ(レコード) が複数集まった集合です。

RDB では、もう一つ重要な特徴があります。RDB では、単一の表を扱うだけでなく、複数の表を扱うことができます。しかも、表と表の間には、「主キー(Primary Key)」と「外部参照キー(Reference Key)」というものを使って、表相互に関連を持たせることができます。このことによって、異る事象間の関係を単純な複数の表によって表現することができます。

主キーを持つ表のレコードが更新されると、その表の主キーを外部参照している他の表は、参照先の変更を自分の表のデータとして反映させることができます(実際には、表の結合を用いた問い合わせによって、容易に更新されたデータが参照できます)。「リレーショナル」という言葉は、この表と表の間の関連付けに由来しています。

以下、当サイトの [フリー登録リンク] のデータベース(FreeLink-DB) の設計を例に具体的に説明します。

戻る

テーブルの定義と関係

FreeLink-DB では、"categories", "users", "registries", "max_ids" という4つのテーブル(表) を持っています。各テーブルの列項目とその意味を以下に説明します。
table "categories"
categ_id:カテゴリー番号/主キー
category:カテゴリー名

table "users"
user_id  :ユーザー番号/主キー
user_name:ユーザー名
e_mail   :ユーザーのメールアドレス
pass_wd  :ユーザーのパスワード

table "registries"
regist_id  :登録番号/主キー
site_name  :登録サイト名
url        :登録サイトの URL
admin_name :登録サイトの管理者名
regist_date:登録日
categ_id   :登録サイトのカテゴリー番号/外部参照キー
other_categ:登録サイトのカテゴリー名(その他)
content    :登録サイトの紹介文
user_id    :登録者のユーザー番号/外部参照キー

table "max_ids"
max_id    :最大値記録番号(1)
categ_max :カテゴリー番号の最大値
user_max  :ユーザー番号の最大値
regist_max:登録番号の最大値

[解説]

■ テーブル間の関係
table "registries" は、登録者(ユーザー)が登録した内容をデータとして持っています。ここでは、categ_id(カテゴリー番号) と user_id(ユーザー番号) を外部参照キーとして設定しています。それぞれ、table "categories", table "users" で主キーとして定義されたデータ項目です。仮に、table "categories" または table "users" のデータ(カテゴリー名またはユーザー名) が更新(主キーは更新できない) された場合、table "registires" の categ_id と user_id のデータは変わらないので、これら外部参照キーの元表を参照すれば、table "categories" と table "users" の更新が table "registries" に反映されるわけです。

■ 主キー
主キーは、一つの表に一つだけ定義できます。主キーに定義された項目のデータは、重複が許されません(一意性の確保)。また、更新も許されません。

■ 外部参照キー
外部参照キーは、一つの表に複数定義できます。外部参照キーは、参照先の表に定義されていなければなりません。また、外部参照キーに定義された項目のデータは、参照先の表にデータが存在しなければなりません。

■ table "max_ids" について
table "max_ids" は、各 table の主キー(連続自動採番) の採番を管理するためのものなので、ここでは説明を省略します。

戻る

テーブルを作成するクエリー文

FreeLink-DB でテーブルを作成するクエリー文を、以下に示します。意味合いは、上記の解説から推察してください。
-- "--" 以下は、コメント文です。
-- clear old tables
-- 新規作成の時は不要、データを消去してテーブルを再作成する時に使用
DROP TABLE registries;    -- table "registries" を削除
DROP TABLE categories;    -- table "categories" を削除
DROP TABLE users;         -- table "users"      を削除
DROP TABLE max_ids;       -- table "max_ids"    を削除

-- table name: categories
CREATE TABLE categories ( -- table "categories" を作成
categ_id int primary key, -- categ_id を整数データ、主キーとして定義、
category text             -- category をテキストデータとして定義
);

-- table name: users
CREATE TABLE users (
user_id int primary key,
user_name text,
e_mail text,
pass_wd text
);

-- table name: registries
CREATE TABLE registries (
regist_id int primary key,
site_name text,
url text,
admin_name text,
regist_date date,  -- regist_date を日付データとして定義
categ_id int references categories, 
         -- categ_id を table "categories" の外部参照キーとして定義
other_categ text,
content text,
user_id int references users
        -- user_id を table "users" の外部参照キーとして定義
);

戻る

クエリー文の実行方法

準備としては、PostgreSQL の実行環境が整っている必要があります。kh19-02.04 PostgreSQL のインストールと設定 を参照してください。SQL文を実行するには、PostgreSQL サーバーが稼働しているホストに USER_NAME でログインし、

$ psql
USER_NAME=>
の状態で、クエリー文を直接入力します。

別の方法として、SQL 文を書いたファイル text.sql を作成し、~/temp/ に配置し、以下を実行します。
$ cd ~/temp/
$ psql -e -f text.sql
or
$ psql
USER_NAME=> \i text.sql
この方法は、テーブルの作成や、データベースへのデータ一括入力に有効です。

[注]psql コマンド

■psql 起動
$ psql -d [database_name] [-h host_name] [-U user_name] 
USER_NAME=>

■psql のヘルプ
$ psql --help

■list database
$psql -l
or
USER_NAME=> \l

■psql の終了
USER_NAME=> \q

■on-line help
USER_NAME=> \h

■テーブルの一覧表示
USER_NAME=> \z

■テーブル内容の確認
USER_NAME=> \d table_name

戻る

ビューについて

FreeLink-DB では、前記の4つのテーブル以外に、HTML ファイルを作成するための、カテゴリー別のビューを持っています。ビューは検索専用のテーブルで、元のテーブルから特定の条件で検索した結果をデータ(レコード) として持つテーブルです。元表のデータ(レコード) が更新された場合、自動的にビューのデータ(レコード) も更新されます。以下に view_1 というビューを作成する SQL 文の例を示します。
CREATE VIEW view_1
    AS SELECT regist_id, site_name, url, admin_name,
              regist_date, category, other_categ, content
    FROM  registries, categories
    WHERE registries.categ_id = 1
    AND   registries.categ_id = categories.categ_id
    ORDER BY regist_id DESC;
[解説]

■ CREATE VIEW view_1
view_1 というビューを作成します。

■ AS SELECT データ項目名, ....
リストされたデータ項目をデータとするテーブルです。データ項目は、下記の FROM テーブル名, .... にリストされたテーブルのデータ項目から選びます。ここでは、登録番号、登録サイト名、登録サイトの URL、登録サイトの管理者名、登録日、カテゴリー名、登録サイトのカテゴリー名(その他)、登録サイトの紹介文 をリストしています。FROM 以下で取り込まれたレコードから、リストされた項目のデータを抜き取ってレコードを作成します。

■ FROM テーブル名, ....
リストされたテーブルから、以下の WHERE 条件に合致するレコードを取り込みます。

■ WHERE 条件1 AND 条件2
条件1 と条件2 が両方成立するレコードを検索します。

■ registries.categ_id = 1
table "registries" の categ_id が "1" であるレコード

■ registries.categ_id = categories.categ_id
table "registries" の categ_id と table "categories" の categ_id が等しいレコード。この条件にマッチする table "registries" と table "categories" のレコードが結合されます。

■ ORDER BY regist_id DESC
検索したデータ(レコード) を regist_id の値で降順(新しい登録→古い登録) に並べかえます。

戻る

[PostgreSQL クエリー簡易マニュアル]

作成:2004年09月05日
追記:2004年09月06日

問い合わせ、テーブル結合と問い合わせ、データの挿入・更新・削除、テーブルの作成・削除、インデックスの作成・削除、などのクエリ文について解説しています。

[参考資料]
■ PostgreSQL 日本語マニュアル
http://www.postgresql.jp/document/pg721doc/index.html
■ PHP4徹底攻略PDF版
http://www.geocities.jp/rui_hirokawa/php/

kh20-02.01 一般形式による問い合わせの説明
kh20-02.02 問い合わせのクエリー文
kh20-02.03 データの挿入、更新、削除のクエリー文
kh20-02.04 テーブル及びビューの作成と削除
kh20-02.05 インデックス作成と削除

戻る

一般形式による問い合わせの説明

問い合わせの一般形式

SELECT 選択リスト FROM テーブル参照 [ソートの仕様];

■ 選択リスト
選択リストには、列名、列名を用いた計算式、集約関数、関数を用いることができます。

■ テーブル参照
テーブル参照は、テーブル名、副問い合わせ、テーブル結合、及びそれらの組合せで派生するテーブルを参照します。

■ テーブル名
テーブル名が親テーブルの場合、ONLY の指定がなければ、子テーブルを継承します。ONLY の指定があると、子テーブルを継承せず、元テーブルを指定します。(「継承」を参照)

■ テーブル結合
テーブル名1 結合方法 テーブル名2 結合条件

□ クロス結合
テーブル名1 CROSS JOIN テーブル名2

テーブル名1 の各行に対して、テーブル名2 の全行を結合した行からなるテーブル。テーブル名1 が m 行、テーブル名2 が n 行であれば、m x n 行のテーブルとなります。

□ 内部結合
テーブル名1 INNER JOIN テーブル名2 結合条件

結合条件にマッチする、テーブル名1 とテーブル名2 の行を結合します。

□ 左外部結合
左テーブル名 LEFT OUTER JOIN 右テーブル名 結合条件

結合条件にマッチするかどうかにかかわらず、左テーブルの各行がすべて出力対象になります。左テーブルと右テーブルで結合条件にマッチする行があった場合、その行が結合されます。右テーブルに条件式にマッチする行がない場合、右テーブルの行を空白行とみなして、左テーブルの行に結合します。このような結合を左外部結合と言います。

□ 完全外部結合
テーブル名1 FULL OUTER JOIN テーブル名2 結合条件

結合条件にマッチする、テーブル名1 とテーブル名2 の行を結合します。マッチしなかったテーブル名1 のその他の行に対しては、テーブル名2 の空白行が結合し、マッチしなかったテーブル名2 のその他の行に対しては、テーブル名1 の空白行が結合します。

□ 自己結合
テーブル名 AS T1 INNER JOIN テーブル名 AS T2 結合条件
or
テーブル名 T1 INNNER JOIN テーブル名 T2 結合条件
[注]
T1, T2 は、テーブル名の別名。同じテーブルを結合するために、T1, T2 のように異なる別名を付けます。

■ 結合条件
□ ON (条件式)
条件式にマッチする行を結合します。
□ USING (共通列名, ...)
共通列名の値が等しい行を結合します。共通列名は一つの列として出力さます。

■ 副問い合わせとテーブルの別名
問い合わせによって派生テーブルが生成され、その派生テーブルを用いてさらに問い合わせを行う場合、元の問い合わせを副問い合わせといいます。副問い合わせは、() で括る必要があります。

■ 派生テーブルの別名定義
(副問い合わせ) AS 別テーブル名
派生テーブルに対して問い合わせを行うには、別テーブル名を用いて問い合わせします。

■ テーブルと列の別名定義
テーブル参照 AS 別テーブル名 (別列名, ...)
別列名の数が列数より少ない場合、残りの列は元のままの列名となります。

■ ソートの仕様(検索条件)
WHERE 条件式
条件式にマッチする行を出力します。

戻る

問い合わせのクエリー文

■ 単純な問い合わせ

□ SELECT * FROM テーブル名;
テーブル名の全行について、全ての列名のデータを出力します。

□ SELECT 列名, ... FROM テーブル名;
テーブル名の全行について、指定した列名のデータを出力します。

□ SELECT 式 AS 新列名 FROM テーブル名;
列名の代わりに「式 AS 新列名」が使用できます。式は、任意の計算式、集約関数など。

■ 検索条件による問い合わせ
SELECT *|列名, ... FROM テーブル名 WHERE 条件式;

条件式にマッチする行について、指定した列名のデータを出力します。
条件式で使用できる演算子
比較演算子: =, <, <=, >, >=, <>
論理演算子: AND, OR, NOT

■ 並べ替え
SELECT *|列名, ... FROM テーブル名 ORDER BY 列名x;

列名x の値により、昇順に行を並び替え、指定した列名のデータを出力します。降順に並べ替えるには、「ORDER BY 列名x DESC;」を用います。

■ 並べ替えて重複行を除く
SELECT DISTINCT *|列名, ... FROM テーブル名 ORDER BY 列名x;

列名x の値により、昇順に行を並び替え、重複行を除いた後、指定した列名のデータを出力します。DISTINCT と ORDER BY は、それぞれ単独で使用できます。

テーブルを結合した問い合わせ

■ テーブル間内部結合問い合わせ(1)
SELECT *|テーブル名x.列名y, ...
    FROM テーブル名x, ...
    WHERE 条件式;
通常、条件式にはテーブル名1, テーブル名2, ... の列名のデータについての比較、およびそれらの論理式が記述されます。列名がテーブル間で重複する場合は、「テーブル名x.列名y」で列名を記述します。テーブル名は、FROM 句で「テーブル名 省略名」と記述することで、省略名を用いることができます。条件式にマッチする各テーブルの行が結合され、指定した列名のデータを出力します。
■ テーブル間内部結合問い合わせ(2)
SELECT *|テーブル名x.列名y, ...
    FROM テーブル名1
    INNER JOIN テーブル名2 
    ON (条件式);

前記、テーブル間内部結合問い合わせ(1) における
FROM テーブル名1, テーブル名2 WHERE 条件式;
の場合と等価です。

■ テーブル間左外部結合問い合わせ
SELECT  *|テーブル名x.列名y, ...
    FROM 左テーブル名
    OUTER JOIN 右テーブル名 ON (条件式);
条件式にマッチするかどうかにかかわらず、左テーブルの各行がすべて出力対象になります。右テーブルに条件式にマッチする行があった場合、その行が左テーブルの行に結合されます。右テーブルに条件式にマッチする行がない場合、右テーブルの行の各列を NULL とみなして、左テーブルの行に結合します。このような結合を左外部結合と言います。
■ テーブルの自己結合問い合わせ
SELECT T1.列名x, ... ,
       T2.列名y, ...
    FROM テーブル名 T1, テーブル名 T2
    WHERE 条件式;
同一テーブルを条件式によって結合します。テーブルの各行について、同一テーブル内の他の行と比較し、条件式にマッチする行をを元の行に結合し、指定した列名のデータを出力します。元テーブルはひとつですが、左テーブルを「テーブル名 T1」、右テーブルを「テーブル名 T2」と記述して、見掛け上区別しています。
■ 集約関数
SELECT 集約関数名(列名) FROM テーブル名;
□集約関数名
max  :最大値
min  :最小値
count:総数
sum  :総和
avg  :平均
[注]
集約関数は、WHERE 句で直接使用することはできません

■ 副問い合わせ
SELECT *|列名, ... FROM テーブル名
    WHERE (集約関数を用いた問い合わせ)を用いた条件式;
集約関数は WHERE 句では直接使えません。WHERE 句で集約関数を使う場合は、集約関数を用いた問い合わせを()で括り(これを副問い合わせと言います)、副問い合わせを用いた条件式を用います。
[例]
SELECT city FROM weather
    WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
「(SELECT max(temp_lo) FROM weather)」 によって、table "weather" 中の最も高い最低気温(列名 temp_lo) を求めます(これを副問い合わせと言います)。副問い合わせで求めた最も高い最低気温に等しい最低気温を持つ行が選択され、その行の列名 city のデータを出力します。
■ GROUP BY
SELECT 列名1, 集約関数名(列名2)
    FROM テーブル名
    WHERE 条件式 
    GROUP BY 列名1;
まず、「WHERE 条件式」にマッチする行が選択されます。次いで、列名1 の値で行をグループ化して各グループの行の列名2 の値に集約関数を作用させ、各グループ毎に、列名1 と集約関数名(列名2) の値を出力します。WHERE 句は、必須ではありません。
■ HAVING
SELECT 列名1, 集約関数名(列名2)
    FROM テーブル名
    WHERE 条件式
    GROUP BY 列名1
    HAVING 集約関数名(列名2)を用いた条件式;
HAVING 句は、GROUP BY 句でグループ化されたグループに対して集約関数を用いた条件式を適用する場合に用いられます。まず、「WHERE 条件式」にマッチする行が選択されます。次いで、列名1 の値で行をグループ化して各グループの行の列名2 の値に、HAVING 句の集約関数を作用させた後、集約関数を用いた条件式を適用して、マッチするグループを選択します。選択されたグループの列名1 の値と集約関数名(列名2) の値を出力します。WHERE 句は必須ではありません。
■ LIKE
SELECT 列名1, 集約関数名(列名2)
    FROM テーブル名
    WHERE 列名1 LIKE 'パターンマッチング文字列'
    GROUP BY 列名1
    HAVING 集約関数名(列名2)を用いた条件式;
GROUP BY 句、HAVING 句の用法、意味は前記と同じです。ここでは、WHERE 句で LIKE を用いた文字列のパターンマッチングを行っています。WHERE 句は、列名1 の値が 'パターンマッチング文字列' にマッチする行を選択します。パターンマッチングの表記法は、'_' は任意の 1文字にマッチング、'%' は 0文字以上にマッチングします。
□ 'パターンマッチング文字列'
'a%'  :'a' で始まる文字列
'%a'  :'a' で終わる文字列
'%a%' :'a' が含まれる文字列
'a_'  :'a' で始まる 2文字の文字列 
'_a'  :'a' で終わる 2文字の文字列
'_a_' :'a' が真中に含まれる 3文字の文字列
[注]
文字列の照合方法として、「LIKE 'パターンマッチング'」以外に、正規表現による文字列照合を用いることができます。

戻る

データの挿入、更新、削除のクエリー文

■ データの挿入
INSERT INTO テーブル名 VALUES (データ1, データ2, ... );
or
INSERT INTO テーブル名 (列名1, 列名2, ...) VALUES (データ1, データ2, ... );

[注]
文字列データは、『'』で囲みます。数値データはそのまま記述します。(列名1, 列名2, ...) の指定がない場合は、CREATE 文で定義された列名の順番でデータが読み込まれます。

■ データの更新
UPDATE テーブル名 
    SET 列名 = 値|演算式,
        ・・・・・・・・ ,
        ・・・・・・・・
    WHERE 条件式;
条件式にマッチする行の指定列名の値を指定の値または演算式の値で上書きします。

■ データの削除
DELETE FROM テーブル名 WHERE 条件式;

テーブル名の行について、条件式にマッチする行を削除します。

戻る

テーブル及びビューの作成と削除

テーブルの作成
CREATE TABLE テーブル名 (
    列名 データ型 [オプション],
    ・・・,
    ・・・
    );

■ データ型
int             :4バイト 固定精度 数値データ
smallint        :2バイト 固定精度 数値データ
real            :4バイト 可変精度 数値データ
double precision:8バイト 可変精度 数値データ
char(N)         :N文字の文字データ(N文字未満の場合、空白で埋められる)
varchar(N)      :N文字以下の文字データ
date            :日付データ
time            :時刻データ
timestamp       :日付 & 時刻データ
text            :可変長文字列

■ 主キーの設定
CREATE TABLE テーブル名1 (
    列名 データ型 primary key,
    ・・・,
    ・・・
    );
primary key で、その列名を主キーとして定義します。主キーに設定された列名では、データの重複、空のデータは許可されません(データの一意性)。これによって主キーに設定された列名のデータが他のテーブルから外部参照された時、参照整合性が保証されます。また、主キーに設定された列名のデータは、更新が不可能です。
■ 外部参照キーの設定
CREATE TABLE テーブル名2 (
    列名 データ型 references テーブル名1,
    ・・・,
    ・・・
    );
テーブル名1 の列名を外部参照します。当然のことですが、列名はテーブル名1 で定義されていなければなりません。また、列名がテーブル名1 で主キーに設定されている場合は、テーブル名2 の列名のデータは、テーブル名1 の列名のデータとして存在しなければなりません。
■ テーブルの継承

□ 親テーブル
CREATE TABLE 親テーブル名 (
    列名 データ型,
    ・・・,
    ・・・
    );

□ 子テーブルの定義
CREATE TABLES 子テーブル名
    列名 データ型,
    ・・・,
    ・・・
    ) INHERIT(親テーブル名);
INHERIT(親テーブル名) によって、子テーブルは親テーブルの全ての列を引継、自身の列を追加します。また、親テーブルは、子テーブルをサブテーブルとして含みます。元の親テーブルだけを参照するには、テーブル名 を指定するときに「ONLY 親テーブル名」とします。

ビューの作成

CREATE VIEW ビュー名 AS
    SELECT 列名, ...
    FROM テーブル名1, テーブル名2, ...
    WHERE 条件式;
ビューは、問い合わせの結果を特別なテーブルとして定義するものです。事前に定義された問い合わせの結果を常にテーブルとして保持しているので、逐一問い合わせをすることなく問い合わせ結果が参照できます。ビューの参照には、通常のテーブルの参照と同様、SELECT 句を用います

テ-ブル及びビューの削除

DROP TABLE テーブル名;
DROP VIEW    ビュー名;

戻る

インデックス作成と削除

インデックス作成

CREATE INDEX インデックス名 ON テーブル名 (列名, ...);

指定したテーブル名、列名(複数の列名を指定可能)のデータに対してインデックスを作成します。インデックスは、その列名データを効率的に検索するために用いられます。また、インデックスはテーブル結合にも有効に作用します。

■ 一意インデックス
CREATE UNIQUE INDEX インデックス名 ON テーブル名 (列名, ...);

列名の値の一意性を確保してインデックスを作成します。一意インデックスは、主キーが宣言された場合にも自動的に作成されます。

■ 主キーと一意インデックスの違い

□ 主キー
・行を識別し、関連付けるために使用します
・データの更新は不可能です
・値に NULL は許可されません

□ 一意インデックス
・行への代替アクセスとして使用します
・データの更新が可能です
・値に NULL が可能です

インデックス削除

DROP INDEX インデックス名;

インデックス名 で指定したインデックスを削除します。

戻る

[ PHP 簡易マニュアル]

作成:2004年09月05日
追記:2004年09月15日

PHP の基本構文、データの型(文字列、配列)、制御文、ユーザ定義関数、クラスとオブジェクト、スーパーグローバル変数、PosatgreSQL 関数、その他(正規表現、マルチバイト対応のパラメータ設定と関連内部関数、その他一部の内部関数) を解説しています。

[参考資料]
■ PHP 日本語マニュアル
http://www.php.net/manual/ja/
■ PHP4徹底攻略PDF版
http://www.geocities.jp/rui_hirokawa/php/

kh20-03.01 基本構文
kh20-03.02 型、文字列、配列
kh20-03.03 制御文
kh20-03.04 ユーザー定義関数
kh20-03.05 クラス、コンストラクタ、メンバ関数、メンバ変数
kh20-03.06 スーパーグローバル変数
kh20-03.07 PostgreSQL 操作関数
kh20-03.08 正規表現、PHP パラメータ、内部関数

戻る

基本構文

■ php 開始タグ
<?php

■ php 終了タグ
?> 

■ 1行コメント
// コメント

■ 複数行コメント
/* コメント
   ・・・・
   コメント */
■ 文の区切り
文の区切りは、";" です。文が複数行にまたがって記述されていても、";" が記述されるまでは、ひとつの文と見なされます。
■ HTML ファイル中の PHP スクリプト記述方法
[例]
<html>
    <head>
    ・・・
    </head>
<body>
html文
・・・
<?php
php 文;
・・・;
?>
html文
・・・
</body>
</html>
<?php php文; ... ?> は、htmlファイル中のどの場所にでも、しかも何度でも記述できます。また、特殊な用法として、php制御文(下記に説明)の構造の中に html文を埋め込むことも可能です。
[例]
<html>
    <head>
    ・・・
    </head>
<body>
html文
・・・
<?php
if (条件) {
?>
    html文1
<?php
}
else {
?>
    html文2
<?php
}
?>
html文
・・・
</body>
</html>
php 文の if (条件) が真の場合、html文1 が出力され、if (条件) が偽の場合は html文2 が出力されます。

戻る

型、文字列、配列

PHP では、8種類の基本型があります。

  • 論理値(boolean)
  • 整数(integer)
  • 浮動小数点数(float/double は float と同じ)
  • 文字列
  • 配列(array)
  • オブジェクト
  • リソース(resource)
  • ヌル(NULL)

PHP では、変数の型はセットされた値とその変数が使用される文の内容によって決定されます。値が数値であれば、数値型(整数または浮動小数点数)の変数として扱われ、文字列であれば文字列の変数として扱われます。

■ 整数
整数は、10進数表記、8進数表記、16進数表記 で記述されます。8進数表記は "0" で、16進数表記は、"0x" で始まります。また、数字の前に "+" または "-" の符号を付ける事ができます。

■ 浮動少数点数
少数点を含む数値、および指数表記された数値は浮動小数点数として扱われます。
指数表記は、[整数|少数点を含む数][e|E][整数] の形式で記述されます。

■ 変数、変数値の型変換

□ 型キャスト
一時的に型変換します。
  (bool) $変数名:論理値への変換
   (int) $変数名:整数値への変換
 (float) $変数名:浮動小数点数値への変換
(string) $変数名:文字列への変換

□ 変数の型変換
変数の型を変換すると同時に、現在の値も型変換されます。
settype ($変数名, 型)
[型の値]
bool :論理型への変換
int  :整数型への変換
float :浮動小数点型への変換
string:文字列への変換

文字列

文字列は、『"』または『'』で括られた文字の並びです。

■ 文字列の出力
<?php
echo "文字列\n";
?>
or
<?php
print "文字列\n";
?>

"\n" は、改行コードです。注意すべきは、これらの出力文字列が HTML 文として出力される場合、"\n" は単に出力文字列の改行を行うだけなので、HTML コードとしての改行タグ "<br />" を文字列に含めないとブラウザー上の表示は改行されません。

[例]
<?php
print "STRING1<br />\n";
print "STRING2<br />\n";
// 出力結果
// STRING1<br />
// STRING2<br />
?>

□ ヒアドキュメント
print 文の便利な使いかたとして、ヒアドキュメントを使う方法があります。

<?php
print <<<EOF
STRING1<br />
STRING2<br />
・・・
EOF;
// 出力結果
// STRING1<br />
// STRING2<br />
// ・・・
?>

"EOF" は、任意の記号で構いません。"print <<<EOF" 行と "EOF;" 行の間に記述された文字列は、改行も含めてそのまま出力されます(改行コード "\n" は不要です)。注意点は、"EOF;" の後には、何も記述してはいけないことです。

■ 文字列と変数の値をつなげて出力する

□ "." による連結
<?php
$var_name1 = "VALUE1";
$var_name2 = "VALUE2";
print "STRING1:".$var_name1.":STRING2:".$var_name2."<br>\n";
// 出力結果
// STRING1:VALUE1:STRING2:VALUE2:<br>
?>

□ "{", "}" で変数を括り、文字列中に埋め込む
<?php
$var_name1 = "VALUE1";
$var_name2 = "VALUE2";
print "STRING1:{$変数名1}:STRING2:{$変数名2}<br>\n";
// 出力結果
// STRING1:VALUE1:STRING2:VALUE2<br>
?>

□ ヒアドキュメント中の文字列と変数の連結
ヒアドキュメントにおいても、文字列と変数の値を連結するには "{", "}" で変数名を括ります。
<?php
$var_name1 = "VALUE1";
$var_name2 = "VALUE2";
print <<<EOF
$var_name1 の値は、{$var_name1} です<br />
$var_name2 の値は、{$var_name2} です<br />
EOF;
// 出力結果
// $var_name1 の値は、VALUE1 です<br />
// $var_name2 の値は、VALUE2 です<br />
?>

配列

PHP の配列では、各要素を識別する概念として、キー(key) があります。key は、整数または文字列です。

■ 配列の定義(関数 array() による定義)
$arr = array(key => VALUE, ... );

$arr は、任意の配列変数名です。key は、整数値または文字列で、整数値の場合は、0, 1, 2, ... のようにそのまま表記できますが、文字列の場合は、'NAME' のように『'』で囲む必要があります。key => を省略することもできます。その場合は、key は、整数値とみなされ、現在使われている key の最大値に +1 された整数値となります。

配列への値のセットは、関数 array() を用いなくても以下の様に個別にも設定できます。
$arr[] = VALUE1
$arr[] = VALUE2
・・・
$arr['KEY_NAME1'] = VALUE_x
$arr['KEY_NAME2'] = VALUE_y
・・・

■ 配列の参照
$arr[key] で配列の各要素の値が参照されます。

■ 多次元配列
$arr[key_x][key_y] のように、key を追加するだけで、基本的には一次元の配列と同様に取り扱うことができます。

■ 連想配列
key に文字列が使用された場合、この配列を連想配列といいます。例えば、$fruit という連想配列で、果物の名前に対応する、色と価格を配列の値に持ちたいとします。以下のように、key と対応する値をセットすることができます。key に変数を使用することが可能ですが、配列は使用できません。

<?php
$fruit['apple']['color'] = "red";
$fruit['apple']['price'] = "150";
$fruit['lemon']['color'] = "yellow";
$fruit['lemon']['price'] = "100";
$name = "apple";
$attribute = "color";
print $name.":".$attribute.":".$fruit[$name][$attribute]."<br>\n";
$name = "lemon";
$sttribute = "price";
print $name.":".$attribute.":".$fruit[$name][$attribute]."<br>\n";
// 出力結果
// apple:color:red<br>
// lemon:price:100<br>
?>

戻る

制御文

■ if 文
if (条件1) {
  実行文1;
  ・・・;
}
elseif (条件2) {
  実行文2;
  ・・・;
}
else {
  実行文3;
  ・・・;
}
条件1 が真なら実行文1 以下を実行、条件1 が偽で条件2 が真なら実行文2 以下を実行、条件1 が偽で条件2 が偽なら実行文3 以下を実行する。
■ while 文
while (条件) {
  実行文;
  ・・・;
}
条件 が真である間は、実行文 以下を実行し、繰り返します。条件 が偽になると実行文 を実行せずに繰り返しループを停止します。
■ do ... while 文
do {
  実行文;
  ・・・;
}
while (条件)
まず実行文 以下を実行し、条件が真であれば実行文 以下を実行し、繰り返します。条件が偽になると繰り返しループを終了します。
■ for 文
for (条件の初期値, 条件, 条件の値更新) {
  実行文;
  ・・・;
}
まず、条件の初期値 がセットされます。次いで、条件の値が条件 にマッチすれば実行文以下を実行し、条件の値更新 によって条件の値を更新します。条件 が真である間、実行文 の実行と条件の値更新を繰り返します。
■ if 文、while 文、do ... while 文、for 文における条件式の論理演算子
and : "&&" or "and"
or  : "||" or "or"
not : "!"
xor : "xor"

■ foreach 文-1
foreach (配列 as $value) {
  実行文;
 ・・・;
}

配列の各要素の値を逐次 $value に代入し、実行文を実行します。

■ foreach 文-2
foreach (配列 as $key => $value) {
  実行文;
 ・・・;
}
配列の各要素について、要素のキーを $key に、要素の値を $value に代入して、実行文 を実行します。

[注]
配列の「要素のキー」とは、配列の添字に相当する値です。

■ continue 文
continue;
continue 文は、ループ構造において現在の繰り返しループの残りの処理をスキップし、次の繰り返しの最初から実行を続けます。

■ switch 文
switch (変数) {
  case "変数値1":
  実行文1;
  ・・・;
  case "変数値2":
  実行文2;
  ・・・;
  ・・・
}
変数の値 が 変数値1 であれば実行文1 以下を実行し、変数値2 であれば実行文2 以下を実行します。case はいくつでも書けます。

■ break 文
break nest_level;
while, do ... while, for, foreach, switch 各制御文で、現在のループ構造から脱出します。

□ nest_level
1:現在のループを抜け出る
2:現在のループを抜け出て、更にひとつ上位のループを抜け出る

■ require 文
require ('file_name');
ファイルを読み込んで評価します。

[注]
file_name を読み込んで評価します(ファイルが評価されるときは、HTML モードになっています)。ループ構造の中で異なるファイルを読み込むことはできません。ファイルのパスは、カレントのワーキングディレクトリからの相対パスとして、include_path を参照し、ついで、カレントのスクリプトのディレクトリからの相対パスとして、include_path を参照します。ファイルが存在しない場合、Fatal Error となります。

■ include 文
include ('file_name');
ファイルを読み込んで評価します。

[注]
file_name を読み込んで評価します(ファイルが評価されるときは、HTML モードになっています)。ループ構造の中で異なるファイルを読み込むことができます。ファイルのパスは、カレントのワーキングディレクトリからの相対パスとして、include_path を参照し、ついで、カレントのスクリプトのディレクトリからの相対パスとして、include_path を参照します。ファイルが存在しなくても、処理が続行されます。

■ return 文
return (引数);

関数内で return(引数) が呼び出されると、その関数の実行を停止し、引数を関数の値として返します。グローバルなスクリプト中で呼び出された場合は、そのスクリプトの実行を中断します。また、スクリプトが include() または require() されたものである場合は、呼び出し元 のファイルに戻ります。include() 場合、return(引数) の引数の値は include() の戻り値となります。

■ exit(引数)
exit(引数);
exit(引数) は、制御文ではなく見掛け上は関数ですが、実際は関数ではなく現在のスクリプトの実行を終了する言語構造です。引数は文字列、文字列型変数で、スクリプト終了直前に出力されます。

戻る

ユーザー定義関数

PHP が内部で持っている関数(内部定義関数) については、別途整理しているので、そちらを参照してください。ここでは、ユーザ定義関数について説明します。
■ ユーザ定義関数を記述したファイル名の宣言
<?php
require_once("DIRECTORY_PASS/function_lib.inc");
・・・
?>
ユーザ定義関数の記述が、ユーザ定義関数を呼び出す PHP スクリプトが書かれたファイルとは別のファイルに書かれている場合、ユーザ定義関数を記述しているファイルを PHP スクリプトの冒頭で宣言しておく必要があります。ここでは、"DIRECTORY_PASS/function_lib.inc" が、ユーザ定義関数を記述したファイルです。
■ ユーザ定義関数の記述形式
function ユーザ定義関数名(引数, ...) {
    php 文;
    ・・・
    ・・・
    return(返り値);
}
□ 引数
引数は、任意の数(なくても可)だけ定義できます。通常、引数は変数名で定義されますが、ユーザ定義関数の呼び出し側が引き渡す変数名と同じである必要はありません。記述された引数の順序に従って引数の値が引き渡されます。スーパーグローバル変数以外の変数は、そのユーザー定義関数の中でのみ有効です

□ return(返り値);
return 文は、なくても可です。return 文が実行されると、ユーザ定義関数の実行を停止し、返り値が関数の値として返されます。返り値は、ひとつだけ定義できます。複数の値を返したい場合は、配列の値として返します。

■ ユーザ定義関数の呼び出し
$変数名 = ユーザ定義関数名(引数, ...)

引数の値が、定義された引数の順にユーザ定義関数に渡されます。関数の実行結果が返され、$変数名 の値として受け取ります。

戻る

クラス、メンバ変数、コンストラクタ、メンバ関数、

■クラスとは
クラスは、変数およびこれらの変数で動作する関数の集まりで、変数とそれに固有の手続きをカプセル化したものです。
class クラス名 {                            // クラス宣言
    var メンバ変数名;                       // メンバ変数
    ・・・
    function クラス名() {                   // コンストラクタ
    $this->メンバ変数名 = 初期化;
    ・・・                        
    }
    function メンバ関数名1(引数, ...) {     // メンバ関数
    $this->メンバ変数名 を含む文;
    ・・・
    }
    function メンバ関数名2(引数, ...) {     // メンバ関数
    $this->メンバ変数名 を含む文;
    ・・・
    }
    ・・・
    ・・・
    ・・・
}
[注]
□ クラス
クラス宣言、メンバ変数、コンストラクタ、メンバ関数で構成されます。

□ メンバ変数
クラスの中でのみアクセス可能で、メンバ関数から直接アクセスされます。アクセス方法としては、$this->メンバ変数名 でアクセスされます。定数による初期化が可能です。

□ コンストラクタ
メンバ関数の内でクラス名と同じ名前の関数で、メンバ変数の初期化に使われます。メンバ変数の初期化が単純な定数の設定であれば、コンストラクタを定義する必要はありません。new 演算子 でオブジェクトを生成するときに呼び出されます。

□ メンバ関数
メンバ関数は、複数定義でき、それぞれのメンバ関数の中では、メンバ変数をどこででも使用できます。メンバ変数は、$this->メンバ変数名 という形式で参照されます。また、メンバ関数の中に自分自身を含めてメンバ関数を使用できます。その場合は、$this->メンバ関数名 という形式で参照します。

■ new 演算子 によるオブジェクトの生成とオブジェクトの実行
$オブジェクト名 = new クラス名;
$オブジェクト名->メンバ関数名(引数, ...);

$オブジェクト名 = new クラス名 で class で定義されたメンバ関数名(引数,...) とメンバ変数名を持つオブジェクトが生成し、$オブジェクト名->メンバ関数名(引数, ...) によってそのオブジェクトが実行されます。

■クラス定義した xxxx.php ファイルの読み込みと評価
クラス定義を、xxxx.php に記述した場合、
require ('xxxx.php');
によって、xxxx.php が読み込まれ、評価されます。

■クラスの継承
class 拡張クラス名 extends 基底クラス名 {
    var メンバ変数名;                       // 拡張クラスのメンバ変数
    ・・・
    function クラス名() {                   // 拡張クラスのコンストラクタ
    $this->メンバ変数名 = 初期化;
    ・・・                        
    }
    function メンバ関数名1(引数, ...) {     // 拡張クラスのメンバ関数
    $this->メンバ変数名 を含む文;
    ・・・
    }
    function メンバ関数名2(引数, ...) {     // 拡張クラスのメンバ関数
    $this->メンバ変数名 を含む文;
    ・・・
    }
    ・・・
    ・・・
    ・・・
}
拡張クラスは、基底クラスで定義されたメンバ変数、メンバ関数をそのまま継承します。

[注]
拡張クラスを定義するには、それ以前に基底クラスが定義されている必要があります。複数の基底クラスを継承することはできません。コンストラクタを定義しない場合は、基底クラスのコンストラクタを引き継ぎますが、コンストラクタを定義した場合、基底クラスのコンストラクタを呼び出すには、明示的に呼び出す必要があります。

戻る

スーパーグローバル変数

PHP スクリプトのどこででも呼び出せる変数です。

$_SERVER  :環境周りの情報
$_ENV     :PHP 実行時の環境変数
$_POST    :html の method(post) で取得したデータ
$_GET     :html の method(get) で取得したデータ
$_COOKIE  :クライアントからクッキーとして送られたデータ
$_FILES	  :ファイルアップロード機能でクライアントから送られたファイルの情報
$_REQUEST :$_POST, $_GET, $_COOKIE, $_FILES にあるキーとその値を保持
$_SESSION :スクリプト内部で自由に使用可。$_SESSION の値は、PHP スクリプト終了時
            に session.save_handler で指定された方法(デフォルトはファイル)で自動
            的に保存される。
            また、session_start() が呼ばれると(session.auto_start = 1 の場合 PHP 
            スクリプト起動時に自動的に) そのファイルが読み込まれ、$_SESSION に値
            がセットされる。

■ $_POST
スーパーグローバル変数の使い方の例として、$_POST について説明します。
以下のような、フォームによる入力用 HTML 文を想定します。

<form action="URL/PHP_FILE_NAME.php" method="post">
<input type="TYPE_NAME" name="FIELD_NAME1" value="DEFAULT_VALUE1">
<input type="TYPE_NAME" name="FIELD_NAME2" value="DEFAULT_VALUE2">
<input type="submit" value="送信">
</form>

□ action="URL/PHP_FILE_NAME.php"
入力値を PHP_FILE_NAME.php に渡します。

□ method="post"
入力値の取得方法として、"post" を指定します。
上記設定によって、入力値は、$_POST というスーパーグローバル変数(この場合、配列変数)の形で URL/PHP_FILE_NAME.php に渡されます。

□ PHP_FILE_NAME.php
PHP スクリプトが記述されたファイルで、<input type="submit" value="送信"> が実行されると、$_POST が URL/PHP_FILE_NAME.php に渡され、URL/PHP_FILE_NAME.php 中の HTML 文が表示されるとともに、PHP スクリプトが実行されます。

特殊ですが、URL/PHP_FILE_NAME.php の代わりに {$_SERVER['PHP_SELF']} を用いると、現在 PHP スクリプトを実行しているファイルに $_POST が渡されます。いわゆる再帰的なプログラムが書けるので、なにかと便利な用法です。

戻る

PostgreSQL 操作関数

■データベースへの接続開始
@$con = pg_connect("接続条件");
if (!($con)) {
  エラー表示;
  エラー処理;
  exit;
}

□ @$con
"@" は PHP のエラーメッセージ表示を抑止します。システムエラーメッセージは、$php_errormsg に返されます。"$con" は任意の変数名。

□ pg_connect("接続条件")
"接続条件" で指定した条件で PostgreSQL への接続をオープンします。接続成功の場合、接続ID を返し、失敗した場合は FALSE を返します。
接続条件:有効な引数は、dbname, port, host, tty, options, user, password
[記述例]
pg_connect("dbname=DB_NAME port=PORT_NO host=HOST_NAME user=USER_NAME password=PASS_WORD")

□ if 文
接続開始に失敗した場合($con が真でない場合)、システムエラーメッセージを表示せずに、任意のエラー表示を行い、エラー処理を行います。

□ exit
現在の PHP スクリプトを終了します。

■ クエリ文の実行
$sql = "クエリー文";
@result = pg_query($sql);
if (!($result) {
  エラー表示;
  エラー処理;
  exit;
}

□ pg_query([接続ID], クエリ文);
接続ID は pg_connect で返された接続ID($con) ですが、省略可能です。クエリ文が実行されると、クエリ結果ID を返します。失敗した場合、FALSE を返します。エラーメッセージは、pg_last_error() に返されます。
上記 @result = pg_query($sql) は、厳密には、@result = pg_query($con, $sql) です。

■ クエリの結果の取得
クエリの結果として、取得した行(レコード) がバッファに保持されます。以下の pg_fetch_XXXX によって、バッファから指定の行(レコード)のデータが取得されます。
pg_fetch_XXXX(クエリ結果ID [, 取得条件])
クエリ結果ID は、上記のクエリ文の実行結果を受けて $result とします。

□ pg_fetch_all(クエリ結果ID);
取得したすべての行(レコード)を保持する配列を返します。行がもうない場合、FALSE を返します。この関数は、php-4.2 ではサポートされてません。php-4.3 以上でサポートされています。
[例]
pg_fetch_all($result);

□ pg_fetch_array(クエリ結果ID [, 行番号 [, 結果タイプ]]);
指定行番号から取得した行を保持した配列を返します。行がもうない場合、FALSE を返します。フィールド番号をキーとする配列及び、またはフィールド名をキーとする連想配列にデータを返します。行番号 は、取得する行番号。最初の行は 0 です。行番号 を指定しない場合は、最初の行を取得し、行カウンターが、インクリメントされます。
結果タイプ は定数で、PGSQL_ASSOC, PGSQL_NUM, PGSQL_BOTH のいずれかです。
PGSQL_ASSOC:フィールド名のある連想配列を返します
PGSQL_NUM :フィールド番号を添え字とする配列を返します
PGSQL_BOTH :PGSQL_ASSOC, PGSQL_NUM の両方のタイプを指定します
デフォルトは PGSQL_BOTH です。
全行を 2次元配列として取得するには

$i = 0;
while ($arr = pg_fetch_array($result)) {
  $all_arr[$i] = $arr;
  $i++;
}
$all_arr[$i] = "";

□ pg_fetch_assoc(クエリ結果ID [, 行番号]);
指定行番号から取得した行を保持した配列を返します。この場合、フィールド番号をキーとする配列とフィールド名をキーとする連想配列にデータを返します。行がもうない場合 FALSE を返します。行番号 は取得する行番号、最初の行は 0 です。行番号 を指定しない場合は、最初の行を取得し、行カウンターが、インクリメントされます。

□ pg_fetch_result(クエリ結果ID, 行番号, フィールド);
指定行番号から取得した行の、指定フィールド(列)のデータを返します。行番号は 0 から始まります。フィールド はフィールド名またはフィールド番号(0 から始まる整数) です。
[参考]
結果リソースの、行数と列数の取得
pg_num_rows(resource result) :結果リソースの行数を返します
pg_num_field(resource result):結果リソースのフィールド(カラム)数を返します

□ pg_fetch_row(クエリ結果ID, 行番号);
指定行番号から取得した行をフィールド(カラム)番号をキーとする配列として返します。カラムは、0 から始まる整数です。

□ pg_field_name(クエリ結果ID, フィールド番号);
結果リソースの指定したフィールド(カラム)番号 のフィールド名を返します。

■ メモリー中のクエリー結果の開放
pg_free_result(クエリ結果ID);
PHP スクリプトが終了すると、自動的にメモリー中のクエリー結果は開放されますが、スクリプト中でその後使われることがなければ、pg_free_result() でメモリーを開放します。

■ データベースへの接続終了
pg_close(接続ID);
上記事例では、pg_close($con)
接続ID が有効な場合は TRUE、無効な場合は FALSE を返します。PHP スクリプトが終了すると、自動的に接続は終了するので、pg_close() は必須ではありません。

戻る

正規表現、PHP パラメータ、内部関数

PHP(正規表現、パラメータ、内部関数) を参照してください。

戻る

counter1counter2counter3counter4counter5counter6

|Home|
 
Valid XHTML 1.1 Valid CSS!