Windows2000+Apache+PHP+DATABASE(Firebird/InterBase)
による Web サーバの構築(ODBC 編)


Firebird/InterBase関係総合トップ 実験工房 総合HOMEPAGE


-------- はじめに --------

 データベースというと、最近は web アプリケーションのバックボーンの一つとして 稼動することが多くなり、掲示板のような物でもデータベースを使用して構築される ことも多いですね。
 本ドキュメントでは、データベースとしてオープンソースの Firebird を使用し、 それに Apache と PHP を組み合わせる方法に関して書きます。  基本ターゲットは Win32 版です。Windows XP 以降の場合は、ODBC 関係の操作や 画面のデザインは変わりますが内容的にはほぼ同様のはずです。また PHP/Apache は 2000/XP 共に全く同じです。
 Apache や PHP などのインストールに関しては、他に良いドキュメントが沢山 ありますので、ここでは、インストール後にデータベースとして Firebird / InterBase を使用するための設定をメインとして書きます。
 ODBC を使用してアクセスを行う方法となっていますので、他のデータベースを使用 する場合にも、ある程度は参考になるでしょう。

インデックス
    Apache をインストール
    FireBird をインストール
    PHP (Win32版) のインストール
    Apache から PHP を使用できるように設定
    Firebird 用 ODBC ドライバのインストール
    Firebird 用 ODBC の設定
    PHP から Firebird をアクセス


-------- Apache をインストール --------

 Win32用の Apache をダウンロードしてインストールします。インストール済み の方は読み飛ばしてください。
 Apache のインストールやダウンロードに関しては参考になるページも多いですし、 Win32のインストールパッケージ版を使用すればインストールも簡単ですので、 ここでは詳しく説明しません。  とりあえず、Apache に関しては 日本のユーザーズグループサイトに情報がまとめられています。
 Win32用にコンパイル済みの、インストールパッケージ版(*.msiまたは*.exe)をダウンロード してインストールするのが非常にお手軽です。2004/05/12 現在、Apache 1.3.x 系の最新版は、 1.3.29 Win32 ソース無しパッケージ版となっています。


-------- FireBird をインストール --------

 Win32用の Firebird をダウンロードしてインストールします。ここでは簡単にまとめて おきますので、詳しくはFirebird付属のドキュメントや後述の本家ドキュメントを参照して ください。
 わたしの場合は、今回は InterBase6 との互換性及び安定性を重視し、Firebird 1.0.3 をインストールしました。
 InterBase がインストール済みの場合は、InterBase をそのまま使用しても問題ない と思われますが、ODBC ドライバに関してはパッケージに付属のものでなければ正しく 動作しない可能性があります。  ちなみに、Delphi や C++ Builder、Kylix のエンタープライズ以外に付属している Desktop Edition の InterBase6 には ODBC ドライバが付属していないようです。
 ODBC を使用せずに PHP からダイレクトに Firebird / InterBase にアクセスする 方法もありますが、その場合は、PHP の設定を変更必要がありますし、使用する関数も ここで挙げる例とは異なります。  これに関しては PHP マニュアルの InterBase 関数 に関する説明の部分に詳しく記述 されていますので、そちらを参照してください。

 インストールのためのファイル入手方法に関しては、まだ情報は少なめですが、Firebird にも 日本のユーザーズグループ がありますので、そちらからリンクを辿っていってWin32版をダウンロードします。  2004/05/12 現在の 1.0.3 系では、 1.0.3.972-win32 が最新です。

 インストールは、ダウンしたファイルが自己解凍パッケージになっていますので、 起動して指示どおりに入力するだけで良く、非常に簡単です。  データベース実装方法の関係でパフォーマンス設定に関してもほとんどが自動 チューニングになっているので、難しい設定も特にありません。  Win32版の場合は自動的にサービスとして登録され、コントロールパネルに 制御用アイコンが登録されます。そのアイコンで自動起動(Automatic)に設定を 行っておけば、OS 起動時に自動的にデータベースが動作開始します。
 インストールと設定に関しては、英語ですが Firebird 本家にわかりやすい ドキュメント がありますので、そちらも参考にして下さい。
 データベースでの表作成などに関しては、自前の blog (当然日本語) にも簡単にまとめてあります。

 インストールが完了したら、コントロールパネルからデータベースを起動して データベースファイル(拡張子は *.gdb または *.idb 推奨) を isql や IBConsole, IBOConsole 等を使って作成します。  後ほど ODBC の設定するときにデータベースファイルを指定する必要があります ので、そのときに作成しても問題ありません。
 今回の例では、C++ Builder 付属の IBConsole を使って、"E:\IB\BBSTABLES.GDB" というデータベースファイルを作成しています。isql や Intractive SQL を使用して SQL により作成する場合は、次のような SQL で作成します。(アカウントは適当です)


