フォーム入力欄と入力確認画面にホームページと性別と年齢及びお問い合わせ内容、Cautionの追加をする

# フォーム入力画面($pageFlag = 0) にホームページとホームページ(URL)と性別と年齢及びお問い合わせ内容、Cautionの追加

type属性:

- ホームページ = `url`
- 性別 = `radio`
- 年齢 = `select` , `option`
- お問い合わせ内容 = `textarea`
- caution = `checkbox`

```php:form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか？ -->
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
        <?php endif; ?>
    <?php endif; ?>

    <!-- 確認画面から送信後に遷移する完了画面の作成 -->
    <?php if ($pageFlag === 2) : ?>
        送信が完了しました。
        <!-- sessionトークンの削除 -->
        <?php unset($_SESSION['csrfToken']);  ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <input type="radio" name="gender" value="0">男性
            <input type="radio" name="gender" value="1">女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1">〜19歳</option>
                <option value="2">20歳〜29歳</option>
                <option value="3">30歳〜39歳</option>
                <option value="4">40歳〜49歳</option>
                <option value="5">50歳〜59歳</option>
                <option value="6">60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>
```

入力画面でデータを入力してブラウザで下記にようにデータが入っていればOK

```:browser
array(9) {
  ["name"]=>
  string(3) "abc"
  ["email"]=>
  string(13) "test@test.com"
  ["url"]=>
  string(18) "https://google.com"
  ["gender"]=>
  string(1) "0"
  ["age"]=>
  string(1) "5"
  ["contact"]=>
  string(20) "あああ
いいい"
  ["caution"]=>
  string(1) "1"
  ["btn_confirm"]=>
  string(12) "確認する"
  ["csrf"]=>
  string(64) "0558ab1a3f4b7c49801014f3bbe4269c11923a6e8e7c6f1a5b841e02bc330c07"
}
氏名 abc
メールアドレス test@test.com
```

# 確認画面($pageFlag = 1) にホームページとホームページ(URL)と性別と年齢及びお問い合わせ内容、Cautionの追加

```php:form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか？ -->
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                ホームページ
                <?php echo h($_POST['url']); ?> <!-- サニタイズ -->
                <br>
                性別
                <?php
                echo $_POST['gender'] === '0' ? '男性' : '女性';
                ?>
                <br>
                年齢
                <?php
                if ($_POST['age'] === '1') {
                    echo '〜19歳';
                }
                if ($_POST['age'] === '2') {
                    echo '20歳〜29歳';
                }
                if ($_POST['age'] === '3') {
                    echo '30歳〜39歳';
                }
                if ($_POST['age'] === '4') {
                    echo '40歳〜49歳';
                }
                if ($_POST['age'] === '5') {
                    echo '50歳〜59歳';
                }
                if ($_POST['age'] === '6') {
                    echo '60歳〜';
                }
                ?>
                <br>
                お問い合わせ内容
                <br>
                <?php echo nl2br(h($_POST['contact'])); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="url" value="<?php echo h($_POST['url']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="gender" value="<?php echo h($_POST['gender']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="age" value="<?php echo h($_POST['age']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="contact" value="<?php echo h($_POST['contact']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
        <?php endif; ?>
    <?php endif; ?>

    <!-- 確認画面から送信後に遷移する完了画面の作成 -->
    <?php if ($pageFlag === 2) : ?>
            送信が完了しました。
            <!-- sessionトークンの削除 -->
            <?php unset($_SESSION['csrfToken']);  ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <input type="radio" name="gender" value="0">男性
            <input type="radio" name="gender" value="1">女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1">〜19歳</option>
                <option value="2">20歳〜29歳</option>
                <option value="3">30歳〜39歳</option>
                <option value="4">40歳〜49歳</option>
                <option value="5">50歳〜59歳</option>
                <option value="6">60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>
```
テキストエリアで入力されたテキストが改行されて表示されるようにするには
`nl2br`関数を使用する。

```php:
<?php echo nl2br(h($_POST['contact'])); ?>
```

確認ページに遷移時には下記の結果になれば良い。

![スクリーンショット 2024-03-24 16.55.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752847/3e2cbd1e-bc1f-64fc-cfcb-35d4bd757da4.png)

# `戻る`ボタンを押下時の入力フォーム($pageFlag === 0)への情報表示 (URL, 性別, 年齢, お問い合わせ内容)

