corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

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

レッスン 7: データベース内のエントリの更新および削除

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

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

これらの機能を実装するために、editWishList.php ファイルと editWish.php ファイルを編集します。deleteWish.php という名前の新しいファイルも作成します。

レッスン 7 で影響を受ける PHP プロジェクトフロー

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


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

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

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

ウィッシュの編集

この機能は、次のユースケースをサポートしています。
  • editWishList.php ページで、ユーザーがウィッシュの右にある「Edit」ボタンを押す。選択したウィッシュのデータがある editWish.php ページが開く。
  • ユーザーがウィッシュの説明または期日、あるいはその両方を変更し、「Save Changes」ボタンを押す。
  • 説明が入力されていない場合、エラーメッセージが表示され、ユーザーが editWish.php ページに戻される。
  • 説明が入力されている場合、アプリケーションはウィッシュが更新される editWishList.php ページに戻る。

この実装は、次の手順から構成されます。

「Edit」ボタンの実装

editWishList.php では、ウィッシャーのウィッシュを持つ表は、ウィッシュがデータベースから選択される間に、ウィッシュを持つ行を表示するループ (while 文) で実装されています。行の一番右のセルとして「Edit」ボタンを追加します。

  1. HTML 入力フォームを使用してウィッシュの ID を転送するには、その ID を変数に格納します。次のコード行を while ループの末尾に入力します。
    while ($row = ...) {
    echo ...
    echo ...
    $wishID = $row["id"];
    } ?>
  2. 「Edit」ボタンを実装します。終了 </table> タグの前に表のセルをもう 1 つ追加し、そこに editWish フォームを含めます。このフォームには、ボタンコンポーネントと、ボタンがクリックされたときに $wishID の値を送信する非表示コンポーネントがあります。(MySQL データベースのコードを示していますが、Oracle データベースの場合も同じコードを同じ場所に追加します。)
       Hello <?php echo $_SESSION["user"]; ?><br/>
    <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";
    }
    mysqli_free_result($result);
    ?> <td> <form name="editWish" action="editWish.php" method="GET"> <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/> <input type="submit" name="editWish" value="Edit"/> </form> </td>
    </table>
  3. 代替構文を使用して while ループを変更します。これにより、while ループ内で HTML ブロックを簡単に実行できるようになります。代替構文の while ループでは、左中括弧 { はコロン : で、右中括弧 } は endwhile; 文で置き換えられます。左中括弧をコロンで置き換え、右中括弧を削除します。終了 </table> タグの前に新しい PHP ブロックを追加し、そこに endwhile; 文を含めます。これで、新しい表のセルが while ループに組み込まれます。結果の解放または文の解放のコードを endwhile; 文のあとに移動します。(ここでも MySQL のコードを示していますが、Oracle データベースの場合もコードの変更内容と場所は同じです。)
        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);

    ?> <td> <form name="editWish" action="editWish.php" method="GET"> <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/> <input type="submit" name="editWish" value="Edit"/> </form> </td> <?php endwhile; mysqli_free_result($result); ?> </table>
  4. 表の行の構文を修正します。期日の echo 文から、行の終了を表す </tr>\n という文字を、endwhile; の直前の新しい echo 文に移動します。

        while ($row = mysqli_fetch_array($result)):
    echo "<tr><td>" . htmlentities($row["description"]) . "</td>";
    echo "<td>".htmlentities($row["due_date"]) . "</td></tr>\n";
    ?> <td> <form name="editWish" action="editWish.php" method="GET"> <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/> <input type="submit" name="editWish" value="Edit"/> </form> </td> <?php echo "</tr>\n"; endwhile; mysqli_free_result($result); ?> </table>
  5. while ループ内に「Edit」ボタンを持つフォームを含む表の全体は、次のようになります。

    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>";
            $wishID = $row["id"];
        ?>
        <td>
            <form name="editWish" action="editWish.php" method="GET">
                <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
                <input type="submit" name="editWish" value="Edit"/>
            </form>
        </td>
        <?php
        echo "</tr>\n";
        endwhile;
        mysqli_free_result($result);
        ?>
    </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>";
            $wishID = $row["ID"];
        ?>
        <td>
            <form name="editWish" action="editWish.php" method="GET">
                <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
                <input type="submit" name="editWish" value="Edit"/>
            </form>
        </td>
        <td>
            <form name="deleteWish" action="deleteWish.php" method="POST">
                <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
                <input type="submit" name="deleteWish" value="Delete"/>
            </form>
        </td>
        <?php
        echo "</tr>\n";
        endwhile;
        oci_free_statement($stid);
       ?>
    </table>