CREATE DATABASE 'E:\IB\BBSTABLES.GDB' USER 'TESTUSER' PASSWORD 'TESTPWD' 
  DEFAULT CHARACTER SET EUCJ_0208;

 インストール完了後に忘れてはならないこととして、 セキュリティに関して重要な設定変更があります。
 Firebird / InterBase は、インストール時に管理者アカウント(SYSDBA) やパスワードがデフォルト値になっています。 そのため、これを変更しないと簡単にクラックされる可能性が大きく高まります。
 インストール後は何は無くとも管理者パスワードの変更を忘れないようにしましょう。


-------- PHP (Win32版) のインストール --------

 PHP の Win32インストーラ版をダウンロードしてきて、インストールを行います。
 インストールするファイルや基本的な情報の入手は、 日本PHPユーザ会のサイト から行えばよいでしょう。特に理由が無ければ PHP 4.2以降にしましょう。 ちなみに、今回は PHP 4.3.5 のインストーラ版を使用してインストールしました。

 データベースへのアクセスは ODBC 経由で行うので、Win32版の場合は特に設定変更を 行う必要はないようです。Win32 版 PHP には ODBC を使うためのモジュールも最初から 組み込まれていますので、再コンパイルも不要です。
 設定ファイル(php.ini) に関しては、PHP をインストールしたディレクトリにある php.ini-recommended を変更せずにそのまま php.ini というファイル名でコピーして 使用しましたが、特に問題は発生しませんでした。


-------- Apache から PHP を使用できるように設定 --------

 Apache の設定を変更して、PHP を使用できるようにします。
 PHP を CGI として実行する方法もありますが、ここでは PHP モジュールを組み込んで 使用する方法に関して書きます。安定性に関しては CGI が有利ですが、速度的には 圧倒的にモジュールを組み込む方法が有利です。(CGI ならば、PHP 自体にトラブルが 発生しても、httpサーバへの直接の影響は少なくなります)

 Apache の conf ディレクトリ下にある、httpd.conf の最後に次の行を追加します。 PHP モジュールへのパスを表す「c:/PHP/php4apache.dll」はインストールした環境に 合わせて変更してください。


# PHP モジュール関係
LoadModule  php4_module c:/PHP/php4apache.dll
AddModule   mod_php4.c
AddType     application/x-httpd-php     .php

 設定を変更したら、Apache を再起動して完了です。PHPのテストプログラムでも 走らせて、動作確認をして下さい。


-------- Firebird 用 ODBC ドライバのインストール --------

 Firebird / InterBase 用の ODBC ドライバは Borland のものも含めていくつか ありますが、ここでは IBPhoenix 社 の ODBC ドライバに関して記述します。これは InterBase / Firbird のどちでも 使用できるようです。
 ODBC ドライバは PHP + Firebird の環境では必須ではありませんが、Win32版 PHP のバイナリ配布版には初めから組み込んでありますので、Win32 + PHP の環境で Firebird / InterBase を簡単に使用したい場合に便利です。

 まず、IBPhoenix 社 のサイト内の「Downloads」「Contributed」「Interface Components」から ODBC ドライバのインストールパッケージをダウンロードします。 ( IBPhoenix Open Source ODBC Driver 2004/05/13現在でのリンク)

 ダウンロードしたODBCドライバのインストーラを起動してインストールを行います。  インストール時には、インストール場所とスタートメニュー登録を聞いてくるのみで 特に設定というような項目はありません。また、スタートメニューに登録されるリンク も、現状ではアンインストーラのみです。
 実際に使用するための設定は、Windows の ODBC に関する設定機能で行います。  インストールが完了した直後の状態では、まだ何も設定がなされていませんので ODBC 経由でのアクセスはまだ出来ません。


-------- Firebird 用 ODBC の設定 --------

 ODBC 経由でデータベースにアクセスできるようにするために、Windows 付属のツール を使用します。Windows 2000 の場合は、コントロールパネルの管理ツールにある、 データソース(ODBC)により設定を行います。

 Windows 2000 のデータソース(ODBC)を起動すると、下図のような選択画面が出ます。  ここで「追加」ボタンにより、ユーザーデータソースの追加を行います。実際に ODBC経由のアクセスを行うときは、ここで設定するデータソースの名前を指定します。 (この画面では、すでに FB_BBSの名前で追加済みです。)

ODBC設定画面1


 「追加」ボタンを押下すると、データソースの新規作成ダイアログが出ますので、 ここで「Firebird/InterBase(r) driver」を選択し、「完了」ボタンを押下します。 別の ODBC ドライバをインストールした場合は選択すべきドライバも変わりますので、 使用ドライバに合わせて正しく選択してください。

