corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

PHP を使用するデータベース駆動型アプリケーションの作成

レッスン 2: アプリケーションの設計。データベースからの読み取り

このページの内容は NetBeans IDE 6.7-7.0 が対象です

このレッスンでは、アプリケーションを開発するために PHP プロジェクトを作成および構成し、アプリケーション内のページのリストを作成して、それらの関係を定義します。また、基本的なアプリケーションの機能を開発し、レッスン 1 のサンプルデータベースに入力したデータに対してテストします。

このレッスンで作成する PHP コードは、次の機能を実行します。

1. ユーザーが入力した人の名前を取得します。

2. その人が実際にデータベースに存在するかどうかを確認します。その人がデータベースに存在しない場合は、エラーメッセージで終了します。

3. その人のウィッシュ表を表示します。

現在のドキュメントは、PHP チュートリアル「NetBeans IDE for PHP での CRUD アプリケーションの作成」の一部です。


PHP プロジェクトの作成

「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「wishlist」という名前の新しい PHP プロジェクトを作成します。PHP プロジェクトを作成すると、デフォルトでインデックスファイル index.php が含まれています。PHP プロジェクトの作成と構成については、「PHP プロジェクトの設定」を参照してください。

ページフロー図の定義

アプリケーションのスコープは、次のユースケースをカバーしています。
  1. ユーザーが、個人のウィッシュリストを表示する。
  2. ユーザーを新規ウィッシャーとして登録する。
  3. ユーザーがログインして自分のウィッシュリストを作成する。
  4. ユーザーがログインして自分のウィッシュリストを編集する。
この基本的な機能をカバーするためには、次の PHP ファイルを実装する必要があります。
  1. ログイン、登録、およびほかのユーザーのウィッシュリストに切り替えるための「フロント」ページである index.php。
  2. 特定のウィッシャーのウィッシュリストを表示するための wishlist.php ページ。
  3. ウィッシャーとして登録するための createNewWisher.php ページ。
  4. 所有者がウィッシュリストを編集するための editWishList.php ページ。
  5. ウィッシュを作成して編集するための editWish.php ページ。
さまざまなユースケースのページ間で計画された切り替えを示す図

準備手順が完了したので、アプリケーションの基本的な機能の実装を開始できます。ウィッシャーのウィッシュリストの表示から始めます。この機能には検査が含まれていないので、テストデータをデータベースにすでに入力したように、簡単にテストすることができます。この機能は、index.php と wishlist.php の 2 つのページに実装されます。

index.php へのフォームの追加

index.php ファイルには PHP コードが含まれていないため、簡単に次のブロックを削除できます。

index.php ファイルは、次の 2 つの目的で使用されます。

  • データ入力の制御があるページを表示する。
  • 入力されたデータを別の PHP ファイルに転送する。データはそのファイルで処理されます。このチュートリアルでは、wishlist.php というファイルにデータを渡します。このファイルの作成とコーディングは、次の節で行います。

これらのアクションは HTML フォームを使用して実行されます。それぞれの HTML フォームには次のものが含まれています。

  • ページの制御に対応する一連のフィールド。
  • ユーザーがフォームでデータを送信したあとに実行される「アクション」。アクションは、データを処理するページのパスで表されます。

