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

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

ただいまの
回答率

90.33%

  • PHP

    21352questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML5

    4304questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHPでお問い合わせフォームを作ろうとしています!

解決済

回答 1

投稿

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

yo-bo

score 3

フォームの内容を入力し、確認画面に移動し、その後戻るボタンを押して入力画面に戻ると、ご希望の納期のselectboxの入力内容のみが消えてしまいます。入力内容を消さずにそのまま残すにはどうしたら良いでしょうか。

入力画面↓
イメージ説明

確認画面↓
イメージ説明

戻った後の入力画面↓
イメージ説明

<?php
session_start();

$mode = !empty($_POST['mode']) ? $_POST['mode'] : '';

$namae = "";
$email = "";
$deliver = "";
$honbun = "";
$error = "";
$error_namae = "";
$error_email = "";
$error_honbun = "";

if ($mode) {
    if (empty($_SESSION['token']) || $_SESSION['token'] != $_POST['token']) {
        die('不正な遷移です。');
    }
    if (empty($_POST['namae'])) {
        $error_namae = "お名前を入力してください\n";
    } else {
        $namae = htmlspecialchars($_POST['namae']);
    }
    if (empty($_POST['email'])) {
        $error_email = "メールアドレスを入力してください\n";
    } else {
        $email = htmlspecialchars($_POST['email']);
    }

    $deliver = htmlspecialchars($_POST['deliver']);

    if (empty($_POST['honbun'])) {
        $error_honbun = "本文を入力してください\n";
    } else {
        $honbun = htmlspecialchars($_POST['honbun']);
    }

    if ($error_namae || $error_email || $error_honbun) {
        $mode = 'input';
    }

    if ($mode == 'submit') {
        session_destroy();

        $to = 'yourmail@example.com';
        $subject = 'お問合せがありました';
        $message = 'お名前:' . $namae . "\n"
                . 'メールアドレス:' . $email . "\n"
                . '納期:' .$deliver . "\n"
                . '本文:' . $honbun . "\n";
        $header = 'From: sendonly@example.com';
        $result = mb_send_mail($to, $subject, $message, $header);

        if ($result) {
            header('Location: http://your-domain/thanks.html');
            exit;
        } else {
            $mode = 'error';
            $error = 'メール送信に失敗しました';
        }
    }
} else {
    $mode = 'input';
    $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(16));
}
?>
<html>
<head>
    <meta charset="UTF-8">
    <title>index.php</title>
</head>
<body>

<?php if ($mode == 'input'): ?>

    <form action="index.php" method="post">
        <input type="hidden" name="mode" value="confirm">
        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">

        <?php if ($error_namae): ?><p><em><?php echo $error_namae; ?></em></p><?php endif; ?>
        <p>お名前:<input type="text" name="namae" value="<?php echo $namae; ?>"></p>
        <?php if ($error_email): ?><p><em><?php echo $error_email; ?></em></p><?php endif; ?>
        <p>メールアドレス:<input type="email" name="email" value="<?php echo $email; ?>"></p>

        <label for="deliver">ご希望の納期</label>
        <select class="form-control mb-3" id="deliver" name="deliver" value="<?php echo $deliver; ?>">
          <option value="" disabled="" selected="">-選択してください-</option>
          <option value="できるだけ早く">できるだけ早く</option>
          <option value="1週間以内">1週間以内</option>
          <option value="2-3週間後">2-3週間後</option>
          <option value="約1-2ヶ月後">約1-2ヶ月後</option>
          <option value="約2-3ヶ月後">約2-3ヶ月後</option>
          <option value="約3-4ヶ月後">約3-4ヶ月後</option>
          <option value="約4-5ヶ月後">約4-5ヶ月後</option>
          <option value="約5-6ヶ月後">約5-6ヶ月後</option>
          <option value="約4-5ヶ月後">約4-5ヶ月後</option>
          <option value="半年以上先">半年以上先</option>
        </select>

        <?php if ($error_honbun): ?><p><em><?php echo $error_honbun; ?></em></p><?php endif; ?>
        <p>本文:<textarea name="honbun" cols="50" rows="10"><?php echo $honbun; ?></textarea></p>
        <p><button type="submit">確認</button></p>
    </form>