ODBC設定画面2


 「完了」ボタンを押下すると、Firebird ODBC のセットアップダイアログが開きます。 必要項目を入力し「OK」ボタンを押下することにより、データソースが追加され、 ODBC経由でデータベースにアクセスできるようになります。
 今回の使用方法では、デフォルトから変更・追加する最低限の設定項目は、 「Data Source Name(DSN)」と「Database」の2項目となります。  今回は、PHP からアクセスするする時にアカウントの指定を行うため、クライアント に関する設定やアカウントに関する設定は行わなくても特に問題ありません。  もし、この画面上で接続テストを行いたい場合等には、当然アカウントの設定も必要と なります。

ODBC設定画面3




-------- PHP から Firebird をアクセス --------

 PHP には Firebird / InterBase をネイティブにアクセスする InterBase 関数 もありますが、今回は Unified ODBC 関数 を使用してアクセスします。
 注意すべき点として、データベースの持続的接続を使用する場合は php.ini を変更して持続的接続を許可するように設定変更が必要な場合があります。 (odbc.allow_persistent の設定を確認してください。)

 基本的な使い方(持続的接続をしない)としては、

 (1) odbc_connect 関数でデータソースに接続
 (2)
odbc_exec 関数などの SQL 実行関数を使用して SQL を実行
 (3) odbc_fetch_into 関数などの結果取得関数で結果を取得
 (4) すべての処理が終わったら、odbc_close 関数で切断

 というような形となります。CGIとして別プロセスで動作する場合もこうなります。
 データベースの接続切断の処理は多少重い処理になりますので、それが問題になる 場合は odbc_pconnect 関数を使用するようにし、PHPをモジュールとして動作させることにより、持続的接続動作 を行うことが出来ます。 (スクリプト終了後もそのままデータベースとの接続を維持し、次の実行時にそれを再利用する)

 次の PHP スクリプトは、データソース名 "FB_BBS" にある BBSLOG というテーブル をすべて表示します。ソートの指定は行っていませんので、出力される順番は不定です。
 テーブル(BBSLOG)は、別途 SQL により作成してください。このスクリプトソースでは 既に作成済みであるはずのテーブルを参照しているだけです。


<!-- tabledump.php : PHP + Firebird + ODBC テスト -->

<HTML>
<HEAD>
<TITLE>PHP + Firebird / Interbase test (ODBC接続)</TITLE>
</HEAD>
<BODY>
<H3>テーブルのダンプ出力</H3>
<?php
// DB アカウント定義
define("DBNAME","FB_BBS");       // データソ−ス
define("DBUSER","TESTUSER");     // ユーザ名
define("DBPASSWORD","TESTPWD");  // パスワード

// DB 接続
$dbh = odbc_connect(DBNAME, DBUSER, DBPASSWORD);
if ($dbh == FALSE) {
    echo 'データベースと接続できません。<BR>';
    return;
}

// SQL 発行
$res = odbc_exec($dbh, "select * from BBSLOG");

if ($res == FALSE) {
    echo 'テーブルにアクセスできません。<BR>';
} else {
    // テーブルのダンプ
    if (odbc_fetch_into($res, $arr)) {
        // 1行目は列名も出力する特別処理
        echo '<TABLE BORDER="1" CELLSPACING="0">';
        echo '<TR ALIGN="CENTER">';
        for ($i = 1 ; $i <= count($arr) ; $i++) {
            echo "<TD>", odbc_field_name($res, $i), "</TD>";
        }
        echo "</TR>\n";
        // 初回用行出力
        echo "<TR>";
        for ($i = 0 ; $i < count($arr) ; $i++) {
            $str = $arr[$i];
            if ($str == "") {
                $str = "&lt;NULL&gt;";
            }
            echo "<TD>", $str, "</TD>";
        }
        echo "</TR>\n";

        // 2行目以降用
        while (odbc_fetch_into($res, $arr)) {
            echo "<TR>";
            for ($i = 0 ; $i < count($arr) ; $i++) {
                $str = $arr[$i];
                if ($str == "") {
                    $str = "&lt;NULL&gt;";
                }
                echo "<TD>", $str, "</TD>";
            }
            echo "</TR>\n";
        }
        echo "</TABLE>\n";
    } else {
        echo 'テーブルにデータがありません。<BR>';
    }
}

// DB 切断
odbc_close($dbh);
?>

</BODY>
</HTML>

−了−

ページ先頭へ移動
Firebird/InterBase関係総合トップ
実験工房
総合HOMEPAGE