PHPとMySQLを使っていちから掲示板を作ってみる講座、7回目になりました。
今回は投稿画面に削除機能を追加します。
ただ、だれでも投稿を消せたらトラブルになりますよね。そこで、投稿者本人のみが削除できるようにします。
【完成後イメージ】
「どんな掲示板ができるのかな。」と思ったら、下記の紹介動画をクリックしてくださいね。
↓↓↓
なお記事では掲示板に必要なコードはご紹介しますが、デザイン部分は省略しています。
デザイン部分も含めた形で、GitHubにコード公開しています。全体のコードを見たい時に、参考にしてください。
いいなと思ったら、GitHub右上のStarボタン、クリックしてもらえると、嬉しいです。
前回までの内容
掲示板作成の7ステップの目次と概要はこちらをご覧ください。
- 概要説明
- ① 設計図を作って、データベースの準備をしよう
- ②会員登録画面をつくる 前編
- ③会員登録画面をつくる 後編
- ④会員登録確認画面をつくる
- ⑤ログイン画面をつくる
- ⑥投稿画面をつくる
- ⑦削除画面をつくる⇒今ここ
PHPで投稿画面にログアウトと削除機能をつける
では削除機能を加えていきます。
まずは前回作成したC:\xampp\htdocs\forum\post.phpに、下記の★追加:削除★の下にあるコードを追加します。
【C:\xampp\htdocs\forum\post.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?php session_start(); require('dbconnect.php'); // ★ポイント1★ if (isset($_SESSION['id']) && ($_SESSION['time'] + 3600 > time())) { $_SESSION['time'] = time(); $members=$db->prepare('SELECT * FROM members WHERE id=?'); $members->execute(array($_SESSION['id'])); $member=$members->fetch(); } else { header('Location: login.php'); exit(); } // ★ポイント2★ if (!empty($_POST)) { if (isset($_POST['token']) && $_POST['token'] === $_SESSION['token']) { $post=$db->prepare('INSERT INTO posts SET created_by=?, post=?, created=NOW()'); $post->execute(array($member['id'] , $_POST['post'])); header('Location: post.php'); exit(); } else { header('Location: login.php'); exit(); } } // ★ポイント3★ $posts=$db->query('SELECT m.name, p.* FROM members m JOIN posts p ON m.id=p.created_by ORDER BY p.created DESC'); $TOKEN_LENGTH = 16; $tokenByte = openssl_random_pseudo_bytes($TOKEN_LENGTH); $token = bin2hex($tokenByte); $_SESSION['token'] = $token; ?> <!DOCTYPE html> <html lang="ja"> <body> <!-- ★ログアウト★ --> <header> <div class="head"> <h1>週末プラン投稿画面</h1> <span class="logout"><a href="login.php">ログアウト</a></span> </div> </header> <form action='' method="post"> <input type="hidden" name="token" value="<?=$token?>"> <?php if (isset($error['login']) && ($error['login'] =='token')): ?> <p class="error">不正なアクセスです。</p> <?php endif; ?> <div class="edit"> <p> <?php echo htmlspecialchars($member['name'], ENT_QUOTES); ?>さん、ようこそ </p> <textarea name="post" cols='50' rows='10'><?php echo htmlspecialchars($post??"", ENT_QUOTES); ?></textarea> </div> <input type="submit" value="投稿する" class="button02"> </form> <?php foreach($posts as $post): ?> <div class="post"> <?php echo htmlspecialchars($post['post'], ENT_QUOTES); ?> | <span class="name"> <?php echo htmlspecialchars($post['name'], ENT_QUOTES); ?> | <?php echo htmlspecialchars($post['created'], ENT_QUOTES); ?> | <!-- ★追加:削除★ --> <?php if($_SESSION['id'] == $post['created_by']): ?> [<a href="delete.php?id=<?php echo htmlspecialchars($post['id'], ENT_QUOTES); ?>">削除</a>] <?php endif; ?> </span> </div> <?php endforeach; ?> </body> </html> |
追加したコードによって、セッションIDが、投稿者のIDと同じであれば、削除が表示されます。
実際に【削除】を押すと、delete.php に処理が受け渡されます。
では次に、このdelete.phpを作成していきましょう。
C:\xampp\htdocs\forumの中に、delete.phpファイルを作り、下記のようにコードを入れます。
【C:\xampp\htdocs\forum\delete.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php session_start(); require('dbconnect.php'); if (isset($_SESSION['id'])) { $id = $_REQUEST['id']; $posts = $db->prepare('SELECT * FROM posts WHERE id=?'); $posts -> execute(array($id)); $post = $posts->fetch(); if ($post['created_by'] == $_SESSION['id']) { $del = $db->prepare('DELETE FROM posts WHERE id=?'); $del->execute(array($id)); } } header('Location: post.php'); exit(); ?> |
最初のif構文は、セッションidがあれば、という意味です。そのあとは、$_REQUEST[‘id’]を$idに代入しています。$_REQUEST[‘id’] は、削除したい投稿のIDとなります。その後、postsテーブルから、この$_REQUEST[‘id’]と同じ投稿データを取得します。
そのあと、もう一度if構文をいれています。これは、もし投稿の作成者(created_by) と、セッションのidが一致していたら、という意味になります。その場合は、投稿を削除します。その後、post.phpに戻ります。
post.phpファイルは、投稿画面です。
つまりユーザーとしては、削除を実行してもページは変わりません。
テスト
今の段階で一度、テストしてみましょう。
XAMPPを起動した状態で、下記のURLを開きます。
データベースに登録済みのmember情報をいれてログインした後、登録をしてみましょう。その後、登録の削除を試してみます。
また、今ログインしているユーザー以外が作成した投稿の場合には、【削除】が表示されないかどうかも、チェックしてみましょう。
さいごに
これで簡易掲示板ができました。
ただまだ、色々と足りない部分があります。機能を色々追加してみてくださいね。
ただ、いちからPHPですべて作成するのは、なかなか大変ですよね? 特に、セキュリティ対策や認証処理など、手がかかります。
実は、フレームワークを使えば、このあたりの処理を大幅に効率化できます。
PHPフレームワークとしては、現在Laravel(ララベル)が最も人気があります。たとえば前回ご初回したワンタイムトークンの仕組みは、Laravelなら、@csrfと5文字入力するだけで、搭載できます。
しかも@csrfを入れ忘れるとエラーになるので、対策忘れも防げます。
正直、この楽さを知ってしまうと、後に戻れません。
PHPをある程度学んだら、ぜひ、Laravelも学習してみてくださいね。
なお本ブログでは、PHP学習後にLaravelを習得してWebエンジニアになった わたし自身の経験をふまえて、分かりやすく、Laravelの使い方も解説しています。
ララベルって何??
フレームワークってどんなものか、イマイチ分からない。
そんなふうに思ったら、まずは、こちらの記事から読んでみてください。
「本で学びたい」という方向けには、【Laravelの教科書】がおすすめです。
2023年3月に出版した著書になります。ご興味あれば、こちらをクリックして説明ページをご覧ください。
それではまた。Laravel学習でもお会いしましょう♪