```php:form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか？ -->
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                ホームページ
                <?php echo h($_POST['url']); ?> <!-- サニタイズ -->
                <br>
                性別
                <?php
                echo $_POST['gender'] === '0' ? '男性' : '女性';
                ?>
                <br>
                年齢
                <?php
                if ($_POST['age'] === '1') {
                    echo '〜19歳';
                }
                if ($_POST['age'] === '2') {
                    echo '20歳〜29歳';
                }
                if ($_POST['age'] === '3') {
                    echo '30歳〜39歳';
                }
                if ($_POST['age'] === '4') {
                    echo '40歳〜49歳';
                }
                if ($_POST['age'] === '5') {
                    echo '50歳〜59歳';
                }
                if ($_POST['age'] === '6') {
                    echo '60歳〜';
                }
                ?>
                <br>
                お問い合わせ内容
                <br>
                <?php echo nl2br(h($_POST['contact'])); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="url" value="<?php echo h($_POST['url']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="gender" value="<?php echo h($_POST['gender']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="age" value="<?php echo h($_POST['age']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="contact" value="<?php echo h($_POST['contact']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
        <?php endif; ?>
    <?php endif; ?>

    <!-- 確認画面から送信後に遷移する完了画面の作成 -->
    <?php if ($pageFlag === 2) : ?>
        送信が完了しました。
        <!-- sessionトークンの削除 -->
        <?php unset($_SESSION['csrfToken']);  ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <!-- !emptyをしようすると0でもtrueになってしまう為にissetを使用する -->
            <input type="radio" name="gender" value="0" <?php if (isset($_POST['gender']) && $_POST['gender'] === '0') {
                                                            echo 'checked';
                                                        } ?>>男性
            <input type="radio" name="gender" value="1" <?php if (isset($_POST['gender']) && $_POST['gender'] === '1') {
                                                            echo 'checked';
                                                        } ?>>女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1" <?php if (isset($_POST['age']) && $_POST['age'] === '1') {
                                        echo 'selected';
                                    } ?>>〜19歳</option>
                <option value="2" <?php if (isset($_POST['age']) && $_POST['age'] === '2') {
                                        echo 'selected';
                                    } ?>>20歳〜29歳</option>
                <option value="3" <?php if (isset($_POST['age']) && $_POST['age'] === '3') {
                                        echo 'selected';
                                    } ?>>30歳〜39歳</option>
                <option value="4" <?php if (isset($_POST['age']) && $_POST['age'] === '4') {
                                        echo 'selected';
                                    } ?>>40歳〜49歳</option>
                <option value="5" <?php if (isset($_POST['age']) && $_POST['age'] === '5') {
                                        echo 'selected';
                                    } ?>>50歳〜59歳</option>
                <option value="6" <?php if (isset($_POST['age']) && $_POST['age'] === '6') {
                                        echo 'selected';
                                    } ?>>60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"><?php if (!empty($_POST['contact'])) {
                                            echo h($_POST['contact']);
                                        } ?></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>
```

1. 「性別」と「年齢」の値について：
性別と年齢の値は文字列で表現されています。つまり、男性は '0' 、女性は '1' という文字列で表されています。このため、値を比較する際には文字列として比較する必要があります。

2. `isset` の使用について：
性別と年齢のデータが送信されていない場合には、それぞれの変数はセットされていません。
しかし、 `$_POST['gender']` や `$_POST['age']` が存在する場合でも、値が '0' や '1' という可能性があるため、`!empty` を使用すると条件が満たされてしまいます。
そのため、実際に値がセットされているかどうかを確認するために `isset` を使用しています。

`戻る` ボタン押下後、下記のように表示されれば良い。

![スクリーンショット 2024-03-25 11.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752847/749ec0d0-710f-e255-0d3d-4b442e465b1c.png)


以上です。
ご指摘があればお願いします！

#### CSRF対策のご指摘を受け自分なりに修正してみる

```php:form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか？ -->
        <?php if (isset($_SESSION['csrfToken']) && $_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                ホームページ
                <?php echo h($_POST['url']); ?> <!-- サニタイズ -->
                <br>
                性別
                <?php
                echo $_POST['gender'] === '0' ? '男性' : '女性';
                ?>
                <br>
                年齢
                <?php
                if ($_POST['age'] === '1') {
                    echo '〜19歳';
                }
                if ($_POST['age'] === '2') {
                    echo '20歳〜29歳';
                }
                if ($_POST['age'] === '3') {
                    echo '30歳〜39歳';
                }
                if ($_POST['age'] === '4') {
                    echo '40歳〜49歳';
                }
                if ($_POST['age'] === '5') {
                    echo '50歳〜59歳';
                }
                if ($_POST['age'] === '6') {
                    echo '60歳〜';
                }
                ?>
                <br>
                お問い合わせ内容
                <br>
                <?php echo nl2br(h($_POST['contact'])); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="gender" value="<?php echo h($_POST['gender']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="age" value="<?php echo h($_POST['age']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="contact" value="<?php echo h($_POST['contact']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
            <?php else : ?>
                <p>不正なアクセスです。</p>
        <?php endif; ?>
    <?php endif; ?>

    <?php if ($pageFlag === 2) : ?>
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            送信が完了しました。
            <!-- sessionトークンの削除 -->
            <?php unset($_SESSION['csrfToken']);  ?>
            <?php else : ?>
                <p>不正なアクセスです。</p>
                <?php unset($_SESSION['csrfToken']);  ?>
        <?php endif; ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <!-- !emptyをしようすると0でもtrueになってしまう為にissetを使用する -->
            <input type="radio" name="gender" value="0" <?php if (isset($_POST['gender']) && $_POST['gender'] === '0') {
                                                            echo 'checked';
                                                        } ?>>男性
            <input type="radio" name="gender" value="1" <?php if (isset($_POST['gender']) && $_POST['gender'] === '1') {
                                                            echo 'checked';
                                                        } ?>>女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1" <?php if (isset($_POST['age']) && $_POST['age'] === '1') {
                                        echo 'selected';
                                    } ?>>〜19歳</option>
                <option value="2" <?php if (isset($_POST['age']) && $_POST['age'] === '2') {
                                        echo 'selected';
                                    } ?>>20歳〜29歳</option>
                <option value="3" <?php if (isset($_POST['age']) && $_POST['age'] === '3') {
                                        echo 'selected';
                                    } ?>>30歳〜39歳</option>
                <option value="4" <?php if (isset($_POST['age']) && $_POST['age'] === '4') {
                                        echo 'selected';
                                    } ?>>40歳〜49歳</option>
                <option value="5" <?php if (isset($_POST['age']) && $_POST['age'] === '5') {
                                        echo 'selected';
                                    } ?>>50歳〜59歳</option>
                <option value="6" <?php if (isset($_POST['age']) && $_POST['age'] === '6') {
                                        echo 'selected';
                                    } ?>>60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"><?php if (!empty($_POST['contact'])) {
                                            echo h($_POST['contact']);
                                        } ?></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>
```

※ PHP フォームセキュリティの学習振り返り FWなしの投稿で説明はさせてもらってます。