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

PHPで掲示板作成

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

今回はログイン後の投稿画面を作ります。次のような画面を作ります。

CSRF対策となるワンタイムトークンの設定方法や、投稿一覧画面の表示方法など解説していきます。

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

↓↓↓

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

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

GitHubを見てみる

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

前回までの内容

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

PHPで投稿画面を作る

では投稿画面を作っていきます。

まずはC:\xampp\htdocs\forumの中に、post.phpファイルを作成します。この中に、下記コードを追加します。

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

★ポイント★ごとに解説していきます。

ポイント① ログイン状態をチェック

まず最初は、ログイン状態をチェックします。

「$_SESSION[‘id’]があって、さらにセッション時間が3600秒以内なら データベースのmembersテーブルメンバーから、$_SESSION[‘id’] と一致するmember情報を取ってきてね。」としています。

前回のポイント①でも、同じような形で、データベースからデータを取得しましたね。

なお3600秒とは、1時間です。time()は現在の時間です。

60秒×60分=3600秒=1時間

条件に合わない場合は、きちんとログインしていない、あるいは操作しないまま放置している状態です。この場合は、login.phpに追い出されてしまうことになります。

ポイント② CSRF対策のトークンを設定する

今回はCSRF(シーサーフ)対策のためにトークンを設定します。

CSRFというのは、ユーザーになりすまして投稿したり、物を買ったりといった詐欺のこと。

詳しくはPHPのセキュリティに関する記事で解説しているので、お読みください。

悪用されないようにする方法としてトークンを発行し、セッションに保存するという方法があります。

ユーザーが何か操作する時、セッションに保存したトークンと、送信したトークンが同じでなければ処理を実行しない、という形にするのです。

こうしておけば、本人ではない何者かがユーザーになりすまして操作を行うのを防げます。

コードでは、次のように指定しています。

まず「これは「$_POSTが空ではなく、何か投稿されていたら」という条件式。

そのあとに

  • 「トークンがあって」
  • 「セッションに保存してあるトークンと、今回送信するときのトークンがあっていたら」

と条件を指定しています。

条件が合えば、今回投稿したデータがデータベースに保存されます。

メンバーの登録時と同様、【INSERT INTO】を使っています。

ふたつのトークンが合わないと、login.php というログイン画面に追い出されます。

なおセッションのトークンと、今回送信するときのトークンの発行は次のように設定します。

セッションのトークン発行

セッションのトークンはどこで発行しているかというと、この少し後の部分です。

今回送信するときのトークン発行

今回送信するときのトークンは、フォーム送信時に発行されるようにします。

htmlのフォームタグの下に下記のように設定してます。

hiddenタイプにしてあるので、ユーザーには見えません。

ポイント③ データベースに保存された投稿データ表示

データベースに登録された投稿を一覧にして表示します。

そのために、下記コードで、データベースからデータを取得しています。

membersテーブルとpostsテーブルを結合しています。結合条件は、membersのidカラムと、postsのcreated_byが等しいことです。

これにより、各投稿について、作成者の情報も取得できるようになります。

また、’m.name’、’p.*’という指定があります。これは、’members’テーブルの’name’カラムと、’posts’テーブルの全てのカラムを取得することを意味しています。

最後に、ORDER BYを使用して、投稿の作成日時に基づいて結果を降順(新しい順)に並べ替えます。
取得したデータを表示するため、bodyタグの下のHTMLコードの中で、次のように入力します。

foreachを使って投稿データをひとつずつ表示するよう設定しています。

各投稿データには、投稿者の名前($post[‘name’])、投稿時間($post[‘created’])を表示させています。

テスト

今の段階で一度、テストしてみましょう。

XAMPPを起動した状態で、下記のURLを開きます。

http://localhost/forum/login.php

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

さいごに

今回の山場はワンタイムトークンでした。

他にも、これまでご紹介したデータベースからのデータ取得もありました。取得したデータをforeachを使って一覧表示したりして、盛沢山の内容となりました。

掲示板、大分、形になってきましたね。

ただ今のままだと、投稿を削除できません。うっかり間違えて投稿すると、困ったことになります。そこで、次回は今回作った投稿画面に削除機能を追加して使いやすくしていきます。

次回が最終回の予定です。掲示板、仕上げていきましょう。

PHPで掲示板作成

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。
Laravel10対応。Laravel11サポートガイドもご用意しています。詳しくは下記ボタンをクリック♪

書籍の詳細を見てみる

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

Laravel10対応

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。

書籍の詳細を見てみる

 

Laravelの教科書限定コミュニティ【Laravelの教科書ラボ】はじめました。
デプロイ講座付。StripeやChatGPT連携など過去10回分のセミナー動画視聴可能。

Laravel実践スキルをのばしたい方におすすめです。

ラボの案内を見てみる

【おすすめレンタルサーバー】

「Webアプリを本番環境に反映させたい」

場合には、レンタルサーバーを使うのが手軽です。

わたしはエックスサーバーをメインに使ってます。
早くて安定していて、おすすめです♪



Twitter始めました。
40代からプログラミング!
タイトルとURLをコピーしました