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

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

ただいまの
回答率

87.37%

PHP バリデーション結果に応じたform送信先の分岐方法

解決済

回答 1

投稿

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

score 1

前提・実現したいこと

問い合わせフォームを作っていて、PHPでバリデーションを行っています。
バリデーションのみで警告メッセージ(必須入力です等)表示まではできました。
①入力が正しくない場合は警告メッセージを表示
②正しく入力できた場合はconfirm.php(送信確認の表示ページ)へ送信
としたいです。

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

formタグの action = <?php echo htmlspecialchars($_SERVER["PHP_SELF"] , ENT_QUOTES);>
とした際にconfirm.phpへ飛べません
警告メッセージを出さない際にconfirm.phpへ飛ぶが知りたいです。(form actionの分岐方法)

エラーメッセージ

該当のソースコード

PHP

ソースコード
  <?php
        $name = $kana = $tel = $mail = $about = "";
        $error = 0;
        function vali($data){
          $data = trim($data);
          $data = stripslashes($data);
          $data = htmlspecialchars($data , ENT_QUOTES);
          return $data;
        }
        if($_SERVER["REQUEST_METHOD"] == "POST"){
          $name = vali($_POST["name"]);
          $kana = vali($_POST["kana"]);
          $tel= vali($_POST["tel"]);
          $mail = vali($_POST["mail"]);
          $about= vali($_POST["about"]);
        }
        ?>

      <form action= <?php
        if($_SERVER["REQUEST_METHOD"] != "POST"){
          echo $_SERVER["PHP_SELF"];
        }
        if($_SERVER["REQUEST_METHOD"] == "POST"){
          if($error > 0){ echo htmlspecialchars($_SERVER["PHP_SELF"] , ENT_QUOTES);
          }else if ($error == 0){echo "confirm.php";}}
        <dl>
          <dt>
             <label for="name"><h2>お名前<span>*</span></h2></label>
          </dt>
          <dd>
              if($_SERVER["REQUEST_METHOD"] == "POST"){
                if (empty($_POST['name']) || mb_strlen($_POST['name']) > 10){
                  echo"お名前は必須入力です。10文字以内でご入力ください。";
                }
            }
            ?>
             <input type=text name="name" placeholder="山田太郎"  id="name" size="100" value=<?php echo "$name"; ?> >
          </dd>
          <dt>
           <label for="kana"><h2>フリガナ<span>*</span></h2></label>
          </dt>
          <dd>
             <?php
             if($_SERVER["REQUEST_METHOD"] == "POST"){
               if (empty($_POST['kana'])  || mb_strlen($_POST['kana']) > 10){
                 $error = 1;
                  echo "フリガナは必須入力です。10文字以内でご入力ください。";
                 }
               }
               ?>
              <input type="text" name="kana" placeholder="ヤマダタロウ" id="kana" size="100" value=<?php echo "$kana"; ?>>
          </dd>
          <label><dt>
              <label for="tel"><h2>お電話番号</h2></label>
          </dt>
          <dd>
             <?php
            if($_SERVER["REQUEST_METHOD"] == "POST"){
               if (!empty($_POST['tel']) && !preg_match("/[0-9]*/",$_POST['tel'])) {
                 $error = 1;
                 echo "電話番号は0~9の数字のみでご入力ください。";
                }
              }
              ?>
              <input type="text" name="tel" placeholder="1234567890" id="tel" size="100" value=<?php echo "$tel"; ?>>
          </dd>
      <dt>
             <label for="mail"><h2>メールアドレス<span>*</span></h2></label>
          </dt>
          <dd>
             <?php
             if($_SERVER["REQUEST_METHOD"] == "POST"){
               if(empty($_POST['mail']) || !preg_match("/^[a-z0-9]+[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-_]+$/",$_POST['mail'])){
                 $error = 1;
                 echo "メールアドレスは正しくご入力ください。";
               }
             }
             ?>
             <input type="text" name="mail" placeholder="mail@mail.com" id="mail" size="100" value=<?php echo "$mail"; ?>>
          </dd>
        </dl>
       <label for="submit"><h2>内容をご記入ください<span>*</span></h2></label>
        <?php
        if($_SERVER["REQUEST_METHOD"] == "POST"){
          if(empty($_POST['about'])){
            $error = 1;
            echo "内容は必須入力です。";
          }
        }
        ?>
        <textarea name="about" rows="8" cols="100" value=<?php echo "$about"; ?>></textarea>
        <button type="submit" name="submit" class ="btn">送信</button>
      </form>

