corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

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

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

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

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

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

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

現在のドキュメントは、チュートリアル「NetBeans IDE for PHP での 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 Change」ボタンを表す送信フィールド。
  • editWishList.php ページに戻るための「Back to the List」ボタンを表す送信フィールド。

「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 ファイルで、ファイルの先頭の <? 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 の学習に戻る