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

レッスン6: データベースへの新しいウィッシュの追加

このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます

このレッスンでは、次の2つの機能を使用してアプリケーションの機能を拡張します。

この機能を実装するには、editWishList.phpファイルを編集し、新しいファイルeditWish.phpを作成します。

レッスン6での追加内容を強調表示したページ・フロー図

現在のドキュメントは、PHP向けのNetBeans IDEでのCRUDアプリケーションの作成というチュートリアルの一部です。


前のレッスンからのアプリケーション・ソース・コード

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

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

新規ウィッシュの送信

ユーザーは、次の手順で新しいウィッシュを送信します。

  1. ユーザーは、ログインしてeditWishList.phpページに切り替え、「Add Wish」ボタンを押します。editWish.phpページが開き、HTMLフォームが表示されます。
  2. HTMLフォームで、ユーザーはウィッシュの説明と、必要に応じてウィッシュが必要な期日を入力し、「Save Changes」ボタンをクリックします。
  3. ウィッシュの説明を入力せずにフォームを送信すると、ユーザーはもう一度実行するようにフォームに戻されます。ユーザーが説明なしで期日を送信した場合、その日付はフォームが再ロードされるときに再表示されます。

ユーザーがこの手順を実行できるようにするには、アプリケーションに次の機能を追加します。

ユーザー・インタフェース・コンポーネントの追加

新規ウィッシュを追加するための機能を追加するには:

  1. 「Add Wish」ボタンを実装します。editWishList.phpファイルで、次のHTMLコードをPHPブロックの下に追加します。
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
    
           <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        <body>
            <form name="addNewWish" action="editWish.php">            
                <input type="submit" value="Add Wish">
            </form>
        </body>
    </html>

    注意: HTMLバリデータからの警告は無視できます。

    フォームには、submit型の「Add Wish」入力フィールドが含まれています。このフィールドは「Add Wish」ボタンを実装します。ユーザーが「Add Wish」をクリックすると、editWish.phpページにリダイレクトされます。データはこのフォームを介して転送されないため、サーバー・リクエスト・メソッドは使用されません。

  2. ウィッシャの既存のウィッシュを表示する表をaddNewWishフォームの上に追加します。コードはwishlist.phpと似ています。

    MySQLデータベースの場合:

    <table border="black">
    <tr><th>Item</th><th>Due Date</th></tr>
    <?php
    require_once("Includes/db.php");
    $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);
    $result = WishDB::getInstance()->get_wishes_by_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";
    }
    ?>
    </table>

    Oracleデータベースの場合:

    <table border="black">
        <tr><th>Item</th><th>Due Date</th></tr>
        <?php
        require_once("Includes/db.php");
        $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);
        $stid = WishDB::getInstance()->get_wishes_by_wisher_id($wisherID);
        while ($row = oci_fetch_array($stid)) {
    echo "<tr><td>" . htmlentities($row['DESCRIPTION']) . "</td>";
    echo "<td>" . htmlentities($row['DUE_DATE']) . "</td></tr>\n"; } ?> </table>
  3. 「ソース・ファイル」フォルダでeditWish.php PHPファイルを作成します。
  4. editWish.phpでAdd Wishフォームを実装します。次のコードを<?php?>ブロックの下に入力するか、または貼り付けます。
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    
    <html>
        <head>
    
           <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        <body>
            <form name="editWish" action="editWish.php" method="POST">
    Describe your wish: <input type="text" name="wish" value="" /><br/>
    When do you want to get it? <input type="text" name="dueDate" value=""/><br/>
    <input type="submit" name="saveWish" value="Save Changes"/>
    <input type="submit" name="back" value="Back to the List"/> </form> </body> </html>

Add Wishフォームには、次が含まれています。

  • ウィッシュの説明と期日を入力するための、2つの空のテキスト・フィールド。
  • 入力フィールドの横に出力されるテキスト。
  • 「Save Changes」ボタンを表すsubmitフィールド。
  • editWishList.phpページに戻るための「Back to the List」ボタンを表すsubmitフィールド。

「Add Wish」ボタンを押すと、フォームはリクエスト・メソッドPOSTを介して、入力したデータを同じeditWish.phpページに送信します。

送信に失敗した後の期日の再表示

