質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

PHPにて入力チェックのエラー時にリダイレクトで入力値の保持をしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 221

hj_petricall

score 2

前提・実現したいこと

PHPにて社員情報の登録画面を作っています。
入力チェックでリダイレクト後に、セッションで入力した値を保持したいです。

大まかな動きとしましては

form.phpで値を入力

check.phpで入力チェック

エラーの場合はform.phpにリダイレクト
okの場合は確認画面が表示

リダイレクトをした際に入力した値が保持される

このようにしたいです

発生している問題・エラーメッセージ

生年月日はプルダウン型で選択できるようになっているのですが、
リダイレクトした際にプルダウンの値が選択した値が複数並ぶようになってしまいます。

            生年月日:
            <?php
            echo '<select name="year">'. "\n";
            $start = date('Y');
            $end = date('Y') - 100;
            for($i = $start; $i >= $end; $i--)
            {
                echo '<option value="' .$i . '">' . $_SESSION['year'] .'</option>'. "\n";
            }
            echo '</select>年' . "\n";
            echo '<select name="month">' . "\n";
            for ($i = 1; $i <= 12; $i++)
            {
                echo '<option value="' .$i . '">' . $_SESSION['month']  .'</option>'. "\n";
            }
            echo '</select>月' . "\n";
            echo '<select name="day">' . "\n";
            for ($i = 1; $i <= 31; $i++)
            {
                echo '<option value="' .$i . '">' . $_SESSION['day'] .'</option>'. "\n";
            }
            echo '</select>日' . "\n";
            ?>

↓現在の実装状況です

form.php

<?
session_start();
$page_flag = 0;
?>

<!DOCTYPE html>
<html lang = "ja">
<head>
<meta charset="UTF-8">
<title>新規登録画面</title>
<link rel="stylesheet" href="../css/bootstrap.css">
</head>
<body>
<h2>新規登録</h2>
<?
if(isset($_SESSION['error']))
{
    $page_flag = 1;
}