$wish 配列の拡張

editWishList.php ページで「Edit」ボタンを押すと、選択したウィッシュの ID がサーバー要求メソッド GET を介して editWish.php ページに転送されます。ウィッシュの ID を格納するには、$wish 配列に新しい要素を追加する必要があります。

新しいウィッシュを追加するときに、それを保存しようとして失敗したあとで、editWishList.php ページと editWish.php ページの両方から入力フォームにアクセスできます。データを転送するサーバー要求メソッドによって、ケースが識別されます。GET は、ユーザーが「Edit Wish」を押して最初にページに達するときに、フォームが表示されることを示します。POST は、説明なしでウィッシュを保存しようとしたあと、ユーザーがフォームにリダイレクトされることを示します。

editWish.php で、EditWish 入力フォームの上にある HTML <body> 内の PHP ブロックを、$wish 配列の拡張済みコードで置き換えます。

MySQL データベースの場合:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST")
$wish = array("id" => $_POST["wishID"], "description" => $_POST["wish"], "due_date" => $_POST["dueDate"]);
else if (array_key_exists("wishID", $_GET))
$wish = mysqli_fetch_array(WishDB::getInstance()->get_wish_by_wish_id($_GET["wishID"]));
else
$wish = array("id" => "", "description" => "", "due_date" => "");
?>

Oracle データベースの場合:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST")
    $wish = array("id" => $_POST["wishID"], "description" =>
            $_POST["wish"], "due_date" => $_POST["dueDate"]);
else if (array_key_exists("wishID", $_GET)) {
    $stid = WishDB::getInstance()->get_wish_by_wish_id($_GET["wishID"]);
    $row = oci_fetch_array($stid, OCI_ASSOC);
    $wish = array("id" => $row["ID"], "description" =>
                $row["DESCRIPTION"], "due_date" => $row["DUE_DATE"]);
    oci_free_statement($stid);
} else
$wish = array("id" => "", "description" => "", "due_date" => "");
?>

コードは、iddescription、および due_date の 3 つの要素を持つ $wish 配列を初期化します。3 つの要素の値はサーバー要求メソッドに依存します。サーバー要求メソッドが POST の場合、値は入力フォームから受け取ります。サーバー要求フォームが GET で、$_GET 配列にキー「wishID」を持つ要素が含まれている場合、値は関数 get_wish_by_wish_id によってデータベースから取得されます。最後に、サーバー要求メソッドが POST および GET 以外の場合、つまり新しいウィッシュの追加のユースケースが行なわれた場合、要素は空になります。

前出のコードは、ウィッシュを作成および編集するケースをカバーしています。また、入力フォームを両方のケースに使用できるように、入力フォームを更新する必要があります。

HTML 入力フォームの更新

現在の入力フォームは、ウィッシュ ID が存在していない新しいウィッシュを作成する場合に機能します。このフォームを既存のウィッシュの編集にも使用できるようにするには、ウィッシュの ID を転送する非表示フィールドを追加する必要があります。非表示フィールドの値は、$wish 配列 から取得されます。新しいウィッシュの作成中、この値は空の文字列です。ウィッシュが編集される場合、非表示フィールドの値がウィッシュの ID に変わります。この非表示フィールドを作成するには、次の行を editWish.phpEditWish 入力フォームの最上部に追加します。
<input type="hidden" name="wishID" value="<?php echo $wish["id"];?>" />

データベース内のウィッシュの更新

