【Todoアプリ】削除機能の作成

削除機能を作る方針としては、

  1. 削除ボタン」が押される
  2. aタグで指定した「delete.php」に遷移する(画面は無くて良い)
  3. delete.phpにはSQLで削除処理が書いてあるので、delete.phpが開かれると自動で削除処理が実される
  4. どの投稿を削除するかは「idで判別する」

と言うものにします。

おそらく、今回一番難しい内容は
4番目の「どれが削除対象なのかをidで判別する」と言う箇所かと思います。

この点に注意しながら作成していきましょう!

削除機能

今までのパターンで言うと、削除処理は

SQLでDELETEの処理を作っておいて、削除ボタンが押されたら起動させる

と言うものになります。

今回も先に完成形のコードを載せておきます。

<?php
    require('db_connect.php');

    $id = $_GET['id'];

    try {
        $sql = "DELETE FROM posts WHERE id = :id";
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(":id", $id);
        $stmt->execute();
      
        // main.phpにリダイレクト
        header("Location: main.php");
        exit;
      } catch (PDOException $e) {
        echo $e->getMessage();
        die();
      }
?>

このコードで唯一、今までと違う点というと

$id = $_GET['id'];

この記述だと思います。

$_POSTではなく$_GETを使っています。

まずこれらの違いを解説するために、
メイン画面の削除ボタンを動かせるようにしておきましょう。

「削除ボタン」が押されたときの遷移先(URL)を以下のように書きます。(hrefの中身)

delete.php?id=<?php echo $row[‘id’];?>

delete.php?id=1

delete.php?id=2

delete.php?id=3

<?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) : ?>
<tr>
    <td><?php echo $row["id"]; ?></td>
    <td><?php echo $row["title"]; ?></td>
    <td><?php echo $row["content"]; ?></td>
    <td><?php echo $row["time"]; ?></td>
    <td><a href="">編集</a></td>
    <td><a href="delete.php?id=<?php echo $row['id'];?>">削除</a></td>
</tr>
<?php endwhile; ?>

これは例えば、

ループ1回目に入っているidが3だった場合URLは、
➡︎ delete.php?id=3

ループ2回目に入っているidが8だった場合URLは、
➡︎ delete.php?id=8

このように、URLの末尾にidが振られるため、
何回目のループかによってURLが変わっていくことになります。

そして、
$_GETを使うと「URL」を見てidを取得することができます。

え、POSTと何が違うの?

$_POSTでも今まで値を取得できていたじゃん…

というと今回の場合は、

$_POSTは、form送信で送られてきた値を取得しています

$_GETは、URLを見て値を取得しています

と言う違いがあります。

「URLを見る」とは?

それでは、削除ボタンを押した時にURLの部分からidが確認できるか試してみましょう。

delete.phpのtryの中身を一旦コメントアウトしておきます。

<?php
    require('db_connect.php');

    $id = $_GET['id'];

    $pdo = db_connect();

    try {
        // $sql = "DELETE FROM posts WHERE id = :id";
        // $stmt = $pdo->prepare($sql);
        // $stmt->bindParam(":id", $id);
        // $stmt->execute();
      
        // main.phpにリダイレクト
        // header("Location: main.php");
        // exit;
      } catch (PDOException $e) {
        echo $e->getMessage();
        die();
      }
?>

これをしないと、処理が動いて削除されてしまいます。
さらに、削除が完了するとリダイレクトでメイン画面に戻ってくるので確認ができません。

コメントアウトをしたことで、これらの問題が解決するので、この状態で「削除ボタン」を押してみましょう。

このように$_GET[‘id] とすると、URLにパラメータとして表示させることができます。

今回はaタグを使っているので、URL経由で値を取得しようと言う考えになります。

動作確認

では、delete.phpのコメントアウトを解除して、実際に投稿内容が消えるか確認してみましょう。

「削除」ボタンをクリックすると、

消えている!

まとめ

  • 「削除が終わったらにメイン画面に戻ってくる」までが一つの処理なので、
    削除用の画面はいらない
  • $_GETを使うとURLのパラメータ値を取得することができる
    ➡︎ <a href=”delete.php?id=<?php echo $row[‘id’];?>“>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA