【PHP基礎-4】ページをまたいでデータを保持!「セッション」とメール送信の仕組み

PHP基礎編の最終課題は、実務で必ずと言っていいほど作る「お問い合わせフォーム」です。

今回は、以下の3画面構成を作ります。

  1. 入力画面: 名前やメールアドレスを入れる。
  2. 確認画面: 「この内容で送信しますか?」と表示する。
  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 へ追い返すために使います。

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