書籍「Laravelの教科書」Laravel13対応サポートガイド公開中 → ダウンロードはこちら

PHPとMySQLを使った掲示板の作り方を初心者向けにコード付き解説7【削除画面】

PHPで掲示板作成

PHPとMySQLを使っていちから掲示板を作ってみる講座、7回目になりました。

今回は投稿画面に削除機能を追加します。

ただ、だれでも投稿を消せたらトラブルになりますよね。そこで、投稿者本人のみが削除できるようにします。

【完成後イメージ】

「どんな掲示板ができるのかな。」と思ったら、下記の紹介動画をクリックしてくださいね。

↓↓↓

なお記事では掲示板に必要なコードはご紹介しますが、デザイン部分は省略しています。

デザイン部分も含めた形で、GitHubにコード公開しています。全体のコードを見たい時に、参考にしてください。

GitHubを見てみる

いいなと思ったら、GitHub右上のStarボタン、クリックしてもらえると、嬉しいです。

前回までの内容

掲示板作成の7ステップの目次と概要はこちらをご覧ください。

PHPで投稿画面にログアウトと削除機能をつける

では削除機能を加えていきます。

まずは前回作成したC:\xampp\htdocs\forum\post.phpに、下記の★追加:削除★の下にあるコードを追加します。

【C:\xampp\htdocs\forum\post.php】

<?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】

<?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を開きます。

http://localhost/forum/login.php

データベースに登録済みのmember情報をいれてログインした後、登録をしてみましょう。その後、登録の削除を試してみます。

また、今ログインしているユーザー以外が作成した投稿の場合には、【削除】が表示されないかどうかも、チェックしてみましょう。

さいごに

これで簡易掲示板ができました。

ただまだ、色々と足りない部分があります。機能を色々追加してみてくださいね。

ただ、いちからPHPですべて作成するのは、なかなか大変ですよね? 特に、セキュリティ対策や認証処理など、手がかかります。

実は、フレームワークを使えば、このあたりの処理を大幅に効率化できます。

PHPフレームワークとしては、現在Laravel(ララベル)が最も人気があります。たとえば前回ご初回したワンタイムトークンの仕組みは、Laravelなら、@csrfと5文字入力するだけで、搭載できます。

しかも@csrfを入れ忘れるとエラーになるので、対策忘れも防げます。

正直、この楽さを知ってしまうと、後に戻れません。

PHPをある程度学んだら、ぜひ、Laravelも学習してみてくださいね。

なお本ブログでは、PHP学習後にLaravelを習得してWebエンジニアになった わたし自身の経験をふまえて、分かりやすく、Laravelの使い方も解説しています。

ララベルって何??

フレームワークってどんなものか、イマイチ分からない。

そんなふうに思ったら、まずは、こちらの記事から読んでみてください。

「本で学びたい」という方向けには、【Laravelの教科書】がおすすめです。

2023年3月に出版した著書になります。ご興味あれば、こちらをクリックして説明ページをご覧ください。

それではまた。Laravel学習でもお会いしましょう♪

PHPで掲示板作成

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる
 

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる

Laravelの本を書きました。


ひつじが目印♪

Laravelの使い方を分かりやすく解説した本を書きました。 書店やAmazon等のオンラインショップにて販売中
最新版Laravel13対応用サポートガイド(PDF)あり

書籍の詳細を見てみる

Laravelの本書きました。


ひつじが目印♪
クリックするとamazonページへ。
最新版Laravel13対応用
サポートガイド(PDF)あり

書籍の詳細を見てみる
シェアする
Twitter始めました。

コメント

タイトルとURLをコピーしました