| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. |
| --> |
| <html> |
| <head> |
| <title>PHPを使用するデータベース駆動型アプリケーションの作成MySQLデータベースのレコードの編集更新および削除</title> |
| <meta name="KEYWORDS" content="CRUD, Update, Delete, MySQL, PHP, NetBeans"> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta name="DESCRIPTION" content="Creating a Database Driven Application With PHP. Edit / Update and Delete record in MySQL database" > |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css" media="screen"> |
| </head> |
| <body> |
| <h1>PHPを使用するデータベース駆動型アプリケーションの作成 </h1> |
| <h1>レッスン7: データベース内のエントリの更新および削除 </h1> |
| <div style="margin-left:-3px"> |
| <div class="feedback-box margin-around float-left" style="margin-right:15px"> |
| <h4>チュートリアルの目次:</h4> |
| <ol start="0"> |
| <li><a href="wish-list-tutorial-main-page.html">PHPを使用するデータベース駆動型アプリケーションの作成 - メイン・ページ</a></li> |
| <li><p>データベースの作成</p> <ol type="a"><li><a href="wish-list-lesson1.html">MySQLデータベースの作成</a></li> |
| <li><a href="wish-list-oracle-lesson1.html">Oracleデータベース表の作成</a></li> |
| </ol></li> |
| <li> |
| <p><a href="wish-list-lesson2.html">アプリケーションの設計。データベースからの読取り</a></p> |
| </li> |
| <li><a href="wish-list-lesson3.html">新規アプリケーション・ユーザーの作成</a></li> |
| <li><a href="wish-list-lesson4.html">コードの最適化</a></li> |
| <li><a href="wish-list-lesson5.html">セキュリティの追加。アプリケーション・ユーザー・ログオンの実装</a></li> |
| <li><a href="wish-list-lesson6.html">データベースへの新しいウィッシュの追加</a></li> |
| <li> |
| <p><b>=> データベース内のエントリの更新および削除</b></p> |
| <ul> |
| <li><a href="#previousLessonSourceCode">前のレッスンからのアプリケーション・ソース・コード</a></li> |
| <li><a href="#editWish">ウィッシュの編集</a> |
| <ul> |
| <li><a href="#addEditButton">「Edit」ボタンの実装</a></li> |
| <li><a href="#wishArrayUpdate">$wish配列の拡張</a></li> |
| <li><a href="#updateInputForm">HTML入力フォームの更新</a></li> |
| <li><a href="#updateWishRecord">データベース内のウィッシュの更新</a></li> |
| </ul> |
| </li> |
| <li><a href="#testingEditWishFunctionality">ウィッシュの編集機能のテスト</a></li> |
| <li><a href="#deleteWish">ウィッシュの削除</a></li> |
| <li><a href="#testingDeleteWishFunctionality">ウィッシュの削除機能のテスト</a></li> |
| <li><a href="#lessonResultSourceCode">現在のレッスン完了後の<br>アプリケーション・ソース・コード</a></li> |
| <li><a href="#nextSteps">次の手順</a></li> |
| </ul> |
| </li> |
| <li><a href="wish-list-lesson8.html">CSSテクノロジを使用したアプリケーションの外観の改良</a></li> |
| <li><a href="wish-list-lesson9.html">リモートWebサーバーへのアプリケーションのデプロイ</a></li> |
| </ol> |
| </div> |
| </div> |
| <img alt="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます"> |
| |
| <p>このレッスンでは、次の2つの機能を使用してアプリケーションの機能を拡張します。</p> |
| <ul> |
| <li style="margin-left:40em"><a href="#editWish">ウィッシュの編集</a></li> |
| <li style="margin-left:40em"><a href="#deleteWish">ウィッシュの削除</a></li> |
| </ul> |
| <p>これらの機能を実装するには、<tt>editWishList.php</tt>ファイルと<tt>editWish.php</tt>ファイルを編集します。また、<tt>deleteWish.php</tt>という名前の新しいファイルも作成します。</p> |
| <img alt="レッスン7で影響を受けるPHPプロジェクト・フロー" class="margin-around" src="../../../images_www/articles/72/php/oracle-wishlist/page-flow-diagram-l7.png"> |
| <p>現在のドキュメントは、PHP向けのNetBeans IDEでのCRUDアプリケーションの作成というPHPチュートリアルの一部です。</p><br style="clear:left"> |
| |
| <h2><a name="previousLessonSourceCode"></a>前のレッスンからのアプリケーション・ソース・コード</h2> |
| <p>MySQLユーザー: 前のレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、<a href="https://netbeans.org/files/documents/4/1932/lesson6.zip" target="_blank">ここ</a>をクリックします。 </p> |
| <p>Oracleデータベース・ユーザー: 前のレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、<a href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson6.zip" target="_blank">ここ</a>をクリックします。</p> |
| <h2><a id="editWish" name="editWish"></a>ウィッシュの編集</h2> |
| この機能は、次のユース・ケースをサポートしています。 |
| <ul> |
| <li><tt>editWishList.php</tt>ページで、ユーザーがウィッシュの右にある「Edit」ボタンを押す。選択したウィッシュのデータがある<tt>editWish.php</tt>ページが開く。</li> |
| <li>ユーザーがウィッシュの説明または期日(あるいはその両方)を変更し、「Save Changes」ボタンを押す。 </li> |
| <li>説明が入力されて<em>いない</em>場合、エラー・メッセージが表示され、ユーザーが<tt>editWish.php</tt>ページに戻される。 </li> |
| <li>説明が入力されている場合、アプリケーションはウィッシュが更新される<tt>editWishList.php</tt>ページに戻る。</li> |
| </ul> |
| <p>この実装は、次の手順から構成されます。</p> |
| <ul> |
| <li><a href="#addEditButton">editWishListページに「Edit」ボタンを追加する</a></li> |
| <li><a href="#wishArrayUpdate">editWish.phpページで、ウィッシュのデータを格納する配列$wishを更新する</a></li> |
| <li><a href="#updateInputForm">editWish.phpページの入力フォームを更新する</a></li> |
| <li><a href="#updateWishRecord">送信されたデータを検証し、データベース内のウィッシュを更新する</a> </li> |
| </ul> |
| <div class="indent"><h3><a id="addEditButton" name="addEditButton"></a>「Edit」ボタンの実装 </h3> |
| <p><tt>editWishList.php</tt>では、ウィッシャのウィッシュを含む表は、ウィッシュがデータベースから選択されるときに、ウィッシュを含む行を表示するループ(<tt>while</tt>文)によって実装されています。行の一番右のセルとして「Edit」ボタンを追加します。</p> |
| <ol><li>HTML入力フォームを使用してウィッシュのIDを転送するには、そのIDを変数に格納します。次のコード行を<tt>while</tt>ループの末尾に入力します。 |
| <pre class="examplecode">while ($row = ...) {<br> echo ...<br> echo ...<br> <strong>$wishID = $row["id"];</strong><br> |
| } |
| ?></pre> |
| </li> |
| <li>編集ボタンを実装します。editWishフォームを使用して、終了の</table>タグの前に別の表のセルを追加します。このフォームには、ボタン・コンポーネントと、ボタンがクリックされたときに<tt>$wishID</tt>の値を送信する非表示コンポーネントが含まれています。(MySQLデータベース用のコードが示されていますが、追加されるコードはOracleデータベースの場合も同じで、同じ場所になります。) |
| <pre class="examplecode"> |
| Hello <?php echo $_SESSION["user"]; ?><br/><br> <table border="black"><br> <tr><th>Item</th><th>Due Date</th></tr><br> <?php<br> require_once("Includes/db.php");<br> $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);<br> $result = WishDB::getInstance()->get_wishes_by_wisher_id($wisherID);<br> while ($row = mysqli_fetch_array($result)) {<br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td></tr>\n";<br> }<br> mysqli_free_result($result);<br> ?> |
| <strong><td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td></strong><br> </table></pre> |
| </li> |
| <li><tt>while</tt>ループを変更して<a href="http://www.php.net/manual/en/control-structures.alternative-syntax.php" target="_blank">代替構文</a>を使用します。これにより、<tt>while</tt>ループ内のHTMLブロックを実行しやすくなります。代替の<tt>while</tt>ループ構文では、開始の中括弧{がコロン(:)に置き換えられ、終了の中括弧}が<tt>endwhile;</tt>文に置き換えられます。開始の中括弧をコロンに置き換え、終了の中括弧を削除し、<tt>endwhile;</tt>文を使用して終了の</table>タグの前に新しいPHPブロックを追加します。これにより、新しい表のセルが<tt>while</tt>ループに組み込まれます。結果または文を解放するコードを<tt>endwhile;</tt>文の後に移動します。(ここでも、MySQL用のコードが示されていますが、コード変更および場所はOracleデータベースの場合も同じです。) |
| <pre class="examplecode"> while ($row = mysqli_fetch_array($result))<del>{</del><strong>:</strong><br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td></tr>\n";<br><del> }<br> mysqli_free_result($result);</del><br> ?> |
| <td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td> |
| <strong> <?php |
| endwhile; |
| mysqli_free_result($result); |
| ?></strong> |
| </table></pre> |
| </li> |
| <li> |
| <p>表の行の構文を修正します。行を終了する</tr>\n文字を、期日のecho文から<tt>endwhile;</tt>のすぐ上の新しいecho文に移動します。</p> |
| <pre class="examplecode"> while ($row = mysqli_fetch_array($result))<del></del><strong>:</strong><br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td><del></tr>\n</del>";<br> ?> |
| <td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td> |
| <?php |
| <strong>echo "</tr>\n";</strong> |
| endwhile; |
| mysqli_free_result($result); |
| ?> |
| </table></pre> |
| </li> |
| <li> |
| <p><tt>while</tt>ループ内に「Edit」ボタンを持つフォームを含む表の全体は、次のようになります。</p> |
| <p><b>MySQLデータベースの場合:</b></p> |
| <pre class="examplecode"><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></pre> |
| <p><b>Oracleデータベースの場合:</b></p> |
| |
| |
| <pre class="examplecode"><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></pre> |
| </li> |
| </ol> |
| <h3><a id="wishArrayUpdate" name="wishArrayUpdate"></a><tt>$wish</tt>配列の拡張 </h3> |
| <p><tt>editWishList.php</tt>ページで「Edit」ボタンを押すと、選択したウィッシュのIDがサーバー・リクエスト・メソッドGETを介して<tt>editWish.php</tt>ページに転送されます。ウィッシュのIDを格納するには、<tt>$wish</tt>配列に新しい要素を追加する必要があります。 </p> |
| <p>新しいウィッシュを追加するときに、それを保存しようとして失敗した後で、<tt>editWishList.php</tt>ページと<tt>editWish.php</tt>ページの両方から入力フォームにアクセスできます。データを転送するサーバー・リクエスト・メソッドによって、ケースが識別されます。GETは、ユーザーが「Edit Wish」を押して最初にページに達するときに、フォームが表示されることを示します。POSTは、説明なしでウィッシュを保存しようとした後、ユーザーがフォームにリダイレクトされることを示します。 </p> |
| <p><tt>editWish.php</tt>内で、HTML <body>内の<tt>EditWish</tt>入力フォームの上にあるPHPブロックを、<tt>$wish</tt>配列の拡張されたコードで置き換えます。</p> |
| <p><strong>MySQLデータベースの場合:</strong></p> |
| <pre class="examplecode"><?php<br>if ($_SERVER["REQUEST_METHOD"] == "POST")<br>$wish = array("id" => $_POST["wishID"], "description" => |
| $_POST["wish"], "due_date" => $_POST["dueDate"]);<br>else if (array_key_exists("wishID", $_GET))<br>$wish = mysqli_fetch_array(WishDB::getInstance()->get_wish_by_wish_id($_GET["wishID"]));<br>else<br>$wish = array("id" => "", "description" => "", "due_date" => "");<br>?></pre> |
| <p><strong>Oracleデータベースの場合:</strong></p> |
| <pre class="examplecode"><?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" => ""); |
| ?></pre> |
| |
| <p>このコードは、<tt>id</tt>、<tt>description</tt>、および<tt>due_date</tt>の3つの要素を持つ<tt>$wish</tt>配列を初期化します。これらの要素の値はサーバー・リクエスト・メソッドに依存します。サーバー・リクエスト・メソッドがPOSTの場合、値は入力フォームから受け取ります。また、サーバー・リクエスト・メソッドがGETで、$_GET配列にキー「wishID」を持つ要素が含まれている場合、値は関数get_wish_by_wish_idによってデータベースから取得されます。最後に、サーバー・リクエスト・メソッドがPOSTおよびGET以外の場合、つまり新しいウィッシュの追加のユース・ケースが行われた場合、要素は空になります。 </p> |
| <p>前述のコードは、ウィッシュを作成および編集するケースをカバーしています。また、入力フォームを両方のケースに使用できるように、入力フォームを更新する必要があります。 </p> |
| <h3><a id="updateInputForm" name="updateInputForm"></a>HTML入力フォームの更新</h3> |
| 現時点では、新しいウィッシュを作成するとき、ウィッシュIDがなくても入力フォームは機能します。既存のウィッシュを編集する場合にフォームが機能するようにするには、ウィッシュのIDを転送するための非表示フィールドを追加する必要があります。非表示フィールドの値は、$wish配列から取得されます。新しいウィッシュの作成中、この値は空の文字列です。ウィッシュが編集される場合、非表示フィールドの値がウィッシュのIDに変わります。この非表示フィールドを作成するには、<tt>editWish.php</tt>の<tt>EditWish</tt>入力フォームの先頭に次の行を追加します。 |
| <pre class="examplecode"><input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>["id"];?>" /></pre> |
| <h3><a id="updateWishRecord" name="updateWishRecord"></a>データベース内のウィッシュの更新 </h3> |
| <p>入力データを確認してウィッシュをデータベースに挿入するコードを更新する必要があります。現在のコードは、新しいウィッシュを作成するケースと既存のウィッシュを更新するケースを区別しません。現在の実装では、コードが入力フォームから転送されたウィッシュIDの値を確認しないため、新しいレコードは常にデータベースに追加されます。 </p> |
| <p>次の機能を追加する必要があります。</p> |
| <ul> |
| <li>転送された要素「wishID」が空の文字列の場合、新しいウィッシュを作成する。</li> |
| <li>また、要素「wishID」が空の文字列でない場合、ウィッシュを更新する。</li> |
| </ul> |
| <p><strong>ウィッシュが新規であるかどうかを確認し、新規でない場合はウィッシュを更新するようにeditWish.phpを更新するには:</strong></p> |
| <ol> |
| <li> |
| <p><tt>update_wish</tt>関数を<tt>db.php</tt>に追加します。 </p> |
| <p><b>MySQLデータベースの場合:</b></p> |
| <pre class="examplecode">public function update_wish($wishID, $description, $duedate){ |
| $description = $this->real_escape_string($description);<br> if ($duedate==''){<br> $this->query("UPDATE wishes SET description = '" . $description . "',<br> due_date = NULL WHERE id = " . $wishID);<br> } else<br> $this->query("UPDATE wishes SET description = '" . $description .<br> "', due_date = " . $this->format_date_for_sql($duedate)<br> . " WHERE id = " . $wishID);<br>} </pre> |
| <p><b>Oracleデータベースの場合:</b></p> |
| <pre class="examplecode">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); |
| |
| }</pre> |
| </li> |
| <li> |
| <p><tt>get_wish_by_wish_id</tt>関数を<tt>db.php</tt>に追加します。 </p> |
| <p><b>MySQLデータベースの場合:</b></p> |
| <pre class="examplecode">public function get_wish_by_wish_id ($wishID) {<br> return $this->query("SELECT id, description, due_date FROM wishes WHERE id = " . $wishID);<br>}</pre> |
| <p><b>Oracleデータベースの場合:</b></p> |
| <pre class="examplecode">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; |
| }</pre> |
| |
| </li> |
| <li><tt>editWish.php</tt>のメインとなる先頭のPHPブロックで、最後の<code>else</code>文に条件を追加します。これはデータベースにウィッシュを挿入する<tt>else</tt>文です。これを<tt>else if</tt>文に変更します。 |
| <pre class="examplecode">else if ($_POST["wishID"]=="") {<br> WishDB::getInstance()->insert_wish($wisherID, $_POST["wish"], $_POST["dueDate"]);<br> header('Location: <tt>editWishList.php</tt>' );<br> exit;<br>}</pre></li> |
| <li> |
| |
| 別の<tt>else if</tt>文を、前に編集した文の下に入力するか、または貼り付けます。 |
| |
| <pre class="examplecode">else if ($_POST["wishID"]!="") {<br> WishDB::getInstance()->update_wish($_POST["wishID"], $_POST["wish"], $_POST["dueDate"]);<br> header('Location: <tt>editWishList.php</tt>' );<br> exit; |
| } </pre> |
| </li> |
| </ol> |
| <p>このコードは、<tt>$_POST</tt>配列内の<tt>wishID</tt>要素が空の文字列ではないことを確認します(これは、ユーザーが「Edit」ボタンを押すことによって<tt>editWishList.php</tt>ページからリダイレクトされたこと、および、ユーザーがウィッシュの説明を入力していたことを意味します)。確認が成功すると、コードは入力パラメータ<tt>wishID</tt>、<tt>description</tt>、および<tt>dueDate</tt>を使用して関数<tt>update_wish</tt>をコールします。これらのパラメータは、HTML入力フォームからPOSTメソッドを介して受け取ります。<tt>update_wish</tt>がコールされた後、アプリケーションは<tt>editWishList.php</tt>ページにリダイレクトされ、PHP処理は取り消されます。 </p> |
| </div> |
| <h2><a name="testingEditWishFunctionality"></a>ウィッシュの編集機能のテスト </h2> |
| <ol> |
| <li>アプリケーションを実行します。index.phpページで、「Username」フィールドに「Tom」、「Password」フィールドに「tomcat」と入力します。<br> <img alt="ウィッシュ・リストを編集するためのユーザー・ログオン" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/user-logon-to-edit-wish-list.png"></li> |
| <li> 「Edit My Wish List」ボタンを押します。<tt>editWishList.php</tt>ページが開きます。<br> <img alt="「Edit」ボタンが追加された<tt>editWishList.php</tt>ページ" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/edit-wish-list-edit-wish.png"></li> |
| <li>「Icecream」の横の「Edit」をクリックします。<tt>editWish.php</tt>ページが開きます。<br><img alt="ウィッシュの編集用フォームがある<tt>editWish.php</tt>ページ。フィールドにウィッシュ・データが入力されています。" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/edit-wish.png"></li> |
| <li>フィールドを編集して「Back to the List」を押します。<tt>editWishList.php</tt>ページが開きますが、変更は保存されていません。</li> |
| <li>「Icecream」の横の「Edit」を押します。「Describe your wish」フィールドをクリアして「Save Changes」を押します。エラー・メッセージが表示されます。<br><img alt="エラー・メッセージが表示されたウィッシュの編集用フォーム: 説明は入力されていません" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/editWishEmptyDescription.png"></li> |
| <li>「Describe your wish」フィールドに「Chocolate icecream」と入力し、「Save Changes」を押します。<tt>editWishList.php</tt>ページが開き、更新されたリストが表示されます。<br><img alt="editWishList.phpページ: リスト上の更新されたウィッシュ" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/editWishListWishAdded.png"> </li> |
| </ol> |
| |
| <h2><a id="deleteWish" name="deleteWish"></a>ウィッシュの削除 </h2> |
| <p>ウィッシュの作成、読取り、更新ができるようになったので、ウィッシュを削除するメソッドを追加します。</p> |
| <p><strong>ユーザーがウィッシュを削除できるようにするには:</strong></p> |
| <ol> |
| <li><p><tt>delete_wish</tt>関数を<tt>db.php</tt>に追加します。</p> |
| <p><b>MySQLデータベースの場合:</b></p> |
| <pre class="examplecode">function delete_wish ($wishID){<br> $this->query("DELETE FROM wishes WHERE id = " . $wishID);<br>} |
| </pre> |
| <p><b>Oracleデータベースの場合:</b></p> |
| <pre class="examplecode">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); |
| }</pre> |
| |
| </li> |
| <li><tt>deleteWish.php</tt>という名前の新しいPHPファイルを作成し、次のコードを<?php?>ブロック内に入力します。 |
| <pre class="examplecode">require_once("Includes/db.php");<br>WishDB::getInstance()->delete_wish ($_POST["wishID"]);<br>header('Location: <tt>editWishList.php</tt>' );</pre> |
| このコードにより、<tt>db.php</tt>ファイルが使用できるようになります。入力パラメータとして<tt>wishID</tt>を使用し、WishDBのインスタンスから<tt>delete_wish</tt>関数をコールします。最後に、アプリケーションが<tt>editWishList.php</tt>ページにリダイレクトされます。</li> |
| <li>「Delete」ボタンを実装するには、別のHTML表のセルを、<tt>editWishList.php</tt>の<tt>while</tt>ループの内部で、<tt>editWish</tt>ボタンのコード・ブロックのすぐ下に追加します。HTML入力フォームには、<tt>wishID</tt>用の非表示フィールドと、「Delete」というラベルが付いた送信ボタンが含まれています。(MySQLデータベース用のコードが示されていますが、追加されるコードはOracleデータベースの場合も同じで、同じ場所になります。) |
| |
| <pre class="examplecode"> while ($row = mysqli_fetch_array($result))<del></del><strong>:</strong><br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td><del></tr>\n</del>";<br> ?> |
| <td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td> |
| <strong><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></strong> |
| <?php |
| echo "</tr>\n"; |
| endwhile; |
| mysqli_free_result($result); |
| ?> |
| </table></pre> |
| </li></ol> |
| |
| <p><tt>while</tt>ループ内に「Edit」ボタンを持つフォームを含む表の全体は、次のようになります。</p> |
| <p><b>MySQLデータベースの場合:</b></p> |
| <pre class="examplecode"><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> |
| <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></pre> |
| <p><b>Oracleデータベースの場合:</b> </p> |
| <pre class="examplecode"><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></pre> |
| |
| <h2><a name="testingDeleteWishFunctionality"></a>ウィッシュの削除機能のテスト</h2> |
| <p>機能が正しく実装されたことを確認するには、<tt>editWishList.php</tt>ページで任意の項目の横にある「Delete」を押します。その項目がリストに表示されなくなります。</p> |
| <img alt="editWishList.phpページ: ウィッシュの削除" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/deleteWish.png"> |
| |
| <h2><a name="lessonResultSourceCode"></a>現在のレッスン完了後のアプリケーション・ソース・コード </h2> |
| <p>MySQLユーザー: このレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、<a href="https://netbeans.org/files/documents/4/1933/lesson7.zip" target="_blank">ここ</a>をクリックします。</p> |
| <p>Oracleデータベース・ユーザー: このレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、<a href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson7.zip" target="_blank">ここ</a>をクリックします。</p> |
| <h2><a name="nextSteps"></a>次の手順</h2> |
| <p> <a href="wish-list-lesson6.html"><< 前のレッスン</a><br><br><a href="wish-list-lesson8.html">次のレッスン>></a><br><br><a href="wish-list-tutorial-main-page.html">チュートリアルのメイン・ページに戻る</a> </p> |
| <br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%207:%20Updating%20and%20Deleting%20DB%20Entries">このチュートリアルに関するご意見をお寄せください</a></div> |
| <br style="clear:both;" > |
| <p><a href="../../../community/lists/top.html">users@php.netbeans.orgメーリング・リストに登録する</a>ことによって、NetBeans IDE PHP開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。 |
| <p><a href="wish-list-tutorial-main-page.html"></a> |
| <p> |
| <a href="../../trails/php.html">PHPの学習に戻る</a><br> |
| |
| </p> |
| </body> |
| </html> |