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"];
}
?>
編集ボタンを実装します。editWish フォームを使用して、終了の </table> タグの前に別の表のセルを追加します。このフォームには、ボタンコンポーネントと、ボタンがクリックされたときに $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; 文に置き換えられます。開始の中括弧をコロンに置き換え、終了の中括弧を削除し、endwhile; 文を使用して終了の </table> タグの前に新しい PHP ブロックを追加します。これにより、新しい表のセルが 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>
表の行の構文を修正します。行を終了する </tr>\n 文字を、期日の echo 文から 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 内で、HTML <body> 内の EditWish 入力フォームの上にある 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」ボタンを実装するには、別の HTML 表のセルを editWishList.php の while ループの内部で、editWish ボタンのコードブロックのすぐ下に追加します。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($_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 の学習に戻る