試したこと


上記のようにaction にifを使用し、
警告メッセージを出すたびにエラーをカウントし、$_POSTの際にはエラーの数値に応じてactionを分岐させるよう試みましたが、うまくいきません。(POST時に$errorも初期化されている?)


</form>の前にifを使用しエラーカウントに応じて$xに値を入れて、$xに応じてactionを分岐させるよう試みましたが、POST時に$xが見つからないと出てしまいました。
if($error > 0){
$x = 1;
}else{$x =0;}

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

HTMLの1属性の中にロジックがあってすごくごちゃっとしてるので整理されたほうが良いかと。

      <form action= <?php
        if($_SERVER["REQUEST_METHOD"] != "POST"){
          echo $_SERVER["PHP_SELF"];
        }
        if($_SERVER["REQUEST_METHOD"] == "POST"){
          if($error > 0){ echo htmlspecialchars($_SERVER["PHP_SELF"] , ENT_QUOTES);
          }else if ($error == 0){echo "confirm.php";}}
        <dl>
          <dt>


↓ おそらくこれだけでいいはず。

<?php

$action = $_SERVER["PHP_SELF"];
if($_SERVER["REQUEST_METHOD"] == "POST"){
   if($error === 0){
       $action = "confirm.php";
   }
}
?>
<form action= <?php echo $action ?>
        <dl>
          <dt>

ただ、整理したとしてもformタグのaction属性閉じてなくて、タグ自体も >で締められてないのでレイアウトがおかしくなるんでは?
また、現状だと「エラーがなかった時にaction属性にconfirm.phpが入る」ので、もう1回送信ボタン押す必要があります。これは意図した動作でしょうか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/11/21 18:00

    みにくいコードの中ご確認とコメント頂きありがとうございます。
    仰る通り、上記コードだとformタグ閉じれていないですね。(転記時に消えてしまったようです。)
    頂いた形に書き換えましたが、空欄のまま1回目の送信はエラーメッセージが出ますが、
    空欄のまま2回目の送信を押した際に送信できてしまいます。
    $errorの変数初期化を冒頭でやっているせいでしょうか?

    見にくくてすみません。HTML整理します。
    >現状だと「エラーがなかった時にaction属性にconfirm.phpが入る」ので、もう1回送信ボタン押す必要があります。
    →お察し頂いた通り意図した動作ではないです。

    キャンセル

  • 2021/11/21 18:41 編集

    >空欄のまま2回目の送信を押した際に送信できてしまいます。
    これは後半の「エラーがなかった時にaction属性にconfirm.phpが入る」ためです。HTMLのソースを確認すると1回押した後はconfirm.phpになっているはずです。
    confirmに送信するのでバリデーション関係なく送信できます。

    幾つか方法はあります。

    - OKの場合、POSTをセッションに入れてconfirm.phpにリダイレクトし、confirmではセッションを参照
    - 初めからconfirm.phpに送信し、confirm.phpでバリデーション。NGの場合、最初の入力フォームを表示する

    などなど。
    何が一般的かは別として、上記いずれかのやり方で満たせると思います。

    キャンセル

  • 2021/11/25 19:45

    セッションを入れる方法で解決できました!
    ありがとうございます!

    キャンセル

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

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

関連した質問

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