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

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

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

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

バリデーション

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

Q&A

解決済

1回答

6754閲覧

PHPのバリデーションメッセージを表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

バリデーション

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

0グッド

0クリップ

投稿2021/02/28 05:29

編集2021/02/28 10:09

##解決したいこと
PHPのお問い合わせフォームで、画面上部のエラーが表示されずにバリデーションメッセージを表示させたい。
問題箇所は電話番号とメールアドレスです。
現在、以下のように、電話番号とメールアドレスのバリデーションメッセージを表示させると、画面上部に黒字で2つのエラーが表示されます。このエラーをなくし、バリデーションメッセージを表示させたいです。
イメージ説明
イメージ説明

##該当コード
お問い合わせフォーム
contact.php

<?php ini_set('display_errors', "On"); session_start(); require '../common/header.php'; require_once('validation.php'); require_once('../common/database.php'); require_once('../common/function.php'); $contactData = getDatabaseSelect(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../style/contact.css"> <link rel="stylesheet" href="../style/header.css"> <link rel="stylesheet" href="../style/footer.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="../public/js/header.js"></script> <script src="../public/js/header2.js"></script> <!-- <script src="../public/js/val.js"></script> --> <title>CAFE</title> </head> <body> <div class="contact-wrapper"> <div class="container"> <div class="top-title"> <h2>お問い合わせ</h2> </div> <div class="form-contents"> <div class="f-title"> <h3>下記の項目をご記入の上送信ボタンを押してください</h3> </div> <p class="text"> 送信頂いた件につきましては、当社より折り返しご連絡差し上げます。<br> なお、ご連絡までに、お時間頂く場合もございますので予めご了承ください。<br> <label class="kome">*</label>は必須項目になります。 </p> <form action="" method="POST"> <div class="mb-3"> <label>氏名</label><label class="kome">*</label><br> <?php if(isset($errors['name'])): ?> <div class="vali"><?php echo $errors['name']; ?></div> <?php endif; ?> <input type="text" id="f-name" name="name" value="<?php echo h($_SESSION['name']) ?>" placeholder="山田太郎"> </div> <div class="mb-3"> <label>フリガナ</label><label class="kome">*</label><br> <?php if(isset($errors['kana'])): ?> <div class="vali"><?php echo $errors['kana']; ?></div> <?php endif; ?> <input type="text" id="f-kana" name="kana" value="<?php echo h($_SESSION['kana']) ?>" placeholder="ヤマダタロウ"> </div> <div class="mb-3"> <label>電話番号</label><label class="kome">*</label><br> <?php if(isset($errors['tel'])): ?> <div class="vali"><?php echo $errors['tel']; ?></div> <?php endif; ?> <input type="text" id="f-tel" name="tel" value="<?php echo h($_SESSION['tel']) ?>" placeholder="09012345678"> </div> <div class="mb-3"> <label>メールアドレス</label><label class="kome">*</label><br> <?php if(isset($errors['email'])): ?> <div class="vali"><?php echo $errors['email']; ?></div> <?php endif; ?> <input type="text" id="f-email" name="email" value="<?php echo h($_SESSION['email']) ?>" placeholder="test@test.co.jp"> </div> <div class="f-title f-bottom"> <h3>お問い合わせ内容をご記入ください<label class="kome">*</label></h3> </div> <?php if(isset($errors['contact'])): ?> <div class="vali"><?php echo $errors['contact']; ?></div> <?php endif; ?> <div class="mb-3"> <textarea id="contact" name="contact" rows="7"><?php echo h($_SESSION['contact']) ?></textarea> </div> <input type="hidden" name="csrf_token" value="<?php echo setToken(); ?>"> <button type="submit" class="btn" name="btn_confirm">送信</button> </form> </div> </div> </div> <table> <tr> <th>氏名</th> <th>フリガナ</th> <th>電話番号</th> <th>メールアドレス</th> <th>お問い合わせ内容</th> </tr> <?php foreach($contactData as $col): ?> <tr> <td><?php echo h($col['name']) ?></td> <td><?php echo h($col['kana']) ?></td> <td><?php echo h($col['tel']) ?></td> <td><?php echo h($col['email']) ?></td> <td><?php echo nl2br(h($col['body'])) ?></td> <td><a href="edit.php?id=<?php echo h($col['id']); ?>">編集</a></td> <td><a class="delete-btn" href="delete.php?id=<?php echo h($col['id']); ?>">削除</a></td> </tr> <?php endforeach; ?> </table> <?php include("../common/footer.php"); ?> </body> </html>

confirm.php

<?php ini_set('display_errors', "On"); if (empty($_SERVER["HTTP_REFERER"])) { header('Location: ./contact.php'); exit; } session_start(); require_once('../common/function.php'); if(isset($_POST['name'])) { $_SESSION['name'] = $_POST['name']; } if(isset($_POST['kana'])) { $_SESSION['kana'] = $_POST['kana']; } if(isset($_POST['tel'])) { $_SESSION['tel'] = $_POST['tel']; } if(isset($_POST['email'])) { $_SESSION['email'] = $_POST['email']; } if(isset($_POST['contact'])) { $_SESSION['contact'] = $_POST['contact']; } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../style/confirm.css"> <link rel="stylesheet" href="../style/footer.css"> <link rel="stylesheet" href="../style/header.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="../public/js/header.js"></script> <script src="../public/js/header2.js"></script> <title>CAFE</title> </head> <body> <?php include("../common/header.php"); ?> <div class="confirm-wrapper"> <div class="container"> <div class="title"> <h2>お問い合わせ</h2> </div> <div class="form-contents"> <p class="text"> 下記の内容をご確認の上送信ボタンを押してください<br> 内容を訂正する場合は戻るボタンを押してください。 </p> </div> <form action="complete.php" method="POST"> <div class="form"> <div class="mb-3"> <div class="name">氏名</div> <p><?php echo h($_SESSION['name']); ?></p> </div> <div class="mb-3"> <div class="name">フリガナ</div> <p><?php echo h($_SESSION['kana']); ?></p> </div> <div class="mb-3"> <div class="name">電話番号</div> <p><?php echo h($_SESSION['tel']); ?></p> </div> <div class="mb-3"> <div class="name">メールアドレス</div> <p><?php echo h($_SESSION['email']); ?></p> </div> <div class="mb-3"> <div class="name">お問い合わせ内容</div> <p><?php echo nl2br(h($_SESSION['contact'])); ?></p> </div> <button type="submit" class="btn">送信</button> <a href="contact.php" class="return-btn">戻る</a> </div> </form> </div> </div> <?php include("../common/footer.php"); ?> </body> </html>

バリデーション
validation.php

<?php $errors = []; // 名前の空欄チェック // if(isset($_POST['name'])) { if(empty($_POST['name']) || mb_strlen($_POST['name']) > 10) { $errors['name'] = "名前は必須です。10文字以内で入力してください。"; } // } // フリガナの空欄チェック // if(isset($_POST['kana'])) { if(empty($_POST['kana']) || mb_strlen($_POST['kana']) > 10) { $errors['kana'] = "フリガナは必須です。フリガナは10文字以内で入力してください"; } // } // 電話番号のチェック // if(isset($_POST['tel'])) {←コメントアウト if(!preg_match("/^[0-9]+$/", $_POST['tel'])) {←エラー1の20行目 $errors['tel'] = "電話番号は0-9までの数字を入力してください"; } // } // 正しいEmailの形式化どうか // if(isset($_POST['email'])) {←コメントアウト if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {←エラー2の27行目 $errors['email'] = "正しいメールアドレスを指定してください"; } // } // お問い合わせ内容の空欄チェック // if(isset($_POST['contact'])) { if(empty($_POST['contact'])) { $errors['contact'] = "お問い合わせ内容は必須です"; } // } ?>

##試したこと
notice:indexなので、validation.phpの19行目にあるようにissetをつけたり外したりした。
つけると、バリデーションメッセージが表示されなくなる。

どのようにコードを書けば、名前やフリガナのようにnoticeエラーも表示されずにバリデーションメッセージが表示されるのでしょうか?

<?php $errors = []; $name = ""; $kana = ""; $tel = ""; $email = ""; $contact = ""; if($_SERVER['REQUEST_METHOD'] === 'POST'){ //以下バリデーション $name = filter_input(INPUT_POST,'name'); $kana = filter_input(INPUT_POST,'kana'); $tel = filter_input(INPUT_POST,'tel'); $email = filter_input(INPUT_POST,'email'); $contact = filter_input(INPUT_POST,'contact'); // 名前の空欄チェック if(empty($name) || mb_strlen($name) > 10) { $errors['name'] = "名前は必須です。10文字以内で入力してください。"; } // フリガナの空欄チェック if(empty($kana) || mb_strlen($kana) > 10) { $errors['kana'] = "フリガナは必須です。フリガナは10文字以内で入力してください"; } // 電話番号のチェック if(!isset($tel) || !preg_match("/^[0-9]+$/", $tel)) { $errors['tel'] = "電話番号は0-9までの数字を入力してください"; } // 正しいEmailの形式化どうか if(!isset($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors['email'] = "正しいメールアドレスを指定してください"; } // お問い合わせ内容の空欄チェック if(empty($contact)) { $errors['contact'] = "お問い合わせ内容は必須です"; } } if(empty($errors)) { $_SESSION['name'] = $name; $_SESSION['kana'] = $kana; $_SESSION['tel'] = $tel; $_SESSION['email'] = $email; $_SESSION['contact'] = $contact; header('Location: ./confirm.php'); } ?>

【追記】
データを登録し、再度お問い合わせフォームで登録しようとすると、confirm.phpにリダイレクトされ、全て空の状態になってしまっている。
イメージ説明
※本当ならば、氏名などのデータが入っている状態

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

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

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

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

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

m.ts10806

2021/02/28 05:45

validation.php はどこで利用されてるのでしょうか。
退会済みユーザー

退会済みユーザー

2021/02/28 06:20

contact.phpで利用しています。 require_once('validation.php');でvalidation.phpを呼び出しています。
m.ts10806

2021/02/28 06:21

この提示の仕方では分からないので、なるべくコードは全体を記載してください。
退会済みユーザー

退会済みユーザー

2021/02/28 06:33

承知いたしました。contact.phpのコード全体を追記したのでご確認くださいませ。
hentaiman

2021/02/28 08:53

バリデーションしない場合の動作は問題無く作れているんですか? どこを理解出来ていないのか分からないので現時点ではアドバイスは出来ませんが、不足している知識が分かればまた参照すべきマニュアルをペロッと貼り付けるぐらいは出来ますが
guest

回答1

0

ベストアンサー

contact.phpで利用しています。

require_once('validation.php');でvalidation.phpを呼び出しています。

contact.phpで当該表示が出ているのでしたら「送信時」ではなく「contact.phpにアクセス時」に起きているものと思います。
アクセスしたときはGETなのでPOSTは何も入ってません。
validation.phpでは各項目はPOST固定でチェックしているようなので、
REQUEST METHODの条件式を入れるべきです。

php

1if($_SERVER['REQUEST_METHOD'] === 'POST'){ 2//以下バリデーション 3 4 5}

そして、nameを改ざんされることも考えてissetを入れる(他も。empty()では'0'0はemptyと判定されます)

php

1if(!isset($_POST['tel']) || !preg_match("/^[0-9]+$/", $_POST['tel'])) {←エラー120行目 2 $errors['tel'] = "電話番号は0-9までの数字を入力してください"; 3} 4

(指定されてないときも不正とする例)

そもそもですが、contact.phpにあるformはconfirm.phpに対するリクエストを送るようになっています。
telやemail以外もリクエスト送られるようにはなっていません。

なので、「バリデーションメッセージを入力画面に表示させて確認画面にいきたい」のでしたら

  • form送信先はcontact.phpに。action属性指定しなかったら自身になるので指定しなくていい
  • REQUEST METHODみたうえでバリデーション
  • バリデーションにかからなければセッションに入力値を保管して($_POSTそのままでもいい)、confirm.phpにリダイレクト

という感じですかね。

投稿2021/02/28 06:35

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2021/02/28 07:09

ご回答ありがとうございます。バリデーションエラーメッセージの表示はとりあえずできました。ただ、confirm.phpにリダイレクトさせる書き方は、追記で書いたようなコードで実現しなかったので、どのように書けばよろしいでしょうか?
m.ts10806

2021/02/28 07:56 編集

この条件だと「バリデーションにかからなければ」ではなく「REQUEST METHODがPOST以外なら」です。 contact.php にアクセスしてもすぐconfimに飛ばされるようになっていませんか。
退会済みユーザー

退会済みユーザー

2021/02/28 07:56

バリデーション にかからなければという条件にするためには、どのように書けばいいのでしょうか?
m.ts10806

2021/02/28 07:58

ご自身が書かれたコードからすると$errorsという配列の変数にバリデーションにかかった場合にエラーメッセージを保管していっています。 ということは、配列の変数が空だった場合には「バリデーションにかからなかった」と言えるのではないでしょうか。
退会済みユーザー

退会済みユーザー

2021/02/28 08:15

ありがとうございます。ご指摘いただいたことを追記に反映しましたが、 if($errors === 0) { $_SESSION['name'] = $_POST['name']; $_SESSION['kana'] = $_POST['kana']; $_SESSION['tel'] = $_POST['tel']; $_SESSION['email'] = $_POST['email']; $_SESSION['contact'] = $_POST['contact']; header('Location: ./confirm.php'); } に記述しました。しかし、confirm.phpに遷移せずにcontact.phpにリダイレクトされ、入力したデータもクリアされてしまいます。 バリデーションに引っかからない条件の時にconfirm.phpに値を保持したままページ背にさせるにはどこが原因なのでしょうか?
m.ts10806

2021/02/28 08:44

2021/02/28 17:13 にコメントしてます。 $errors === 0 では配列自身が0と等しいかを比較しています。
m.ts10806

2021/02/28 08:47

入力されたデータのクリアは初期値を$_SESSION['name']などとセッションにしており、 バリデーションに引っ掛からなかったときに何も入ってないからです。 セッション値よりPOSTの値を別途取り出して初期値とした方が良いでしょう。 $errors = []; $name = ''; if($_SERVER['REQUEST_METHOD'] === 'POST'){ $name = filter_input(INPUT_POST,'name'); if(empty($name) || mb_strlen($name) > 10) { $errors['name'] = "名前は必須です。10文字以内で入力してください。"; } //中略 <input type="text" id="f-name" name="name" value="<?php echo h($name) ?>" placeholder="山田太郎">
m.ts10806

2021/02/28 09:35 編集

折角PHPマニュアルのリンクしたのに・・・ https://www.php.net/manual/ja/function.count.php あと、$errorsが空ということは一通りOKということなのでその中でisset()する必要はないです。 あと、filter_input使ってるので$_POST参照する必要はないです。 私もそう書いてます。 $name = filter_input(INPUT_POST,'name'); if(empty($name) || mb_strlen($name) > 10) { セッションに入れるときも $_SESSION['name'] = $name; でいいです。 むしろバリデーションされてる前提なら下記でもいいくらい。 $_SESSION['post'] = $_POST;
退会済みユーザー

退会済みユーザー

2021/02/28 09:36

上記のようにvalidation.phpに記述したんですが、headerでリダイレクトしているせいなのか、confirm.phpにページ遷移したらcontact.phpに戻れない状態になりました。 考えられるのは、contact.phpで入力し、confirm.phpにデータをpostしてvalidation.phpでpostデータがある時にconfirm.phpにリダイレクトしているからなのだと思いますが... headerでリダイレクトせずにcontact.phpにも戻れる方法ってどんなのが考えられますか?
退会済みユーザー

退会済みユーザー

2021/02/28 09:39

あああ、、本当にたびたびすいません。もう少し考えてみます。
m.ts10806

2021/02/28 09:39

>confirm.phpにページ遷移したらcontact.phpに戻れない状態になりました。 confirm.phpの実装次第です。 「戻る時はPOSTではなくリンク」でもいいかもしれませんね。 「POSTのときは$_POSTからGETのときは$_SESSIONから」という処理も必要になりそうです。
退会済みユーザー

退会済みユーザー

2021/02/28 13:02

お付き合いいただきましてありがとうございました。 バリデーションメッセージを表示させることは達成したので、ベストアンサーに選出させていただきました。 まだ、ページ遷移については自力で解決できていないので、別途質問を作成し、目標物に近づけるよう精進します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問