<?php elseif ($mode == 'confirm'): ?>

    <p>お名前:<?php echo $namae; ?></p>
    <p>メールアドレス:<?php echo $email; ?></p>
    <p>納期:<?php echo $deliver; ?></p>
    <p>本文:</p>
    <p><?php echo nl2br($honbun); ?></p>

    <form action="index.php" method="post">
        <input type="hidden" name="mode" value="input">
        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
        <input type="hidden" name="namae" value="<?php echo $namae; ?>">
        <input type="hidden" name="email" value="<?php echo $email; ?>">
        <input type="hidden" name="deliver" value="<?php echo $deliver; ?>">
        <input type="hidden" name="honbun" value="<?php echo $honbun; ?>">
        <p><button type="submit">戻る</button></p>
    </form>

    <form action="index.php" method="post">
        <input type="hidden" name="mode" value="input">
        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
        <input type="hidden" name="namae" value="<?php echo $namae; ?>">
        <input type="hidden" name="email" value="<?php echo $email; ?>">
        <input type="hidden" name="deliver" value="<?php echo $deliver; ?>">
        <input type="hidden" name="honbun" value="<?php echo $honbun; ?>">
        <p><button type="submit">戻る</button></p>
    </form>

<?php else: ?>

    <p>エラーが発生しました。</p>
    <?php if ($error): ?><p><em><?php echo $error; ?></em></p><?php endif; ?>

<?php endif; ?>

</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+4

        <select class="form-control mb-3" id="deliver" name="deliver">
          <option value="" disabled="" selected="">-選択してください-></option>
          <option value="できるだけ早く">できるだけ早く</option>
          <option value="1週間以内">1週間以内</option>
          <option value="2-3週間後">2-3週間後</option>
          <option value="約1-2ヶ月後" selected="selected">約1-2ヶ月後</option>
          <option value="約2-3ヶ月後">約2-3ヶ月後</option>
          <option value="約3-4ヶ月後">約3-4ヶ月後</option>
          <option value="約4-5ヶ月後">約4-5ヶ月後</option>
          <option value="約5-6ヶ月後">約5-6ヶ月後</option>
          <option value="約4-5ヶ月後">約4-5ヶ月後</option>
          <option value="半年以上先">半年以上先</option>
        </select>

SELECT のときは value ではなく、optionselected 属性をつけることで選択状態にすることができます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/15 15:43

    ご回答ありがとうございます。質問の書き方がよくなかったため、伝わりにくいかったかもしれませんが、デフォルトの値を設定したいのではなく、確認画面から戻るボタンを押し、入力画面に画面遷移した後に前に選択したselectの値のみが消えてしまうのを防ぎたいという事です。
    お手数お掛けしますがよろしくお願いします。

    キャンセル

  • 2018/07/15 15:45 編集

    だから、確認画面でSESSIONに保存している値を使って、selected を設定するんです。
    if文使ってロジックを書きましょう。

    キャンセル

  • 2018/07/15 21:47

    横から失礼します(回答だけ見て想像したとおりのやりとりがコメントにあったので)

    現状のソースコードおよび理解可能性から、こういう意図の回答だと思われる点を補足します。
    ```php(コード展開されないが気休め)
    <select class="form-control mb-3" id="deliver" name="deliver">
    <option value="" disabled="" selected="">-選択してください-</option>
    <option value="できるだけ早く" <?php if($deliver=="できるだけ早く"){echo 'selected="selected"';}?>>できるだけ早く</option>
    <option value="1週間以内" <?php if($deliver=="1週間以内"){echo 'selected="selected"';}?>>1週間以内</option> // ↓の下も同じことをします。
    <option value="2-3週間後">2-3週間後}</option>
    <option value="約1-2ヶ月後">約1-2ヶ月後</option>
    <option value="約2-3ヶ月後">約2-3ヶ月後</option>
    <option value="約3-4ヶ月後">約3-4ヶ月後</option>
    <option value="約4-5ヶ月後">約4-5ヶ月後</option>
    <option value="約5-6ヶ月後">約5-6ヶ月後</option>
    <option value="約4-5ヶ月後">約4-5ヶ月後</option>
    <option value="半年以上先">半年以上先</option>
    </select>
    ```

    キャンセル

  • 2018/07/15 22:12 編集

    お忙しい中ご協力してくださったお二方、ありがとうございました。
    無事解決することができました。本当にありがとうございます。

    キャンセル

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

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

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

  • PHP

    21352questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML5

    4304questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。