index.php にフォームを追加するには、次の手順に従います。

  1. 「プロジェクト」ウィンドウに切り替え、プロジェクトノードと「ソースファイル」ノードを展開し、index.php ファイルをダブルクリックします。index.php ファイルがメインの IDE 編集領域で開きます。ファイルには、HTML および PHP コードを入力するためのテンプレートが含まれています。

    注: HTML バリデータからの警告は無視してかまいません。

    index.php の操作開始
  2. PHP ブロックを削除します。index.php ファイルは PHP コードを含んでいない状態になります。
    削除できる空の PHP ブロック
  3. <head> 要素内に次の要素がない場合は、この要素を追加します。この要素により、フォームで国際 UTF-8 文字を使用できるようになります。
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. 「ウィンドウ」メニューから、または Ctrl-Shift-8 を押して、パレットを開きます。
  5. パレットの「HTML フォーム」セクションから index.php の <body> セクションに、フォームをドラッグ&ドロップします。
    パレットから index.php の body に HTML フォームの要素をドラッグ&ドロップする
  6. 「挿入フォーム」ダイアログが表示されます。「アクション」フィールドに、フォームからデータを転送するファイルのパスを入力します。この場合は「wishlist.php」と入力します。(このファイルは、index.php と同じ場所に作成されます。「wishlist.php の作成とアプリケーションのテスト」を参照してください。)データを転送するための GET メソッドを選択します。フォームに wishList といった任意の名前を付けます。完了したら、「了解」をクリックします。
    入力済みの「フォームの挿入」ダイアログ

    ファイルは次のようになっています。

    内容のないフォームが追加された index.php
  7. form の開始タグと終了タグの間に、「Show wish list of: 」というテキストを入力します。
  8. 「Show wish list of: 」というテキストの後ろに、パレットの「HTML フォーム」セクションから「テキスト入力」コンポーネントをドラッグします。「挿入テキスト入力」ダイアログが表示されます。
  9. この入力に user という名前を付けます。入力の型 text を選択します。その他のフィールドはすべて空のままにし、「了解」をクリックします。
    入力済みの「テキスト入力の挿入」ダイアログ

    ファイルは次のようになっています。

    テキスト入力フォームが追加された index.php
  10. </form> タグの上に空行を追加します。この空行に、パレットの「HTML フォーム」セクションから「ボタン」コンポーネントをドラッグ&ドロップします。
  11. 「挿入ボタン」ダイアログが表示されます。「ラベル」フィールドに「Go」と入力し、「了解」をクリックします。
    入力済みの「挿入ボタン」ダイアログ
  12. 1 つの相違点を除き、フォームは次のコードのようになります。次のコードでは、<form> タグに method 属性が明示的に記述されています。GET は method 属性のデフォルト値なので、NetBeans IDE はフォームにこの属性を追加しませんでした。ただし、method 属性を明示的に記述することで、コードを理解しやすくなります。
    <form action="wishlist.php" method="GET" name="wishList">
    Show wish list of: <input type="text" name="user" value=""/>
    <input type="submit" value="Go" />
    </form>

フォームの次の要素に注目してください。

  • 開始 <form> タグには action 属性が含まれています。action 属性は、フォームからデータを転送するファイルを指定します。この場合、ファイルは wishlist.php という名前で、index.php と同じフォルダに置かれています。(このファイルは、「wishlist.php の作成とアプリケーションのテスト」の節で作成します。)
  • 開始 <form> タグには、データの転送に適用するメソッド (GET) も指定されています。PHP は、method 属性の値に応じて、このフォームから渡される値に $_GET 配列または $_POST 配列を使用します。この場合、PHP は $_GET を使用します。
  • text 入力コンポーネント。このコンポーネントは、表示したいウィッシュリストのユーザー名を入力するためのテキストフィールドです。このテキストフィールドの初期値は空の文字列です。このフィールドの名前は user です。PHP は、フィールドの値の配列を作成するときに、フィールドの名前を使用します。この場合、このフィールドの値の配列は $_GET["user"] です。
  • submit 入力コンポーネントとその値「Go」。「submit」型は、入力フィールドがボタンとしてページ上に表示されることを意味します。この制御が正確に影響を受けるときに、データが転送されます。

wishlist.php の作成とアプリケーションのテスト

index.php へのフォームの追加」では、表示したいウィッシュリストのユーザー名を送信するフォームを作成しました。この名前は wishlist.php ページに渡されます。ただし、このページは存在しません。index.php を実行すると、名前を送信したときに「404: File Not Found」エラーが表示されます。この節では、wishlist.php を作成し、そのあとでアプリケーションをテストします。