// 初期画面
if(empty($_POST['send']) && $page_flag === 0)
{
?>
    <form method="POST" action ="check.php">
        <p>
            社員番号:
            <input type="number" min="1" max="9999" name="employee_num">
        </p>
        <p>
            氏名:
            <input type="text" name="employee_name">
        </p>
        <p>
            性別
            <select name = "sexual">
                <option value="" hidden>-</option>
                <option value="1"></option>
                <option value="2"></option>
            </select>
        </p>
        <p>
            所属部署:
            <select name="department">
                <option value="" hidden>選択してください</option>
                <option value="1">システム部</option>
                <option value="2">営業部</option>
                <option value="3">総務部</option>
            </select>
        </p>
        <p>
            生年月日:
            <?php
            echo '<select name="year">'. "\n";
            $start = date('Y');
            $end = date('Y') - 100;
            for($i = $start; $i >= $end; $i--)
            {
                echo '<option value="' .$i . '">' . $i .'</option>'. "\n";
            }
            echo '</select>年' . "\n";
            echo '<select name="month">' . "\n";
            for ($i = 1; $i <= 12; $i++)
            {
                echo '<option value="' .$i . '">' . $i .'</option>'. "\n";
            }
            echo '</select>月' . "\n";
            echo '<select name="day">' . "\n";
            for ($i = 1; $i <= 31; $i++)
            {
                echo '<option value="' .$i . '">' . $i .'</option>'. "\n";
            }
            echo '</select>日' . "\n";
            ?>
        </p>
        <p>
            電話番号:
            <input type="text" name="phone_num" onKeyup="this.value=this.value.replace(/[^0-9]+/,'')">
        </p>
        <p>
            住所:
            <input type = "text" name="street">
        </p>
        <input type="submit" name="send" value="登録">
    </form>
<?
}
elseif($page_flag === 1)
{
    foreach($_SESSION['error'] as $value)
    {

        ?>
        <div class="text-danger">
        <?
        echo $value."<br>";
        ?>
        </div>
        <?
    }
?>
    <form method="POST" action ="error.php">
        <p>
            社員番号:
            <input type="number" min="1" max="9999" name="employee_num" value=<?php echo htmlspecialchars($_SESSION['employee_num'], ENT_QUOTES, 'UTF-8'); ?>>
        </p>
        <p>
            氏名:
            <input type="text" name="employee_name" value="<?php echo htmlspecialchars($_SESSION['employee_name'], ENT_QUOTES, 'UTF-8'); ?>">
        </p>
        <p>
            性別:
            <select name="sexual">
                <option value="" hidden>-</option>
                <option value="1" <?php if ($_SESSION['sexual'] === 1) echo "selected" ?>>男</option>
                <option value="2" <?php if ($_SESSION['sexual'] === 2) echo "selected" ?>>女</option>
            </select>
        </p>
        <p>
            所属部署:
            <select name="department">
                <option value="" hidden>選択してください</option>
                <option value="1" <?php if ($_SESSION['department'] === 1) echo "selected" ?>>システム部</option>
                <option value="2" <?php if ($_SESSION['department'] === 2) echo "selected" ?>>営業部</option>
                <option value="3" <?php if ($_SESSION['department'] === 3) echo "selected" ?>>総務部</option>
            </select>
        </p>
        <p>
            生年月日:
            <?php
            echo '<select name="year">'. "\n";
            $start = date('Y');
            $end = date('Y') - 100;
            for($i = $start; $i >= $end; $i--)
            {
                echo '<option value="' .$i . '">' . $_SESSION['year'] .'</option>'. "\n";
            }
            echo '</select>年' . "\n";
            echo '<select name="month">' . "\n";
            for ($i = 1; $i <= 12; $i++)
            {
                echo '<option value="' .$i . '">' . $_SESSION['month']  .'</option>'. "\n";
            }
            echo '</select>月' . "\n";
            echo '<select name="day">' . "\n";
            for ($i = 1; $i <= 31; $i++)
            {
                echo '<option value="' .$i . '">' . $_SESSION['day'] .'</option>'. "\n";
            }
            echo '</select>日' . "\n";
            ?>
        </p>
        <p>
            電話番号:
            <input type="text" name="phone_num" value="<?php echo htmlspecialchars($_SESSION['phone_num'], ENT_QUOTES, 'UTF-8'); ?>">
        </p>
        <p>
            住所:
            <input type="text" name="street" value="<?php echo htmlspecialchars($_SESSION['street'], ENT_QUOTES, 'UTF-8'); ?>">
        </p>
        <input type="submit" name="send" value="登録">
    </form>
<?
session_destroy();
}
?>
</body>
</html>

check.php

<?php

session_start();

$_SESSION['employee_num'] = (int)$_POST['employee_num'];
$_SESSION['employee_name'] = $_POST['employee_name'];
$_SESSION['sexual'] = (int)$_POST['sexual'];
$_SESSION['department'] = (int)$_POST['department'];
$_SESSION['year'] = $_POST['year'];
$_SESSION['month'] = $_POST['month'];
$_SESSION['day'] = $_POST['day'];
$_SESSION['phone_num'] = $_POST['phone_num'];
$_SESSION['street'] = $_POST['street'];
$_SESSION['error'] = array();


// エラーメッセージ
if($_POST['employee_num'] === "")
{
    $_SESSION['error'][] = "・社員番号は必ず入力してください。";
}
if($_POST['employee_name'] === "")
{
    $_SESSION['error'][] = "・氏名は必ず入力してください。";
}
if($_POST['sexual'] === "")
{
    $_SESSION['error'][] = "・性別が選択されていません。";
}

if($_POST['department'] === "")
{
    $_SESSION['error'][] = "・所属部署が選択されていません。";
}

if($_POST['phone_num'] === "")
{
    $_SESSION['error'][] = "・電話番号は必ず入力してください。";
}
if($_POST['street'] === "")
{
    $_SESSION['error'][] = "・住所は必ず入力してください。";
}


