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

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

新規登録して質問してみよう
ただいま回答率
85.46%
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2250閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/11/21 06:04

前提・実現したいこと

問い合わせフォームを作っていて、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/ツールのバージョンなど)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

php

1 <form action= <?php 2 if($_SERVER["REQUEST_METHOD"] != "POST"){ 3 echo $_SERVER["PHP_SELF"]; 4 } 5 if($_SERVER["REQUEST_METHOD"] == "POST"){ 6 if($error > 0){ echo htmlspecialchars($_SERVER["PHP_SELF"] , ENT_QUOTES); 7 }else if ($error == 0){echo "confirm.php";}} 8 <dl> 9 <dt>

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

php

1<?php 2 3$action = $_SERVER["PHP_SELF"]; 4if($_SERVER["REQUEST_METHOD"] == "POST"){ 5 if($error === 0){ 6 $action = "confirm.php"; 7 } 8} 9?> 10<form action= <?php echo $action ?> 11 <dl> 12 <dt>

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

投稿2021/11/21 07:20

編集2021/11/21 07:21
m.ts10806

総合スコア80861

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/21 09:00

みにくいコードの中ご確認とコメント頂きありがとうございます。 仰る通り、上記コードだとformタグ閉じれていないですね。(転記時に消えてしまったようです。) 頂いた形に書き換えましたが、空欄のまま1回目の送信はエラーメッセージが出ますが、 空欄のまま2回目の送信を押した際に送信できてしまいます。 $errorの変数初期化を冒頭でやっているせいでしょうか? 見にくくてすみません。HTML整理します。 >現状だと「エラーがなかった時にaction属性にconfirm.phpが入る」ので、もう1回送信ボタン押す必要があります。 →お察し頂いた通り意図した動作ではないです。
m.ts10806

2021/11/21 09:42 編集

>空欄のまま2回目の送信を押した際に送信できてしまいます。 これは後半の「エラーがなかった時にaction属性にconfirm.phpが入る」ためです。HTMLのソースを確認すると1回押した後はconfirm.phpになっているはずです。 confirmに送信するのでバリデーション関係なく送信できます。 幾つか方法はあります。 - OKの場合、POSTをセッションに入れてconfirm.phpにリダイレクトし、confirmではセッションを参照 - 初めからconfirm.phpに送信し、confirm.phpでバリデーション。NGの場合、最初の入力フォームを表示する などなど。 何が一般的かは別として、上記いずれかのやり方で満たせると思います。
退会済みユーザー

退会済みユーザー

2021/11/25 10:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問