PHP基礎編の最終課題は、実務で必ずと言っていいほど作る「お問い合わせフォーム」です。
今回は、以下の3画面構成を作ります。
- 入力画面: 名前やメールアドレスを入れる。
- 確認画面: 「この内容で送信しますか?」と表示する。
- 完了画面: メールを送信し、「ありがとうございました」と出す。
ここで新しい技術「セッション」が必要になります。
データを持ち運ぶ鞄「$_SESSION」
PHPでは、ページを移動(リダイレクトやリンク)すると、$name などの変数はすべて消えてしまいます。
「確認画面」から「完了画面」に行くとき、入力した名前が消えてしまったらメールが送れませんよね。
そこで使うのが $_SESSION(セッション) です。
これは「ブラウザを閉じない限り、ページ移動しても消えない特別な箱」です。
使い方のルール
セッションを使うすべてのファイルの一番上の行に、必ず以下の魔法を書く必要があります。
<?php
session_start(); // 「セッションを使います!」という宣言
// データを保存する
$_SESSION['username'] = "田中";
// データを取り出す(別のページでも使える!)
echo $_SESSION['username'];
?>
メールを送る「mb_send_mail」
PHPからメールを送るには、mb_send_mail() 関数を使います。
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$to = "admin@example.com"; // 送り先
$subject = "お問い合わせがありました"; // 件名
$message = "名前:田中\n本文:テストです"; // 本文
$headers = "From: user@example.com"; // 送り主
// 送信実行(成功するとtrueが返る)
mb_send_mail($to, $subject, $message, $headers);
⚠️ ローカル環境(XAMPP/MAMP)の注意:
メール送信機能は、サーバーの設定をしないと動かないことが多いです。
今回のコードを自分のPCで動かしても、実際にはメールが届かない場合がありますが、コード自体は合っています。「本番サーバー(レンタルサーバーなど)に上げれば動く」と覚えておいてください。
実践:画面フォームを作ろう
今回はファイルが3つになります。すべて同じフォルダ(htdocs)に入れてください。
入力画面 (input.php)
シンプルなHTMLフォームです。送信先は confirm.php です。
<!DOCTYPE html>
<html lang="ja">
<body>
<h1>お問い合わせ</h1>
<form action="confirm.php" method="post">
名前:<input type="text" name="name" required><br>
メール:<input type="email" name="email" required><br>
本文:<textarea name="message"></textarea><br>
<button type="submit">確認画面へ</button>
</form>
</body>
</html>
確認画面 (confirm.php)
ここが重要です。POSTされたデータを表示しつつ、SESSIONに保存します。
<?php
session_start(); // 必須!
// POSTデータをSESSIONに移し替える
if (isset($_POST['name'])) {
$_SESSION['form_data'] = $_POST;
}
// データがない場合(直接アクセスなど)は入力画面に戻す
if (empty($_SESSION['form_data'])) {
header("Location: input.php");
exit;
}
$data = $_SESSION['form_data'];
?>
<!DOCTYPE html>
<html lang="ja">
<body>
<h1>内容確認</h1>
<p>名前:<?= htmlspecialchars($data['name'], ENT_QUOTES, 'UTF-8') ?></p>
<p>メール:<?= htmlspecialchars($data['email'], ENT_QUOTES, 'UTF-8') ?></p>
<p>本文:<?= nl2br(htmlspecialchars($data['message'], ENT_QUOTES, 'UTF-8')) ?></p>
<form action="thanks.php" method="post">
<a href="input.php">戻る</a>
<button type="submit">送信する</button>
</form>
</body>
</html>
完了画面 (thanks.php)
SESSIONからデータを取り出し、メールを送って、最後にSESSIONを空にします。
<?php
session_start();
// データがあるか確認
if (empty($_SESSION['form_data'])) {
header("Location: input.php");
exit;
}
$data = $_SESSION['form_data'];
// --- メール送信処理(実際には設定が必要) ---
// mb_language("Japanese");
// mb_internal_encoding("UTF-8");
// mb_send_mail("admin@example.com", "お問い合わせ", $data['message']);
// ---------------------------------------
// セッションを削除(空にする)
$_SESSION = [];
session_destroy();
?>
<!DOCTYPE html>
<html lang="ja">
<body>
<h1>送信完了</h1>
<p>お問い合わせありがとうございました。</p>
<a href="input.php">トップへ戻る</a>
</body>
</html>
まとめ
- ページをまたぐデータ移動には
$_SESSIONを使う。 - 必ずファイルの先頭で
session_start()を宣言する。 - メール送信は
mb_send_mail()だが、ローカル環境では動かないことが多い。
これでPHP基礎編は修了です!
「フォームからデータを受け取り、ページを移動しながら処理をして、最後にメールを送る」
これができれば、Webサイトの基本的な機能はほとんど作れます。
次回からは【応用・データベース編】です。
このフォームのデータを「メール」で飛ばすだけでなく、「データベース」に永久保存して、掲示板のようなシステムを作ってみましょう!
📝 今日のミニテスト
クリックで答え合わせ!
Q1. セッションを使うために、ファイルの1行目に必ず書く関数は?
正解:session_start()
これを書き忘れると、データを保存しても次のページで消えてしまいます。
Q2. 「確認画面」を作る際、入力画面に戻るリンクには何を記述するのが一般的?
正解:<a href="input.php">戻る</a> や history.back()
ただし、セッションを使っていれば、戻った時に入力値を復元(Sticky Form)させる処理も必要になります。
Q3. PHPで別のページへ強制的に移動(リダイレクト)させる命令は?
正解:header("Location: URL"); exit;
confirm.php に直接アクセスされた時などに、input.php へ追い返すために使います。