入力データを検査してウィッシュをデータベースに挿入するコードを更新する必要があります。現在のコードは、新しいウィッシュを作成するケースと既存のウィッシュを更新するケースを区別しません。現在の実装では、コードが入力フォームから転送されたウィッシュ ID の値を検査しないため、新しいレコードは常にデータベースに追加されます。

次の機能を追加する必要があります。

  • 転送された要素「wishID」が空の文字列の場合、新しいウィッシュを作成する。
  • 要素「wishID」が空の文字列でない場合、ウィッシュを更新する。

ウィッシュが新規であるかどうかを検査し、新規でない場合はウィッシュを更新するように editWish.php を更新するには、次の手順に従います。

  1. update_wish 関数を db.php に追加します。

    MySQL データベースの場合:

    public function update_wish($wishID, $description, $duedate){
        $description = $this->real_escape_string($description);
    if ($duedate==''){
    $this->query("UPDATE wishes SET description = '" . $description . "',
    due_date = NULL WHERE id = " . $wishID);
    } else
    $this->query("UPDATE wishes SET description = '" . $description .
    "', due_date = " . $this->format_date_for_sql($duedate)
    . " WHERE id =" . $wishID);
    }

    Oracle データベースの場合:

    public function update_wish($wishID, $description, $duedate) {
        $query = "UPDATE wishes SET description = :desc_bv, due_date = to_date(:due_date_bv, 
                  'YYYY-MM-DD')  WHERE id = :wish_id_bv";
        $stid = oci_parse($this->con, $query);
        oci_bind_by_name($stid, ':wish_id_bv', $wishID);
        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);
    
    }
  2. get_wish_by_wish_id 関数を db.php に追加します。

    MySQL データベースの場合:

    public function get_wish_by_wish_id ($wishID) {
    return $this->query("SELECT id, description, due_date FROM wishes WHERE id = " . $wishID);
    }

    Oracle データベースの場合:

    public function get_wish_by_wish_id($wishID) {
        $query = "SELECT id, description, due_date FROM wishes WHERE id = :wish_id_bv";
        $stid = oci_parse($this->con, $query);
        oci_bind_by_name($stid, ':wish_id_bv', $wishID);
        oci_execute($stid);
        return $stid;
    }

  3. editWish.php の先頭にあるメイン PHP ブロックで、最後の else 文に条件を追加します。これは、ウィッシュをデータベースに挿入する else 文です。これを次の else if 文に変更します。
    else if ($_POST["wishID"]=="") {
    WishDB::getInstance()->insert_wish($wisherID, $_POST["wish"], $_POST["dueDate"]);
    header('Location: editWishList.php' );
    exit;
    }
  4. 次の別の else if 文を、先ほど編集した文の下に入力またはペーストします。
    else if ($_POST["wishID"]!="") {
    WishDB::getInstance()->update_wish($_POST["wishID"], $_POST["wish"], $_POST["dueDate"]);
    header('Location: editWishList.php' );
    exit; }

コードは、$_POST 配列内の wishID 要素が空の文字列ではないことを確認します。これは、ユーザーが「Edit」ボタンを押すことによって editWishList.php ページからリダイレクトされたこと、また、ユーザーがウィッシュの説明を入力していたことを意味します。確認が成功すると、コードは入力パラメータ wishIDdescription、および dueDate を持つ関数 update_wish を呼び出します。これらのパラメータは、HTML 入力フォームから POST メソッドを介して受け取ります。update_wish が呼び出されたあと、アプリケーションは editWishList.php ページにリダイレクトされ、PHP 処理は取り消されます。

