ヘッダーをスキップ
Oracle Database 2日でPHP開発者ガイド
11g リリース2(11.2)
B56267-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3 接続

この章では、Oracle Databaseへの接続および切断を行うPHP関数を実装するHRアプリケーション・ファイルを作成します。 また、問合せを実行してデータベース接続が正常に確立されたことを確認できるPHP関数も開発します。

この章では、関数をコールして「Departments」ページのヘッダーおよびフッターを生成するPHPファイルを作成および変更する手順についても説明します。「Departments」ページのフッター・セクションには日時が含まれています。

この章の内容は次のとおりです。


注意:

ここでは、わかりやすくするために、サンプル・アプリケーション・コードにユーザー名およびパスワードが書き込まれています。デプロイするアプリケーションでは、アプリケーションのソース・コードにユーザー名およびパスワードの文字列を直接コーディングしないことをお薦めします。ユーザーにユーザー名およびパスワードの入力を求めるダイアログ・ボックスを実装する方法などのより安全な方法を使用することをお薦めします。

セキュリティ機能およびセキュリティ・プラクティスの詳細は、『Oracle Databaseセキュリティ・ガイド』および開発環境のドキュメントを参照してください。


「Departments」ページの構築

この項では、アプリケーションの最初の画面用の関数およびスタイルを作成します。

「Departments」ページを構築するには、次の手順を実行します。

  1. アプリケーション・ファイル用のディレクトリを作成し、新しく作成したディレクトリに変更するには、コマンド・ウィンドウに次のコマンドを入力します。

    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と一致するように、ファイルの編集および実行の手順を変更する必要があります。

  2. アプリケーション・ユーザー・インタフェースの開発を開始するには、任意のテキスト・エディタを使用して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マークアップが含まれ、出力形式に影響を与えるのを防ぐために使用します。

  3. 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; }
    
  4. ユーザー・インタフェース関数をコールするには、次のテキストを含む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出力を生成できます。

  5. anyco.phpファイルをテストするには、ブラウザに次のURLを入力します。

    Windowsの場合:

    http://localhost/chap3/anyco.php
    

    Linuxの場合:

    http://localhost/~<username>/chap3/anyco.php
    

    生成されるWebページは、次のようになります。

    chap3_test_install_005.gifの説明が続きます。
    chap3_test_install_005.gifの説明

    日時がページのフッター・セクションに表示されます。

データベースへの接続

この項では、部門データを表示できるように「Departments」画面にデータベース接続を追加します。

アプリケーションにデータベース接続を追加するには、次の手順を実行します。

データベース接続を確立するには、次の3つの文字列パラメータを指定したoci_connect()関数を使用します。

$conn = oci_connect($username, $password, $db)

1つ目および2つ目のパラメータはそれぞれデータベース・ユーザー名およびパスワードです。3つ目のパラメータはデータベース接続識別子です。oci_connect()関数は、他のOCI8コールに必要な接続リソースを戻します。ただし、エラーが発生した場合はFALSEを戻します。 戻された接続識別子は、$connという変数に格納されます。

  1. 次のパラメータ値が指定されているデータベース接続を追加するためにanyco.phpファイルを編集します。

    • ユーザー名はhrです。

    • この例のパスワードはhrです。実際には、HRユーザーの実際のパスワードを使用してください。

    • Oracle接続識別子は//localhost/orclです。

  2. oci_connect()コールが使用可能なデータベース接続を戻すことを検証するためにanyco.phpファイルを編集します。oci_connect()へのコールで取得したデータベース接続識別子およびDEPARTMENTS表のすべての行を選択する問合せ文字列の2つのパラメータをとるdo_query()関数を記述します。

  3. 問合せを実行するための準備を整えるためにanyco.phpファイルを編集します。oci_parse()コールを追加します。oci_parse()関数には、接続識別子および問合せ文字列の2つのパラメータが含まれています。この関数は、問合せを実行し、生成されたデータ行をフェッチするために必要な文識別子を戻します。 エラーが発生した場合は、FALSEを戻します。

  4. 問合せを実行するためにanyco.phpファイルを編集します。oci_execute()関数へのコールを追加します。oci_execute()関数は、1つ目のパラメータに指定された文識別子に関連付けられている文を実行します。2つ目のパラメータには、実行モードを指定します。OCI_DEFAULTは、文を自動的にコミットしないことを示すために使用します。デフォルトの実行モードはOCI_COMMIT_ON_SUCCESSです。 oci_execute()関数は、正常に完了した場合はTRUEを戻し、そうでない場合はFALSEを戻します。

  5. 実行した問合せに対して生成されるすべての行をフェッチするために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) : '&nbsp;').'</td>';
        }
        print '</tr>';
      }
      print '</table>';
    }
    
    ?>
    
  6. anyco.phpに行った変更をテストするために、変更後のanyco.phpファイルを保存します。 ブラウザのウィンドウに、次のURLを入力します。

    Windowsの場合:

    http://localhost/chap3/anyco.php
    

    Linuxの場合:

    http://localhost/~<username>/chap3/anyco.php
    

    ブラウザ・ウィンドウに、次のようなページが戻されます。

    chap3_db_connect_001.gifの説明が続きます。
    chap3_db_connect_001.gifの説明

    EMPLOYEESのデータを問い合せる場合は、do_query()関数コールの問合せを次のように変更することもできます。

    do_query($conn, 'SELECT * FROM EMPLOYEES');
    

接続で問題が発生した場合

ユーザー名、パスワードおよび接続文字列が有効であることを確認します。 接続文字列//localhost/orclで、Oracle簡易接続構文を使用します。Oracle Net tnsnames.oraファイルを使用して接続先のデータベースを指定する場合は、oci_connect()関数の3つ目のパラメータとしてネットワーク別名を使用します。

エラーが表示されていない場合は、PHPディレクティブdisplay_errorsONに設定し、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変数の設定が解除されるか、変数のスコープ外に出るまで、実際にはデータベース接続が閉じられない場合があります。