ユーザーがAdd Wishフォームに説明を入力しなかった場合、エラー・メッセージが表示され、ユーザーはeditWish.phpページに戻ります。ユーザーがeditWish.phpに戻ると、dueDateを入力していた場合はAdd Wishフォームにその値が表示されます。現在のフォームの実装では、両方のフィールドは常に空です。入力した値を保持するには、新しいウィッシュのデータを配列に保存する必要があります。配列はdescriptiondue_dateという名前の2つの要素で構成されます。配列からdueDateフィールドの値を取得するように、Add Wishフォームを変更する必要があります。

注意: 説明が入力されていない場合に入力フォームを再ロードするコードは、データを検証してデータベースに入力するコードに含まれています。このコードについては、この項では説明しません。この項のコードは、フォームが再ロードされた場合にdueDateの値が表示されるように、その値を保持するのみです。

ユーザーが入力フォームの送信に失敗した場合に入力フォームを再表示するには:

  1. 次のコード・ブロックを、editWish.phpのHTML <body>要素内で、入力フォームの直前に入力するか、または貼り付けます。
    <?php 
    if ($_SERVER["REQUEST_METHOD"] == "POST")
    $wish = array("description" => $_POST["wish"],
    "due_date" => $_POST["dueDate"]);
    else
    $wish = array("description" => "",
    "due_date" => ""); ?>

    このコードは、データの転送にどのサーバー・リクエスト・メソッドが使用されたかを確認し、$wishという名前の配列を作成します。メソッドがPOSTの場合、つまり説明が空の状態でウィッシュを保存しようとして失敗した後に入力フォームが表示される場合、descriptiondue_dateの要素はPOSTを介して転送された値を受け取ります。

    メソッドがPOSTでない場合、つまりeditWishList.phpページからのリダイレクト後に初めて入力フォームが表示される場合、descriptiondue_dateの要素は空です。

    注意: どちらの場合も説明は空です。dueDateが異なるのみです。

  2. Add Wishフォームの入力フィールドの値が$wish配列から取得されるように、Add Wishフォームを更新します。Add Wishフォームの次の行が対象です。
    Describe your wish: <input type="text" name="wish"  value="" /><br/>
    When do you want to get it? <input type="text" name="dueDate" value=""/><br/>
    次と置き換えます。
    Describe your wish: <input type="text" name="wish"  value="<?php echo $wish['description'];?>" /><br/>
    When do you want to get it? <input type="text" name="dueDate" value="<?php echo $wish['due_date']; ?>"/><br/>

ウィッシャのログオンの確認

editWish.phpファイルで、ファイルの先頭の<? >ブロック内に次のセッション処理コードを入力します。
session_start();
if (!array_key_exists("user", $_SESSION)) {
    header('Location: index.php');
    exit;
}
このコードは次を実行します。
  • データを取得するために$_SESSION配列を開く。
  • 配列$_SESSIONに、識別子が「user」の要素が含まれていることを確認する。
  • 確認に失敗した場合、つまりユーザーがログオンしていない場合、最初のindex.phpページにアプリケーションがリダイレクトされ、PHPの処理が取り消される。

セッション処理が正しく動作していることを確認するには、IDEからeditWish.phpファイルを実行します。セッションを介してeditWish.pageページにユーザーが転送されていないため、index.phpページが開きます。

データベースへの新しいウィッシュの挿入

ユーザーが新しいウィッシュを送信した後、アプリケーションはそのウィッシュを「wishes」データベースに追加する必要があります。この機能を有効にするには、次のコードをアプリケーションに追加します。

  • db.phpWishDBクラスに、補助関数をさらに2つ追加する。
    • 1つの関数は、wishes表に新しいレコードを追加します。
    • もう1つの関数は、日付をMySQLデータベース・サーバーがサポートする形式に変換します。
  • WishDBの新しい補助関数を使用してデータベースに新しいウィッシュを入力するコードを、editWish.phpに追加する。

WishDBへのinsert_wish関数の追加

この関数は、入力パラメータとして、ウィッシャのID、新しいウィッシュの説明、およびそのウィッシュの期日を必要とし、このデータをデータベースの新規レコードに入力します。この関数は値を返しません。

db.phpを開き、関数insert_wishWishDBクラスに追加します。

MySQLデータベースの場合