wishlist.php を作成し、アプリケーションをテストするには、次の手順に従います。

  1. 作成した「wishlist」プロジェクトの内部で、「ソースファイル」ノードでマウスの右ボタンをクリックし、コンテキストメニューから「新規」>「PHP Web ページ」を選択します。「新規 PHP の Web ページ」ウィザードが表示されます。
  2. 「ファイル名」フィールドに「wishlist」と入力し、「完了」をクリックします。
    「新規 PHP ファイル」パネル
  3. ソースノードでマウスの右ボタンをクリックし、コンテキストメニューから「プロジェクトを実行」を選択するか、プロジェクトを主プロジェクトに設定している場合は、ツールバーの「主プロジェクトを実行」アイコン ツールバーの「主プロジェクトを実行」ボタン: 緑色の三角の矢印 をクリックします。
    「Show wish list of」編集ボックスおよび「Go」ボタンのあるアプリケーションのメインページ index.php
  4. 「Show wish list of:」編集ボックスに「Tom」と入力し、「Go」をクリックします。URL が http://localhost:90/Lesson2/wishlist.php?user=tom の、空のページが表示されます。この URL は、メインページが正しく動作していることを示します。

接続の確立とウィッシャー ID の取得

この節では、まずデータベースへの接続を作成するコードを wishlist.php に追加します。次に、index.php フォームに入力されたウィッシャーの名前からその ID 番号を取得するコードを追加します。

  1. wishlist.php ファイルをダブルクリックします。表示されるテンプレートは、index.php とは異なります。このファイルは HTML コードも含むため、ファイルの開始と終わりに <html></html> タグおよび <body></body> タグがあります。
    <html>
        <body>
            <?php
            /* 
             * To change this template, choose Tools | Templates
             * and open the template in the editor.
             */
    
            ?>
      </body>
    </html>
  2. タイトルを表示するには、開始の <body> タグの直後、生成された <?php タグの前に次のコードを入力します。
     Wish List of <?php echo $_GET["user"]."<br/>";?>

    コードは次のようになります。

    <html>
        <body>Wish List of <?php echo $_GET["user"]."<br/>";?>
    <?php
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */ ?>
    </body> </html>

    PHP コードブロックは、「user」フィールドの取得メソッド (GET) を介して受け取ったデータを表示します。このデータは、テキストフィールド「user」に、ウィッシュリストの所有者である Tom の名前が入力されている index.php から転送されます。wishlist.php が正しく動作していることを確認するために、手順を「index.php のテスト」から繰り返します。
    テキスト「Wish List of Tom」が表示された wishList.php ページ

  3. テンプレート PHP ブロックのコメント付きセクションを削除します。そこに、次のコードを入力またはペーストします。このコードはデータベースへの接続を開きます。

    MySQL データベースの場合:

    $con = mysqli_connect("localhost", "phpuser", "phpuserpw");
    if (!$con) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    //set the default client character set
    mysqli_set_charset($con, 'utf-8');

    Oracle データベースの場合:

    $con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
    if (!$con) {
        $m = oci_error();
        exit('Connect Error ' . $m['message']);
    }

    コードはデータベースへの接続を開くことを試み、エラーがある場合はエラーメッセージを返します。

    Oracle データベースユーザーへの注意: oci_connect コマンドのデータベース接続の変更が必要になる場合があります。標準の構文は「ホスト名/サービス名」です。このスニペットでは、この構文に従い、Oracle XE データベースへの接続が「localhost/XE」となっています。

    注: mysqli 関数または OCI8 関数には、NetBeans IDE のコード補完機能を使用できます。

    MySQL 呼び出しのコード補完OCI8 呼び出しのコード補完
  4. コードの下にデータベースへの接続が開き、同じ PHP ブロックに次のコードを入力またはペーストします。このコードは、ウィッシュリストが要求されたウィッシャーの ID を取得します。そのウィッシャーがデータベースに存在しない場合、このコードは処理を強制終了または終了し、エラーメッセージを表示します。

    MySQL データベースの場合:

    mysqli_select_db($con, "wishlist");
    $user = mysqli_real_escape_string($con, $_GET["user"]);
    $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'");
    if (mysqli_num_rows($wisher) < 1) { exit("The person " . $_GET["user"]. " is not found. Please check the spelling and try again" ); }
    $row = mysqli_fetch_row($wisher);
    $wisherID = $row[0];
    mysqli_free_result($wisher);

    Oracle データベースの場合: (oci8 には、mysqli_num_rows に相当するものはありません)

    $query = "SELECT id FROM wishers WHERE NAME = :user_bv";
    $stid = oci_parse($con, $query);
    $user = $_GET['user'];
    
    oci_bind_by_name($stid, ':user_bv', $user);
    oci_execute($stid);
    
    //Because user is a unique value I only expect one row
    $row = oci_fetch_array($stid, OCI_ASSOC);
    if (!$row) {
        exit("The person " . $user . " is not found. Please check the spelling and try again" );
    }
    $wisherID = $row['ID'];
    oci_free_statement($stid);

    データは、$con 接続を介して wishlist データベースから選択されます。選択の基準は、index.php から「user」として受け取った名前です。

    次に、SQL 文「SELECT」の構文を簡単に説明します。

    • SELECT のあとに、データの取得元のフィールドを指定します。アスタリスク (*) はすべてのフィールドを表します。
    • FROM 節のあとに、データを取得する表の名前を指定します。
    • WHERE 節は任意です。フィルタ条件を指定します。

    mysqli クエリーは、結果のオブジェクトを返します。OCI8 は、実行された文を返します。いずれの場合も、実行されたクエリーの結果から 1 行を取得し、ID 行の値を抽出して、変数 $wisherID に格納します。

    最後に、mysqli の結果または OCI8 の文を解放します。接続を物理的に閉じる前に、接続を使用しているすべてのリソースを解放する必要があります。そうしないと、mysqli_close() 呼び出しまたは oci_close() 呼び出しのあとで $con が使用不可になっても、PHP の内部参照カウントシステムにより、基になる DB 接続は開いたまま保持されます。

    セキュリティー上の注意: MySQL の場合、$_GET["user"] パラメータは、SQL インジェクション攻撃を避けるためにエスケープされます。SQL インジェクションに関する Wikipedia および mysql_real_escape_string のドキュメントを参照してください。このチュートリアルのコンテキストでは、有害な SQL インジェクションのリスクはありませんが、そのような攻撃のリスクになるような MySQL クエリーの文字列はエスケープするのがベストプラクティスです。OCI8 では、バインド変数を使用してこれを回避しています (「PHP Oracle FAQs」を参照し、「bind variable」および「injection」を検索)。

