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

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

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

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

Q&A

解決済

3回答

34944閲覧

[PHP]お問い合わせフォームの未入力チェック

bh_C

総合スコア31

PHP

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

0グッド

7クリップ

投稿2015/04/15 15:03

お問い合わせフォームで未入力項目があるまま確認(送信)ボタンを押した場合に、
1.未入力かどうかのチェックをする
2.未入力があった場合、入力フォームのページへリダイレクト
3.未入力項目の上に「○○を記入してください」と表示する
と言うことをしたいのですが、何を追加すればいいのかわかりません
ご存知の方がいらっしゃいましたらご教授頂けると幸いでございます。
よろしくお願い致します。

★ページの流れ:
お問い合わせ入力画面(form)→確認画面(check)→完了画面(send)
★現段階までで出来ているところ

lang

1check.php 2 3<?php 4 $name = $_POST["name"]; 5 $phone = $_POST["phone"]; 6 $mail = $_POST["mail"]; 7 $message = $_POST["message"]; 8 9 $errormsg = array(); 10 if ($name == null) { 11 $errormsg[] = "名前を入力してください。"; 12 } 13 if ($phone == null) { 14 $errormsg[] = "電話番号を入力してください。"; 15 } 16 if ($mail == null) { 17 $errormsg[] = "内容を入力して下さい。"; 18 } 19 if ($message == null) { 20 $errormsg[] = "内容を入力して下さい。"; 21 22$name = htmlspecialchars($_POST['name'], ENT_QUOTES); 23$phone = htmlspecialchars($_POST['phone'], ENT_QUOTES); 24$mail = htmlspecialchars($_POST['mail'], ENT_QUOTES); 25$message = htmlspecialchars($_POST['message'], ENT_QUOTES); 26?> 27 28<form action="send.php" method="POST"> 29<input type="hidden" name="name" value="<?php echo $name; ?>" > 30<input type="hidden" name="phone" value="<?php echo $phone; ?>"> 31<input type="hidden" name="mail" value="<?php echo $mail; ?>"> 32<input type="hidden" name="message" value="<?php echo $message; ?>"> 33<html><title>お問い合わせフォーム</title></head> 34<body> 35<h1>■お問い合わせフォーム</h1><br><br> 36<p>・名前</p> 37<?php echo $name; ?> 38<p>・連絡先電話番号</p> 39<?php echo $phone; ?> 40<p>・連絡先メールアドレス</p> 41<?php echo $mail; ?> 42<p>・お問い合わせ内容</p> 43<?php echo $message; ?> 44<input type="submit" name="sends" value="確認した上で送信"> 45</form></body></html> 46

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

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

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

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

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

guest

回答3

0

ベストアンサー

まず1点目は、エラーメッセージを配列に代入するときはキーを
それぞれname,phone…など指定する。

lang

1$errormsg['message'] = "内容を入力して下さい。";

その対応するinputの下に以下のように追記する。

lang

1<div><?php echo isset($errormsg['message']) ?:'';?></div>

別の話になりますが、そもそもHTMLがおかしいです。

<html>タグより先に<input>タグが書かれています。

また、以下を記述したら入力もないのに表示させたらおかしくないですか?
入力があってエラーが無い時に以下を表示するようにするのが普通です。

lang

1<h1>■お問い合わせフォーム</h1><br><br> 2<p>・名前</p> 3<?php echo $name; ?> 4<p>・連絡先電話番号</p> 5<?php echo $phone; ?> 6<p>・連絡先メールアドレス</p> 7<?php echo $mail; ?> 8<p>・お問い合わせ内容</p> 9<?php echo $message; ?>

あと設定にもよりますが以下の記述はワーニングになると思います。

lang

1$name = $_POST["name"];

まずはデフォルト値を代入したりして
入力判定を行い、入力がある場合だけ代入するなどします。

lang

1$name = null; 2if (isset($_POST["name"])) { 3 $name = $_POST["name"]; 4}

投稿2015/04/16 01:59

icham

総合スコア559

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

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

bh_C

2015/04/16 03:23

ご指摘ありがとうございます 参考書を見ながらやっていたのが途中で混乱してしまったのかもしれません
guest

0

少し考え方を変えてみるのはどうでしょうか?

1.未入力かどうかのチェックをする
2.未入力があった場合、入力フォームのページへリダイレクト ←ここ
3.未入力項目の上に「○○を記入してください」と表示する

2番を、「入力に“不備が無かった場合”にリダイレクトする」

にしてみましょう。

そうすると

<form action="send.php" method="POST">

<form action="check.php" method="POST">

のように自分自身向けになります。

あなたが書いたプログラムの場合、
$errormsgが空ならエラーが無かったということなので、

if(count($errormsg) === 0){ header('location: send.php'); exit(); }

といった感じでリダイレクトできます。

つまり、お問い合わせ入力画面(form)→確認画面(check)を一つの画面でまかなうわけです。
この場合、

<input name="name" value="<?php if(isset($name)){ echo $name; } ?>" >

といったように、初回表示時に未定義変数へのアクセスを抑止する必要があります。

こうすると、入力値にエラーがあった場合にエラーを表示させ、そのまま入力された値を元のフォームの入力欄に表示でき、またコードも少なくて済みます。

ところが、リダイレクト先ではPOSTされた情報はわからなくなってしまいますね。
GETパラメターで渡す方法もありますが、これは経由するサーバーに情報が残ってしまうのであまりよろしくありません。

そこで、簡単な方法としてはPHPのSESSIONを利用します。

check.phpの最初に、

<?php session_start();

としておくと、接続に対してsession_idが発行され、sessionが利用できるようになります。

sessionが利用できるようになっていますので、$_SESSIONに値をセットします。

if(count($errormsg) === 0){ $_SESSION["posted"] = array( "name" => $name, "phone" => $phone, "mail" => $mail, "message" => $message ); header('location: send.php'); exit(); }

リダイレクトしたsend.phpの方でこのsessionの値を利用するので、やはりsession_start()で始めます。

<?php session_start(); echo $_SESSION["posted"]["name"]; print_r($_SESSION["posted"]);

ご記載頂いたコードのおかしい点やセキュリティなどを考慮するといろいろありますが、
考え方としてはこんな感じで良いのではないでしょうか。

投稿2015/04/16 01:53

編集2015/04/16 08:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/04/16 02:09

言葉が足りなかったとおっしゃっていますが、十分足りていると思いますよ。 サーバーサイドに全部実装しなければならないのは当たり前の事で、 ユーザビリティを考えるのはその後の話です。 綺麗で豪華な橋を渡ったら張りぼてで抜け落ちてしまったでは困りますよね。まず、渡れる橋を作ることが先決です。
bh_C

2015/04/16 03:20

詳しく書いていただきましてありがとうございます。 確かにそのとおりですね! 今後もいろいろと試しながら覚えていこうと思います
退会済みユーザー

退会済みユーザー

2015/04/16 08:21

if(count($errormsg) === 0){ の間違いでしたので修正しておきました。
guest

0

えっと前提としてPHPで全部やらないとダメなんでしょうか?

あえてPHPだけでやるなら、一つの案ですがform.phpが入力画面としたら、同じform.phpにsubmitして、入力チェックして、OKならheader等でcheck.phpへ飛ばし、アウトならそのまま入力欄横にDIVとかSPANを追加、でしょうか?
やり方はいろいろありますが、一つの案です。

でも王道としてはサブミットボタンクリック時とかでJavaScriptと言うかjQueryでチェック、OKならサブミットするとかが一番現実的ではないかと・・・
いろいろ言われますが、個人的にはJavaScriptオフを想定するなんて言うのはナンセンスな気がしてますので。

投稿2015/04/15 17:48

landy77

総合スコア1614

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

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

bh_C

2015/04/15 21:48

他にも方法があるのですね しかし今回はPHPで行います nullはform画面で行うのですね 上記のような記述で良いのでしょうか
退会済みユーザー

退会済みユーザー

2015/04/16 00:49

>えっと前提としてPHPで全部やらないとダメなんでしょうか? ダメですね。 JavaScriptなどいくらでも迂回できるので想定外の動作を意図的にさせられたり、最悪、セキュリティの穴になります。 JavaScriptでチェックするのはユーザーのストレスを軽減するためで、サーバーサイドで再チェックしなければならないのは鉄則です。
landy77

2015/04/16 00:53

>luckerさん いや、それは当然わかってますから、ユーザーのストレスを考えたらPHPだけでやらなきゃいかんのですか?と言う質問です。 それ以前の話に聞こえる(一般的な流れを知りたいのかな?と言う意味)ので、PHPオンリーでやらなきゃいけないの?という疑問です。
退会済みユーザー

退会済みユーザー

2015/04/16 00:57

分かってらっしゃるなら、結局全部をPHP側にも実装しなければならない事もわかりますよね?
bh_C

2015/04/16 01:58

言葉が足りず申し訳ございませんでした。 今回はすべてPHPで実行したいと思っています。 流れは、入力画面で未入力があるまま送信した場合、入力画面に戻り、未入力項目に「○○を入力してください」と表示させたいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問