この章では、Oracle Databaseへの接続および切断を行うPHP関数を実装するHRアプリケーション・ファイルを作成します。 また、問合せを実行してデータベース接続が正常に確立されたことを確認できるPHP関数も開発します。
この章では、関数をコールして「Departments」ページのヘッダーおよびフッターを生成するPHPファイルを作成および変更する手順についても説明します。「Departments」ページのフッター・セクションには日時が含まれています。
この章の内容は次のとおりです。
注意: ここでは、わかりやすくするために、サンプル・アプリケーション・コードにユーザー名およびパスワードが書き込まれています。デプロイするアプリケーションでは、アプリケーションのソース・コードにユーザー名およびパスワードの文字列を直接コーディングしないことをお薦めします。ユーザーにユーザー名およびパスワードの入力を求めるダイアログ・ボックスを実装する方法などのより安全な方法を使用することをお薦めします。セキュリティ機能およびセキュリティ・プラクティスの詳細は、『Oracle Databaseセキュリティ・ガイド』および開発環境のドキュメントを参照してください。 |
この項では、アプリケーションの最初の画面用の関数およびスタイルを作成します。
「Departments」ページを構築するには、次の手順を実行します。
アプリケーション・ファイル用のディレクトリを作成し、新しく作成したディレクトリに変更するには、コマンド・ウィンドウに次のコマンドを入力します。
Windowsの場合:
mkdir c:\program files\Apache Group\Apache2\htdocs\chap3 cd c:\program files\Apache Group\Apache2\htdocs\chap3
Linuxの場合:
mkdir $HOME/public_html/chap3 cd $HOME/public_html/chap3
別の場所にファイルを作成する場合は、作業ディレクトリ名およびURLと一致するように、ファイルの編集および実行の手順を変更する必要があります。
アプリケーション・ユーザー・インタフェースの開発を開始するには、任意のテキスト・エディタを使用してanyco_ui.inc
というファイルを作成し、ui_print_header()
とui_print_footer()
の2つの関数をそれぞれのパラメータとともにそのファイルに含めて、アプリケーションのWebページでヘッダー・セクションおよびフッター・セクションの一貫性を保持できるようにします。
<?php function ui_print_header($title) { $title = htmlentities($title); echo <<<END <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link rel="stylesheet" type="text/css" href="style.css"> <title>Any Co.: $title</title> </head> <body> <h1>$title</h1> END; } function ui_print_footer($date) { $date = htmlentities($date); echo <<<END <div class="footer"> <div class="date">$date</div> <div class="company">Any Co.</div> </div> END; } ?>
このアプリケーション設計では、PHP関数定義を使用して、再利用可能なコードをモジュール化します。
anyco_ui.inc
の各関数では、ヒア・ドキュメントというPHPの言語要素を使用します。 これによって、次の2行間に任意のサイズのHTML形式のテキストを配置できます。
echo <<<END END;
END;
行の先頭には空白を配置しないでください。配置すると、残りのドキュメントが、出力対象テキストの一部として処理されます。
ヒア・ドキュメントの本体内に記述されているすべてのPHPパラメータ($title
や$date
など)は、それぞれの値に置き換えられます。
PHP関数htmlentities()
は、ユーザー指定のテキストに誤ってHTMLマークアップが含まれ、出力形式に影響を与えるのを防ぐために使用します。
PHPファイルでは、ブラウザでのHTMLの表示スタイルを指定するためにstyle.css
というカスケード・スタイルシート(CSS)・ファイルが使用されます。
chap3
ディレクトリに、次のCSSテキストを含むstyle.css
ファイルを作成します。
body { background: #CCCCFF; color: #000000; } h1 { border-bottom: solid #334B66 4px; font-size: 160%; } table { padding: 5px; } td { border: solid #000000 1px; text-align: left; padding: 5px; } th { text-align: left; padding: 5px; } .footer { border-top: solid #334B66 4px; font-size: 90%; } .company { padding-top: 5px; float: right; } .date { padding-top: 5px; float: left; }
ユーザー・インタフェース関数をコールするには、次のテキストを含むanyco.php
ファイルを作成します。
<?php require('anyco_ui.inc'); ui_print_header('Departments'); ui_print_footer(date('Y-m-d H:i:s')); ?>
PHPコマンドrequire()
は、anyco_ui.inc
をインクルードするために使用します。新しい関数をコールしてHTML出力を生成できます。
anyco.php
ファイルをテストするには、ブラウザに次のURLを入力します。
Windowsの場合:
http://localhost/chap3/anyco.php
Linuxの場合:
http://localhost/~<username>/chap3/anyco.php
生成されるWebページは、次のようになります。
日時がページのフッター・セクションに表示されます。
この項では、部門データを表示できるように「Departments」画面にデータベース接続を追加します。
アプリケーションにデータベース接続を追加するには、次の手順を実行します。
データベース接続を確立するには、次の3つの文字列パラメータを指定したoci_connect()
関数を使用します。
$conn = oci_connect($username, $password, $db)
1つ目および2つ目のパラメータはそれぞれデータベース・ユーザー名およびパスワードです。3つ目のパラメータはデータベース接続識別子です。oci_connect()
関数は、他のOCI8コールに必要な接続リソースを戻します。ただし、エラーが発生した場合はFALSEを戻します。 戻された接続識別子は、$conn
という変数に格納されます。
次のパラメータ値が指定されているデータベース接続を追加するためにanyco.php
ファイルを編集します。
ユーザー名はhr
です。
この例のパスワードはhr
です。実際には、HR
ユーザーの実際のパスワードを使用してください。
Oracle接続識別子は//localhost/orcl
です。
oci_connect()
コールが使用可能なデータベース接続を戻すことを検証するためにanyco.php
ファイルを編集します。oci_connect()
へのコールで取得したデータベース接続識別子およびDEPARTMENTS
表のすべての行を選択する問合せ文字列の2つのパラメータをとるdo_query()
関数を記述します。
問合せを実行するための準備を整えるためにanyco.php
ファイルを編集します。oci_parse()
コールを追加します。oci_parse()
関数には、接続識別子および問合せ文字列の2つのパラメータが含まれています。この関数は、問合せを実行し、生成されたデータ行をフェッチするために必要な文識別子を戻します。 エラーが発生した場合は、FALSE
を戻します。
問合せを実行するためにanyco.php
ファイルを編集します。oci_execute()
関数へのコールを追加します。oci_execute()関数は、1つ目のパラメータに指定された文識別子に関連付けられている文を実行します。2つ目のパラメータには、実行モードを指定します。OCI_DEFAULT
は、文を自動的にコミットしないことを示すために使用します。デフォルトの実行モードはOCI_COMMIT_ON_SUCCESS
です。 oci_execute()
関数は、正常に完了した場合はTRUE
を戻し、そうでない場合はFALSE
を戻します。
実行した問合せに対して生成されるすべての行をフェッチするためにanyco.php
ファイルを編集します。while
ループおよびoci_fetch_array()
関数へのコールを追加します。oci_fetch_array()
関数は、結果データの次の行を戻します。次の行が存在しない場合は、FALSE
を戻します。 oci_fetch_array()
関数の2つ目のパラメータOCI_RETURN_NULLS
は、NULL
データベース・フィールドがPHP NULL値として戻されることを示しています。
データの各行は数値配列として戻されます。コードでは、配列のループにPHPのforeach
構文が使用され、各列値が表の行要素内のHTML表セルに出力されます。列値がNULL
の場合は、改行なしスペースが出力されます。それ以外の場合は、列値が出力されます。
手順1〜5までの編集を終えると、anyco.php
ファイルは次のようになります。
<?php // File: anyco.php require('anyco_ui.inc'); // Create a database connection $conn = oci_connect('hr', 'hr', '//localhost/orcl'); ui_print_header('Departments'); do_query($conn, 'SELECT * FROM DEPARTMENTS'); ui_print_footer(date('Y-m-d H:i:s')); // Execute query and display results function do_query($conn, $query) { $stid = oci_parse($conn, $query); $r = oci_execute($stid, OCI_DEFAULT); print '<table border="1">'; while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) { print '<tr>'; foreach ($row as $item) { print '<td>'. ($item!== null ? htmlentities($item) : ' ').'</td>'; } print '</tr>'; } print '</table>'; } ?>
anyco.php
に行った変更をテストするために、変更後のanyco.php
ファイルを保存します。 ブラウザのウィンドウに、次のURLを入力します。
Windowsの場合:
http://localhost/chap3/anyco.php
Linuxの場合:
http://localhost/~<username>/chap3/anyco.php
ブラウザ・ウィンドウに、次のようなページが戻されます。
EMPLOYEESのデータを問い合せる場合は、do_query()
関数コールの問合せを次のように変更することもできます。
do_query($conn, 'SELECT * FROM EMPLOYEES');
ユーザー名、パスワードおよび接続文字列が有効であることを確認します。 接続文字列//localhost/orcl
で、Oracle簡易接続構文を使用します。Oracle Net tnsnames.ora
ファイルを使用して接続先のデータベースを指定する場合は、oci_connect()
関数の3つ目のパラメータとしてネットワーク別名を使用します。
エラーが表示されていない場合は、PHPディレクティブdisplay_errors
をON
に設定し、error_reporting
ディレクティブをE_ALL|E_STRICT
に設定します。
PHPコードに問題があり、デバッガを使用していない場合は、PHPのvar_dump()
関数を使用して変数を調べることができます。次に例を示します。
print '<pre>'; var_dump($r); print '</pre>';
一部のアプリケーションでは、永続接続を使用すると、スクリプトがコールされるたびに再接続する必要がなくなるため、パフォーマンスが向上します。この場合、Apacheの構成によっては、多くのデータベース接続が同時にオープンしたままになることがあります。 接続のパフォーマンス上のメリットとデータベース・サーバーで発生するオーバーヘッドとのバランスをとる必要があります。
永続接続は、OCI8のoci_pconnect()
関数によって確立されます。PHP初期化ファイルの設定を使用すると、永続接続の存続時間を制御できます。 この設定には、次のものが含まれています。
oci8.max_persistent: プロセスごとの永続接続の数を制御します。
oci8.persistent_timeout: プロセスでアイドル状態の永続接続が保持される時間(秒単位)を指定します。
oci8.ping_interval: 永続接続をpingしてその妥当性を確認する前に待機する必要がある時間(秒単位)を指定します。
詳細は、次のPHPのリファレンス・マニュアルを参照してください。
http://www.php.net/manual/en/ref.oci8.php
接続プーリングの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』および『Oracle Database Net Services管理者ガイド』のOCIでの接続プーリングに関する項を参照してください。
PHPエンジンは、永続接続が確立されていないかぎり、スクリプトの終了時に自動的にデータベース接続をクローズします。 明示的に非永続データベース接続をクローズする場合は、oci_connect()
コールによって戻される接続識別子でoci_close()
OCI関数をコールできます。次に例を示します。
<?php
$conn = oci_connect('hr', '<your_password>', '//localhost/orcl');
...
oci_close($conn);
...
?>
PHPは変数の追跡に参照カウント・メカニズムを使用するため、接続を参照するすべてのPHP変数の設定が解除されるか、変数のスコープ外に出るまで、実際にはデータベース接続が閉じられない場合があります。