PHP ブロックはこれで完了です。MySQL データベースを使用している場合、wishlist.php ファイルは次のようになっています。

Wish List of <?php echo $_GET["user"] . "<br/>"; ?>
<?php
$con = mysqli_connect("localhost", "phpuser", "phpuserpw"); if (!$con) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
//set the default client character set mysqli_set_charset($con, 'utf-8'); mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, $_GET["user"]); $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'"); if (mysqli_num_rows($wisher) < 1) { exit("The person " . $_GET["user"]. " is not found. Please check the spelling and try again"); } $row = mysqli_fetch_row($wisher); $wisherID = $row[0]; mysqli_free_result($wisher); ?>

Oracle データベースを使用している場合、wishlist.php ファイルは次のようになっています。

Wish List of <?php echo $_GET["user"] . "<br/>"; ?>
  <?php
  $con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
  if (!$con) {
     $m = oci_error();
     exit('Connect Error ' . $m['message'];
     exit;
  }
  $query = "SELECT id FROM wishers WHERE name = :user_bv";
  $stid = oci_parse($con, $query);
  $user = $_GET["user"];
  oci_bind_by_name($stid, ':user_bv', $user);
  oci_execute($stid);
//Because user is a unique value I only expect one row $row = oci_fetch_array($stid, OCI_ASSOC); if (!$row) { exit("The person " . $user . " is not found. Please check the spelling and try again" ); } $wisherID = $row["ID"]; oci_free_statement($stid); ?>

アプリケーションのテストで無効なユーザーを入力すると、次のメッセージが表示されます。

エラーメッセージを表示した wishlist.php ページ: 「ユーザーが見つかりません」

ウィッシュ表の表示

この節では、ウィッシャーに関連付けられているウィッシュを HTML 表で表示するコードを追加します。ウィッシャーの識別には、前の節のコードで取得した ID を使用します。

  1. PHP ブロックの下に、次の HTML コードブロックを入力またはペーストします。このコードは、表を開き、境界線の色を指定し (黒)、「Item」列および「Due Date」列を持つ表ヘッダーを「描画」します。
    <table border="black">
        <tr>
            <th>Item</th>
            <th>Due Date</th>
        </tr>
    </table>
    </table> タグが表を閉じます。
  2. 次の PHP コードブロックを、終了 </table> タグの前に入力します。

    MySQL データベースの場合:

    <?php
    $result = mysqli_query($con, "SELECT description, due_date FROM wishes WHERE wisher_id=" . $wisherID);
    while ($row = mysqli_fetch_array($result)) {
    echo "<tr><td>" . htmlentities($row["description"]) . "</td>";
    echo "<td>".htmlentities($row["due_date"]) . "</td></tr>\n";
    }
    mysqli_free_result($result);
    mysqli_close($con);
    ?>

    Oracle データベースの場合:

    <?php
    $query = "SELECT description, due_date FROM wishes WHERE wisher_id = :id_bv";
    $stid = oci_parse($con, $query);
    oci_bind_by_name($stid, ":id_bv", $wisherID);
    oci_execute($stid);
    while ($row = oci_fetch_array($stid)) {
    echo "<tr><td>" . htmlentities($row["DESCRIPTION"]) . "</td>";
    echo "<td>".htmlentities($row["DUE_DATE"]) . "</td></tr>\n";
    }
    oci_free_statement($stid);
    oci_close($con);
    ?>

    コード内は次のようになっています。

    • SELECT クエリーは、手順 4 で取得されたウィッシャーの ID によって、指定したウィッシャーに対するウィッシュの期日とともにウィッシュを取得し、そのウィッシュと期日を配列 $result に格納します。
    • ループは、$result 配列が空でない間、この配列の項目を表の行として表示します。
    • <tr></tr> タグは行を形成し、<td></td> タグは行内のセルを形成します。また、\n は新しい行を開始します。
    • htmlentities 関数は、相当する HTML エンティティーのある文字をすべて HTML エンティティーに変換します。これはクロスサイトスクリプティングの防止に役立ちます。
    • 関数は最後にすべてのリソース (mysqli の結果と OCI8 の文) を解放し、データベース接続を閉じます。接続を物理的に閉じる前に、接続を使用しているすべてのリソースを解放する必要があります。そうしないと、oci_close() 呼び出しまたは mysqli_close() 呼び出しのあとで接続が使用不可になっても、PHP の内部参照カウントシステムにより、基になる DB 接続は開いたまま保持されます。

    注意: データベース表の作成時に指定したとおりに、データベースフィールドの名前が入力されていることを確認してください。Oracle の場合、デフォルトでは列名は大文字で返されます。

  3. アプリケーションをテストするには、「index.php のテスト」節の説明に従ってプロジェクトを実行します。
    Tom のウィッシュのリストを表示した wishlist.php ページ

現在のレッスン完了後のアプリケーションソースコード

MySQL ユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここをクリックします。

Oracle データベースユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここをクリックします。

次の手順

<< 前のレッスン

次のレッスン >>

チュートリアルのメインページに戻る

便利なリンク

HTML、PHP、および MySQL または Oracle データベースの使用については、次を参照してください。



メーリングリストに登録することによって、NetBeans IDE PHP 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。

PHP の学習に戻る