今回は、記事を修正する機能について実装したいと思います。
プログラムの修正
post_edit.phpを以下のように修正します。
admin/post_edit.php
<?php require_once "../system/common_admin.php";?> <?php // ホワイトリスト変数の作成 $whitelist = array("send", "mode", "post_id", "post_title", "post_content"); $request = whitelist($whitelist); $page_message = ""; // ページに表示するメッセージ $page_error = ""; // エラーメッセージ $mode = $request["mode"]; // 動作モード(新規-指定なし/修正-change) // フォーム初期値のセット $form = array(); $form["post_id"] = $request["post_id"]; $form["post_title"] = $request["post_title"]; $form["post_content"] = $request["post_content"]; // 修正モード時はフォーム初期値をセット if (!isset($request["send"]) && $mode == "change") { try { $stmt = $db->prepare("SELECT * FROM posts WHERE post_id = ? LIMIT 1"); $stmt->execute(array($request["post_id"])); // クエリの実行 $row_post = $stmt->fetch(PDO::FETCH_ASSOC); // SELECT結果を配列に格納 if ($row_post) { // データ取得成功時は、フォーム初期値をセット $form["post_title"] = $row_post["post_title"]; $form["post_content"] = $row_post["post_content"]; } else { // データ取得失敗時は停止 exit("異常なアクセスです"); } } catch (PDOException $e) { // エラー発生時 exit("クエリの実行に失敗しました"); } } // エラーチェック if (isset($request["send"])) { if ($request["post_title"] == "") { $page_error = "記事タイトルを入力してください\n"; } } // 登録実行 if (isset($request["send"]) && $page_error == "") { // データベースへ保存 try { $db->beginTransaction(); if ($mode == "change") { // 修正モード $stmt = $db->prepare("UPDATE posts SET post_title = ?, post_content = ? WHERE post_id = ?"); $stmt->execute(array($request["post_title"], $request["post_content"], $request["post_id"])); } else { // $mode空白時は新規登録 $stmt = $db->prepare("INSERT INTO posts (post_title, post_content, post_created) VALUES (?, ?, NOW())"); $stmt->execute(array($request["post_title"], $request["post_content"])); $mode = "change"; // 新規作成が成功したら、修正モードにする $form["post_id"] = $db->lastInsertId("post_id"); // 追加したpost_idを取得する } $db->commit(); } catch (PDOException $e) { // エラー発生時 $db->rollBack(); exit("クエリの実行に失敗しました"); } // 完了 $page_message = "登録が完了しました"; } ?> <?php $page_title = "記事編集";?> <?php require "header.php";?> <p> <a href="post_list.php">一覧へ戻る</a> </p> <p> <?php echo he($page_message); ?> </p> <p class="attention"> <?php echo he($page_error); ?> </p> <?php if ($mode == "change") {?> <p> 記事ID[<?php echo he($form["post_id"]); ?>]を修正しています </p> <?php }?> <form action="post_edit.php" method="post"> <div> 記事タイトル <span class="attention">[必須]</span><br> <input type="text" name="post_title" size="30" value="<?php echo he($form["post_title"]); ?>"> </div> <div> 記事本文<br> <textarea name="post_content" rows="5" cols="20"><?php echo he($form["post_content"]); ?></textarea> </div> <div> <input type="submit" name="send" value="登録する"> <input type="hidden" name="mode" value="<?php echo he($mode); ?>"> <input type="hidden" name="post_id" value="<?php echo he($form["post_id"]); ?>"> </div> </form> <?php require "footer.php";?>
修正箇所の解説
// ホワイトリスト変数の作成 $whitelist = array("send", "mode", "post_id", "post_title", "post_content");
ホワイトリストにpost_idを追加しました。
$mode = $request["mode"]; // 動作モード(新規-指定なし/修正-change)
動作モードを管理する$modeを初期化します。
// フォーム初期値のセット $form = array(); $form["post_id"] = $request["post_id"]; $form["post_title"] = $request["post_title"]; $form["post_content"] = $request["post_content"];
フォーム項目の初期値をセットします。
// 修正モード時はフォーム初期値をセット if (!isset($request["send"]) && $mode == "change") { try { $stmt = $db->prepare("SELECT * FROM posts WHERE post_id = ? LIMIT 1"); $stmt->execute(array($request["post_id"])); // クエリの実行 $row_post = $stmt->fetch(PDO::FETCH_ASSOC); // SELECT結果を配列に格納 if ($row_post) { // データ取得成功時は、フォーム初期値をセット $form["post_title"] = $row_post["post_title"]; $form["post_content"] = $row_post["post_content"]; } else { // データ取得失敗時は停止 exit("異常なアクセスです"); } } catch (PDOException $e) { // エラー発生時 exit("クエリの実行に失敗しました"); } }
修正モード時は、データベースから初期値を取得して、$formを上書きします。
if ($mode == "change") { // 修正モード $stmt = $db->prepare("UPDATE posts SET post_title = ?, post_content = ? WHERE post_id = ?"); $stmt->execute(array($request["post_title"], $request["post_content"], $request["post_id"])); } else {
修正モード時は、UPDATE文を実行します
$mode = "change"; // 新規作成が成功したら、修正モードにする $form["post_id"] = $db->lastInsertId("post_id"); // 追加したpost_idを取得する
$modeが指定されていない場合は新規登録モードとします。
新規登録した際は、$modeをchangeにします。
また、lastInsertIdで最後の登録IDを取得します。
PHP: PDO::lastInsertId – Manual
<div> 記事タイトル <span class="attention">[必須]</span><br> <input type="text" name="post_title" size="30" value="<?php echo he($form["post_title"]); ?>"> </div> <div> 記事本文<br> <textarea name="post_content" rows="5" cols="20"><?php echo he($form["post_content"]); ?></textarea> </div> <div> <input type="submit" name="send" value="登録する"> <input type="hidden" name="mode" value="<?php echo he($mode); ?>"> <input type="hidden" name="post_id" value="<?php echo he($form["post_id"]); ?>"> </div>
$formの内容を各項目の初期値としてセットします。
また、hidden属性の項目によって、modeとpost_id(編集中の記事ID)を埋め込んでいます。
以上で管理画面の記事編集機能が実装できました。
今回のコンテンツについては以下よりダウンロードできます。