function insert_wish($wisherID, $description, $duedate){
    $description = $this->real_escape_string($description);
if ($this->format_date_for_sql($duedate)==null){
$this->query("INSERT INTO wishes (wisher_id, description)" .
" VALUES (" . $wisherID . ", '" . $description . "')");
} else
$this->query("INSERT INTO wishes (wisher_id, description, due_date)" .
" VALUES (" . $wisherID . ", '" . $description . "', "
. $this->format_date_for_sql($duedate) . ")"); }

Oracleデータベースの場合:

function insert_wish($wisherID, $description, $duedate) {
  $query = "INSERT INTO wishes (wisher_id, description, due_date) VALUES (:wisher_id_bv, :desc_bv, to_date(:due_date_bv, 'YYYY-MM-DD'))"; 
  $stid = oci_parse($this->con, $query);
  oci_bind_by_name($stid, ':wisher_id_bv', $wisherID);
  oci_bind_by_name($stid, ':desc_bv', $description);
  oci_bind_by_name($stid, ':due_date_bv', $this->format_date_for_sql($duedate));
  oci_execute($stid);
  oci_free_statement($stid);
}

このコードは関数format_date_for_sqlをコールし、入力した期日をデータベース・サーバーが処理できる形式に変換します。次に、問合せINSERT INTO wishes (wisher_id, description, due_date)を実行し、新しいウィッシュをデータベースに入力します。

WishDBへのformat_date_for_sql関数の追加

関数format_date_for_sqldb.php内のWishDBクラスに追加します。この関数は、入力パラメータとして日付の入った文字列を必要とします。この関数は、データベース・サーバーが処理できる形式で日付を返すか、または入力文字列が空の場合はnullを返します。

注意: この例の関数は、PHP date_parse関数を使用します。この関数は、「December 25, 2010」などの英語の日付でのみ機能し、アラビア数字専用です。高度なWebサイトでは日付ピッカーを使用します。

MySQLデータベースの場合:
function format_date_for_sql($date){
if ($date == "")
return null;
else {
$dateParts = date_parse($date);
return $dateParts["year"]*10000 + $dateParts["month"]*100 + $dateParts["day"];
}
}

Oracleデータベースの場合:

function format_date_for_sql($date){
    if ($date == "")
        return null;
    else {
        $dateParts = date_parse($date);
        return $dateParts['year']*10000 + '-' + $dateParts['month']*100 + '-' + $dateParts['day'];
   }
}

入力文字列が空の場合、このコードはNULLを返します。それ以外の場合は、入力パラメータとして$dateを使用する内部のdate_parse関数がコールされます。date_parse関数は、$dateParts["year"]$dateParts["month"]、および$dateParts["day"]の3つの要素から構成される配列を返します。最終的な出力文字列は、$dateParts配列の要素で構成されます。

重要: date_parse関数は英語の日付のみ認識します。たとえば、「February 2, 2016」は解析しますが、「2 Unora, 2016」は解析しません。

Oracleデータベース・ユーザーへの注意: 形式の要件は、return$dateParts...文の日付の形式が、insert_wish問合せのto_date SQL関数の日付形式と一致することのみです。

データベースへの新規ウィッシュ・レコードの入力

補助関数の開発が完了したので、新規ウィッシュ・データを検証するコードを追加し、データが有効である場合は、そのデータをデータベースに入力します。データが有効でない場合、コードはAdd Wishフォームを再ロードする必要があります。期日が入力されているが説明が入力されていないためにデータが無効な場合、フォームが再ロードされるときに、以前に開発したコードによって期日が保存され、再表示されます。

次のコードを、先頭の<?php?>ブロック(editWish.php内)のセッション処理コードの下に入力します。
require_once("Includes/db.php");
    $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION['user']);

    $wishDescriptionIsEmpty = false;
    if ($_SERVER['REQUEST_METHOD'] == "POST"){
        if (array_key_exists("back", $_POST)) {
           header('Location: editWishList.php' ); 
           exit;
        } else
        if ($_POST['wish'] == "") {
            $wishDescriptionIsEmpty =  true;
        } 
		 else {
           WishDB::getInstance()->insert_wish($wisherID, $_POST['wish'], $_POST['dueDate']);
           header('Location: editWishList.php' );
           exit;
        }
    }
	