if(isset($_SESSION['error']) && !empty($_SESSION['error']))
{
    // リダイレクト
    header("location: http://localhost/employeephp/form.php"); // フォーム画面
    exit();
}

    unset($_SESSION['error']);

    $year = $_SESSION['year'];
    $month = $_SESSION['month'];
    $day = $_SESSION['day'];
    $select_month = sprintf('%02d', $month);
    $select_day = sprintf('%02d', $day);
    $total = $year.$select_month.$select_day;
    $birthday = date("Y-m-d",strtotime($total));


    $form_birthday = date('Y年m月d日',  strtotime($birthday));

    if ($_SESSION['sexual'] === 1)
    {
        $_SESSION['sexual'] = "男";
    }
    elseif ($_SESSION['sexual'] === 2)
    {
        $_SESSION['sexual'] = "女";
    }

    if ($_SESSION['department'] === 1)
    {
        $_SESSION['department'] = "システム部";
    }
    elseif ($_SESSION['department'] === 2)
    {
        $_SESSION['department'] = "営業部";
    }
    elseif ($_SESSION['department'] === 3)
    {
        $_SESSION['department'] = "総務部";
    }

    ?>
    <!DOCTYPE html>
    <html lang = "ja">
    <head>
    <meta charset="UTF-8">
    <title>確認</title>
    </head>
    <body>
    <form action = "add.php" method="post">
    <?

    // 確認画面
    echo "社員番号:" . htmlspecialchars($_SESSION['employee_num'],ENT_QUOTES,'UTF-8') . "<br>\n";
    echo "氏名:" . htmlspecialchars($_SESSION['employee_name'],ENT_QUOTES,'UTF-8') . "<br>\n";
    echo "性別:" . htmlspecialchars($_SESSION['sexual'],ENT_QUOTES,'UTF-8') . "<br>\n";
    echo "所属部署:" . htmlspecialchars($_SESSION['department'],ENT_QUOTES,'UTF-8') . "<br>\n";
    echo "生年月日:" . htmlspecialchars($form_birthday,ENT_QUOTES,'UTF-8') . "<br>\n";
    echo "電話番号:" . htmlspecialchars($_SESSION['phone_num'],ENT_QUOTES,'UTF-8') . "<br>\n";
    echo "住所:" . htmlspecialchars($_SESSION['street'],ENT_QUOTES,'UTF-8') . "<br>\n";
    ?>

<input type="submit" value="確認した上で送信">
</form>
</body>
</html>

試したこと

ページのフラグを立てて、セッションでほとんどは値の保持は出来たのですがどうしても生年月日の部分だけ値の保持の実装の仕方がわからない状況です。
どうか、ご教示お願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

          生年月日:
            <?php
             echo '<select name="year">'. "\n";
            $start = date('Y');
            $end = date('Y') - 100;
            for($i = $start; $i >= $end; $i--)
            {
                if ($_SESSION['year'] == $i)
                {
                    echo '<option value="'.$i.'" selected>' . $i .'</option>'. "\n";
                }
                else
                {
                    echo '<option value="'.$i.'">' . $i .'</option>'. "\n";
                }
            }
            echo '</select>年' . "\n";
            echo '<select name="month">' . "\n";
            for ($i = 1; $i <= 12; $i++)
            {
                if ($_SESSION['month'] == $i)
                {
                    echo '<option value="'.$i.'" selected>' . $i .'</option>'. "\n";
                }
                else
                {
                    echo '<option value="'.$i.'">' . $i .'</option>'. "\n";
                }
            }
            echo '</select>月' . "\n";
            echo '<select name="day">' . "\n";
            for ($i = 1; $i <= 31; $i++)
            {
                if ($_SESSION['day'] == $i)
                {
                    echo '<option value="'.$i.'" selected>' . $i .'</option>'. "\n";
                }
                else
                {
                    echo '<option value="'.$i.'">' . $i .'</option>'. "\n";
                }
            }
            echo '</select>日' . "\n";
            ?>


$_SESSIONが$iだった時に$iをselectedにするという条件分岐を挟んで自己解決できました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る