ウィッシュの編集機能のテスト

  1. アプリケーションを実行します。index.php ページで、「Username」フィールドに「Tom」、「Password 」フィールドに「tomcat」と入力します。
    ウィッシュリストを編集するためのユーザーログオン
  2. 「Edit My Wish List」ボタンを押します。editWishList.php ページが開きます。
    <tt>editWishList.php</tt> ページに「Edit」ボタンが追加されたところ
  3. 「Icecream」の横の「Edit」をクリックします。editWish.php ページが開きます。
    ウィッシュの編集用フォームを持つ <tt>editWish.php</tt> ページ。フィールドにウィッシュデータが入力されています。
  4. フィールドを編集して「Back to the List」を押します。editWishList.php ページが開きますが、変更は保存されていません。
  5. 「Icecream」の横の「Edit」を押します。「Describe your wish」フィールドを削除して「Save Changes」を押します。エラーメッセージが表示されます。
    エラーメッセージを表示したウィッシュの編集用フォーム: 説明の入力なし
  6. 「Describe your wish」フィールドに「Chocolate icecream」と入力し、「Save Changes」を押します。editWishList.php ページが開き、更新されたリストが表示されます。
    editWishList.php ページ: リスト上の updatedwish

ウィッシュの削除

ウィッシュの作成、読み取り、更新ができるようになったので、ウィッシュを削除する方法を追加します。

ユーザーがウィッシュを削除できるようにするには、次の手順に従います。

  1. delete_wish 関数を db.php に追加します。

    MySQL データベースの場合:

    function delete_wish ($wishID){
    $this->query("DELETE FROM wishes WHERE id = " . $wishID);
    }

    Oracle データベースの場合:

    public function delete_wish($wishID) {
        $query = "DELETE FROM wishes WHERE id = :wish_id_bv";
        $stid = oci_parse($this->con, $query);
        oci_bind_by_name($stid, ':wish_id_bv', $wishID);
        oci_execute($stid); 
    }

  2. deleteWish.php という名前の新しい PHP ファイルを作成し、次のコードを <? php ?> ブロック内に入力します。
    require_once("Includes/db.php");
    WishDB::getInstance()->delete_wish ($_POST["wishID"]);
    header('Location: editWishList.php' );
    このコードにより、db.php ファイルが使用できるようになります。入力パラメータとして wishID を使用し、WishDB のインスタンスから delete_wish 関数を呼び出します。最後に、アプリケーションが editWishList.php ページにリダイレクトされます。
  3. 「Delete」ボタンを実装するには、editWishList.phpwhile ループの内部、editWish ボタンのコードブロックのすぐ下に、HTML 表のセルをもう 1 つ追加します。HTML 入力フォームには、wishID 用の非表示フィールドと、「Delete」というラベルが付いた送信ボタンが含まれています。(MySQL データベースのコードを示していますが、Oracle データベースの場合も同じコードを同じ場所に追加します。)
        while ($row = mysqli_fetch_array($result)):
    echo "<tr><td>" . htmlentities($row["description"]) . "</td>";
    echo "<td>".htmlentities($row["due_date"]) . "</td></tr>\n";
    ?> <td> <form name="editWish" action="editWish.php" method="GET"> <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/> <input type="submit" name="editWish" value="Edit"/> </form> </td> <td> <form name="deleteWish" action="deleteWish.php" method="POST"> <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/> <input type="submit" name="deleteWish" value="Delete"/> </form> </td> <?php echo "</tr>\n"; endwhile; mysqli_free_result($result); ?> </table>

while ループ内に「Edit」ボタンを持つフォームを含む表の全体は、次のようになります。

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(mysqli_real_escape_string($_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>";
        $wishID = $row["id"];
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="editWish" value="Edit"/>
        </form>
    </td>
    <td>
        <form name="deleteWish" action="deleteWish.php" method="POST">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="deleteWish" value="Delete"/>
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    mysqli_free_result($result);
    ?>
</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>";
        $wishID = $row["ID"];
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="editWish" value="Edit"/>
        </form>
    </td>
    <td>
        <form name="deleteWish" action="deleteWish.php" method="POST">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="deleteWish" value="Delete"/>
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    oci_free_statement($stid);
   ?>
</table>

ウィッシュの削除機能のテスト

機能が正しく実装されたことを確認するには、editWishList.php ページで任意の項目の横にある「Delete」を押します。その項目がリストからなくなります。

editWishList.php ページ: ウィッシュが削除されたところ

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

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

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

次の手順

<< 前のレッスン

次のレッスン >>

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



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

PHP の学習に戻る