記事修正機能を実装する

今回は、記事を修正する機能について実装したいと思います。

プログラムの修正

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)を埋め込んでいます。

以上で管理画面の記事編集機能が実装できました。
今回のコンテンツについては以下よりダウンロードできます。

step3-060.zip

このページをシェア Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn