PHP を使用するデータベース駆動型アプリケーションの作成
レッスン 7: データベース内のエントリの更新および削除
このレッスンでは、次の 2 つの機能を使用してアプリケーションの機能を拡張します。
これらの機能を実装するために、editWishList.php ファイルと editWish.php ファイルを編集します。deleteWish.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」ボタンを追加します。
HTML 入力フォームを使用してウィッシュの ID を転送するには、その ID を変数に格納します。次のコード行を while ループの末尾に入力します。
while ($row = ...) { echo ... echo ... $wishID = $row["id"];
}
?>
「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 $wish ID; ?>"/>
<input type="submit" name="editWish" value="Edit"/>
</form>
</td> </table>
代替構文 を使用して 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 $wish ID; ?>"/>
<input type="submit" name="editWish" value="Edit"/>
</form>
</td>
<?php
endwhile;
mysqli_free_result($result);
?>
</table>
表の行の構文を修正します。期日の 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 $wish ID; ?>"/>
<input type="submit" name="editWish" value="Edit"/>
</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($_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" => "");
?>
コードは、id 、description 、および due_date の 3 つの要素を持つ $wish 配列を初期化します。3 つの要素の値はサーバー要求メソッドに依存します。サーバー要求メソッドが POST の場合、値は入力フォームから受け取ります。サーバー要求フォームが GET で、$_GET 配列にキー「wishID」を持つ要素が含まれている場合、値は関数 get_wish_by_wish_id によってデータベースから取得されます。最後に、サーバー要求メソッドが POST および GET 以外の場合、つまり新しいウィッシュの追加のユースケースが行なわれた場合、要素は空になります。
前出のコードは、ウィッシュを作成および編集するケースをカバーしています。また、入力フォームを両方のケースに使用できるように、入力フォームを更新する必要があります。
HTML 入力フォームの更新
現在の入力フォームは、ウィッシュ ID が存在していない新しいウィッシュを作成する場合に機能します。このフォームを既存のウィッシュの編集にも使用できるようにするには、ウィッシュの ID を転送する非表示フィールドを追加する必要があります。非表示フィールドの値は、
$wish 配列 から取得されます。新しいウィッシュの作成中、この値は空の文字列です。ウィッシュが編集される場合、非表示フィールドの値がウィッシュの ID に変わります。この非表示フィールドを作成するには、次の行を
editWish.php の
EditWish 入力フォームの最上部に追加します。
<input type="hidden" name="wishID" value="<?php echo $wish ["id"];?>" />
データベース内のウィッシュの更新
入力データを検査してウィッシュをデータベースに挿入するコードを更新する必要があります。現在のコードは、新しいウィッシュを作成するケースと既存のウィッシュを更新するケースを区別しません。現在の実装では、コードが入力フォームから転送されたウィッシュ ID の値を検査しないため、新しいレコードは常にデータベースに追加されます。
次の機能を追加する必要があります。
転送された要素「wishID」が空の文字列の場合、新しいウィッシュを作成する。
要素「wishID」が空の文字列でない場合、ウィッシュを更新する。
ウィッシュが新規であるかどうかを検査し、新規でない場合はウィッシュを更新するように editWish.php を更新するには、次の手順に従います。
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);
}
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;
}
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; }
次の別の 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 ページからリダイレクトされたこと、また、ユーザーがウィッシュの説明を入力していたことを意味します。確認が成功すると、コードは入力パラメータ wishID 、description 、および dueDate を持つ関数 update_wish を呼び出します。 これらのパラメータは、HTML 入力フォームから POST メソッドを介して受け取ります。update_wish が呼び出されたあと、アプリケーションは editWishList.php ページにリダイレクトされ、PHP 処理は取り消されます。
ウィッシュの編集機能のテスト
アプリケーションを実行します。index.php ページで、「Username」フィールドに「Tom」、「Password 」フィールドに「tomcat」と入力します。
「Edit My Wish List」ボタンを押します。editWishList.php ページが開きます。
「Icecream」の横の「Edit」をクリックします。editWish.php ページが開きます。
フィールドを編集して「Back to the List」を押します。editWishList.php ページが開きますが、変更は保存されていません。
「Icecream」の横の「Edit」を押します。「Describe your wish」フィールドを削除して「Save Changes」を押します。エラーメッセージが表示されます。
「Describe your wish」フィールドに「Chocolate icecream」と入力し、「Save Changes」を押します。editWishList.php ページが開き、更新されたリストが表示されます。
ウィッシュの削除
ウィッシュの作成、読み取り、更新ができるようになったので、ウィッシュを削除する方法を追加します。
ユーザーがウィッシュを削除できるようにするには、次の手順に従います。
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);
}
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 ページにリダイレクトされます。
「Delete」ボタンを実装するには、editWishList.php の while ループの内部、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 $wish ID; ?>"/>
<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」を押します。その項目がリストからなくなります。
現在のレッスン完了後のアプリケーションソースコード
MySQL ユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここ をクリックします。
Oracle データベースユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここ をクリックします。
次の手順
<< 前のレッスン
次のレッスン >>
チュートリアルのメインページに戻る
users
@
php.netbeans.org
メーリングリストに登録する ことによって、NetBeans IDE PHP 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。
PHP の学習に戻る