20. 会員登録画面の作成

入力画面

会員登録フォームの「入力画面(input.php)」と「確認画面(confirm.php)」を作成します。CSSは「Bootstrap」をCDNで利用します。

ファイル構成

regist/
├── confirm.php
└── input.php

入力画面のHTML

入力画面「input.php」にHTMLフォームを作成します。

regist/input.php
<?php
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>会員登録</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>
    <main class="w-50 m-auto">
        <h2 class="h2 text-center p-3">会員登録</h2>
        <form action="confirm.php" method="post">

            <div class="form-floating mb-3">
                <input type="text" class="form-control" name="name">
                <label for="">氏名</label>
            </div>

            <div class="form-floating mb-3">
                <input type="email" class="form-control" name="email">
                <label for="">メールアドレス</label>
            </div>

            <div class="form-floating mb-3">
                <input type="password" class="form-control" name="password">
                <label for="">パスワード</label>
            </div>

            <div class="d-flex mt-2">
                <button class="btn btn-primary w-50 me-1">確認</button>
                <a class="btn btn-outline-primary w-50" href="../">ホーム</a>
            </div>
        </form>
    </main>
</body>

</html>

確認画面

$_POSTの取得

確認画面「confirm.php」を作成して、入力データの表示やデータチェックをします。

$_POSTで、POSTデータを取得します。

regist/confirm.php
<?php
$posts = $_POST;
?>

確認画面の作成

HTMLでデータ表示します。

regist/confirm.php
<?php
$posts = $_POST;
?>

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>会員登録</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-6">
                <h2 class="h2 text-center p-3">確認画面</h2>
                <div>
                    <label class="form-label fw-bold" for="">氏名</label>
                    <p><?= $posts['name'] ?></p>
                </div>

                <div>
                  <label class="form-label fw-bold" for="">メールアドレス</label>
                  <p><?= $posts['email'] ?></p>
                </div>

                <div class="text-center p-3">
                   <p>この内容で登録しますか?</p>
                   <button class="btn btn-primary">登録</button>
                   <a href="input.php" class="btn btn-outline-primary">戻る</a>
                </div>
            </div>
        </div>
    </div>
</body>

</html>

データ確認

入力画面からデータ入力して【確認】ボタンをクリックします。確認画面でデータ表示されるか確認してみましょう。

バリデーション

バリデーションとは

Validation(バリデーション)は、データのチェック(検証)処理のことで、入力データが不正なときにユーザに何かしらメッセージを伝えたり、処理を中断したりします。

  • データが未入力
  • メールアドレスの形式が違う
  • パスワードが短すぎる
  • 数値が大きすぎる etc...

HTTPメソッドのバリデーション

$_SERVER

$_SERVER は、サーバのさまざまな情報を取得できるスーパーグローバル変数です。

$_SERVER

REQUEST_METHODキーでHTTPメソッド(GET/POST)の文字列を取得できます。

$_SERVER["REQUEST_METHOD"]

POSTリクエストのチェック

確認画面でPOSTリクエスト以外のアクセスは強制終了します。

regist/confirm.php
<?php
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    exit;
}
$posts = $_POST;
?>

入力データのバリデーション

Warning エラー

入力画面からデータ送信したとき、 $_POST データがない場合にWarningになります。

未入力チェックの実装

validate() メソッドで、送信データの未入力チェックをします。未入力のときは、エラーメッセージを連想配列で返すようにします。

regist/confirm.php
function validate($posts)
{
    $errors = [];
    if (empty($posts['email'])) {
        $errors['email'] = 'メールアドレスを入力してください';
    }
    if (empty($posts['password'])) {
        $errors['password'] = 'パスワードを入力してください';
    }
    return $errors;
}

バリデーションの実行

validate() に入力データを代入して実行し、エラーメッセージを受け取ります。

regist/confirm.php
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    exit;
}
$posts = $_POST;

//未入力チェック
$errors = validate($posts);

リダイレクト

リダイレクトとは

HTML表示前に他のページに移動することをリダイレクト(URL転送) といいます。HTMLでは metaタグでリダイレクトすることができ、HTML表示する前に処理されます。

<meta http-equiv="refresh" content="秒数;URL=URL">

PHPでリダイレクト

PHPでは header() メソッドを使ってリダイレクトします。

header('Location: 転送先URL');

エラー時に入力画面にリダイレクト

確認画面の表示前にデータをチェックして、エラーの場合は input.phpにリダイレクトします。

regist/confirm.php
$posts = check($_POST);
$errors = validate($posts);
if (!empty($errors)) {
    //エラーの場合はリダイレクト
    header('Location: input.php');
    exit;
}

入力画面から送信

入力画面で送信して確認画面でデータ表示されるか確認してみましょう。また、未入力がある場合は、入力画面に戻されることも確認します。

ソース

regist/input.php
<?php
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link 
    href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" 
    rel="stylesheet">
</head>

<body>
    <div class="container">
        <form action="confirm.php" method="post">
            <div class="form-floating mb-3">
                <input type="text" class="form-control" name="name" value="<?= @$user['name'] ?>">
                <label for="">氏名</label>
                <p class="text-danger"><?= @$errors['name'] ?></p>
            </div>

            <div class="form-floating mb-3">
                <input type="email" class="form-control" name="email" value="<?= @$user['email'] ?>">
                <label for="">メールアドレス</label>
                <p class="text-danger"><?= @$errors['email'] ?></p>
            </div>

            <div class="form-floating mb-3">
                <input type="password" class="form-control" name="password">
                <label for="">パスワード</label>
                <p class="text-danger"><?= @$errors['password'] ?></p>
            </div>

            <div class="text-center">
                <button class="btn btn-primary">確認</button>
            </div>
        </form>
    </div>
</body>

</html>
regist/confirm.php
<?php
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    exit;
}

$posts = $_POST;
$errors = validate($posts);
if (!empty($errors)) {
    header('Location: input.php');
    exit;
}

function check($posts)
{
    if (empty($posts)) return;
    foreach ($posts as $column => $post) {
        $posts[$column] = htmlspecialchars($post, ENT_QUOTES, 'UTF-8');
    }
    return $posts;
}

function validate($posts)
{
    $errors = [];
    if (empty($posts['email'])) {
        $errors['email'] = 'メールアドレスを入力してください';
    }
    if (empty($posts['password'])) {
        $errors['password'] = 'パスワードを入力してください';
    }
    return $errors;
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-6">
                <h2 class="h2 text-center p-3">会員登録</h2>
                <form action="result.php" method="post">
                    <label class="form-label fw-bold" for="">氏名</label>
                    <p><?= $posts['name'] ?></p>

                    <label class="form-label fw-bold" for="">メールアドレス</label>
                    <p><?= $posts['email'] ?></p>

                    <div class="text-center p-3">
                        <p>この内容で登録しますか?</p>
                        <button class="btn btn-primary">登録</button>
                        <a href="input.php" class="btn btn-outline-primary">戻る</a>
                    </div>
                </form>
            </div>
        </div>
    </div>
</body>

</html>

PHP超入門