Oracle Database 2日でPHP開発者ガイド 11gリリース1(11.1) E05696-01 |
|
この章では、Oracle Databaseへの接続および切断を行うPHP関数を実装するHRアプリケーション・ファイルを作成します。 また、問合せを実行してデータベース接続が正常に確立されたことを確認できるPHP関数も開発します。
この章では、関数をコールして「Departments」ページのヘッダーおよびフッターを生成するPHPファイルを作成および変更する手順についても説明します。「Departments」ページのフッター・セクションには日時が含まれています。
この章の内容は次のとおりです。
この項では、アプリケーションの最初の画面用の関数およびスタイルを作成します。
「Departments」ページを構築するには、次の手順を実行します。
Windowsの場合:
mkdir c:¥program files¥Zend¥Apache2¥htdocs¥chap3 cd c:¥program files¥Zend¥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; } ?>
anyco_ui.inc
の各関数では、ヒア・ドキュメントというPHPの言語要素を使用します。 これによって、次の2行間に任意のサイズのHTML形式のテキストを配置できます。
echo <<<END END;
END;
行の先頭には空白を配置しないでください。配置すると、残りのドキュメントが、出力対象テキストの一部として処理されます。
$title
や$date
など)は、それぞれの値に置き換えられます。
htmlentities()
は、ユーザー指定のテキストに誤ってHTMLマークアップが含まれ、出力形式に影響を与えるのを防ぐために使用します。
style.css
というカスケード・スタイルシート(CSS)・ファイルが使用されます。 chap3
ディレクトリに、次のCSSテキストを含むstyle.css
ファイルを作成します。
body { background: #CCCCFF; color: #000000; font-family: Arial, sans-serif; } 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
ファイルを編集します。
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 ? 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つ目のパラメータとしてネットワーク別名を使用します。
エラーが表示されていない場合は、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); ... ?>
|
![]() Copyright © 2007 Oracle Corporation. All Rights Reserved. |
|