このコードは次の関数を実行します。

  • db.phpファイルの使用を有効にする。
  • クラスWishDBのインスタンスを取得または作成する。
  • 関数get_wisher_id_by_nameをコールして、ウィッシュを追加しようとしているウィッシャのIDを取得する。
  • $wishDescriptionIsEmptyフラグを初期化する(これは、後でエラー・メッセージの表示に使用されます)。
  • リクエスト・メソッドがPOSTであることを確認する(これは、このデータがeditWish.phpページ自身のウィッシュ・データを入力するためのフォームから送信されたことを意味します)。
  • $_POST配列が「back」キーを持つ要素を含んでいるかどうかを確認する。

$_POST配列が「back」キーを持つ要素を含んでいる場合、フォームを送信する前に「Back to the List」ボタンが押されます。この場合、コードは、フィールドに入力されたデータを保存せずにユーザーをeditWishList.phpにリダイレクトし、PHP処理を停止します。

$_POST配列が「back」キーを持つ要素を含んでいない場合、データは「Save Changes」ボタンを押すことによって送信されます。この場合、コードは、ウィッシュの説明が入力されているかどうかを検証します。コードは、$_POST配列内の「wish」キー持つ要素が空であるかどうかを確認し、キーが空の場合は$wishDescriptionIsEmptyフラグをtrueに変更します。PHPブロックのコードがさらに実行されることはなく、Add Wishフォームが再ロードされます。

「Back to the List」ボタンが押されず、ウィッシュの説明が入力されている場合、コードは入力パラメータとしてウィッシャのID、ウィッシュの説明、およびウィッシュの期日を持つ関数insert_wishをコールします。コードはユーザーをeditWishList.phpページにリダイレクトし、PHP処理を停止します。

エラー・メッセージの表示

ユーザーがウィッシュの説明を入力せずにウィッシュを保存しようとした場合、エラー・メッセージが表示されます。
次の<?php?>ブロックを、HTML入力フォーム内の「Describe your wish」入力フィールドの下に入力します。
<?php
if ($wishDescriptionIsEmpty) echo "Please enter description<br/>";
?>
$wishDescriptionIsEmptyフラグがtrueの場合は、エラー・メッセージが表示されます。フラグは、入力フォームの検証時に処理されます。

最初のindex.phpページへの復帰

ボタンを押すことによって、ユーザーがいつでもアプリケーションの最初のページに戻ることができるようにします。
この機能を実装するには、次のHTML入力フォームをeditWishList.phpファイルの終了</body>タグの前に入力します。
<form name="backToMainPage" action="index.php">
<input type="submit" value="Back To Main Page"/>
</form>
「Back to Main Page」ボタンを押すと、フォームは、ユーザーを最初のindex.phpページにリダイレクトします。

ウィッシュの追加機能のテスト

  1. アプリケーションを実行します。index.phpページで、「Username」フィールドに「Tom」、「Password」フィールドに「tomcat」と入力します。
    Edit Wish Listへのユーザー・ログオン
  2. 「Edit My Wish List」ボタンを押します。editWishList.phpページが開きます。
    「Add」ボタンが追加されたEdit Wish List
  3. 「Back to Main Page」ボタンを押します。index.phpページが開きます。
  4. 「Tom」としてログオンし、もう一度「Edit My Wish List」ボタンを押します。editWishList.phpページが開きます。
  5. 「Add Wish」ボタンを押します。editWish.phpページが開きます。フォームに入力します。
    新規ウィッシュが入力されたフォーム
    「Back to the List」ボタンを押します。editWishList.phpページが開きますが、入力したウィッシュは追加されていません。
  6. 再度「Add Wish」ボタンを押します。editWish.phpページが開きます。期日を入力し、説明を空のままにします。「Save Changes」ボタンを押します。editWish.phpページには、エラー・メッセージが表示され、期日が入力されている状態の入力フォームが表示されます。
  7. 再度「Add Wish」ボタンを押します。editWish.phpページが開きます。フォームに入力し、「Save Changes」ボタンを押します。editWishList.phpページに更新されたウィッシュのリストが表示されます。
    新しいウィッシュが追加されたウィッシュ・リスト

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

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

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

次の手順

<< 前のレッスン

次のレッスン>>

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



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

PHPの学習に戻る

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo