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

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

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

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

バリデーション

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

Q&A

解決済

1回答

4750閲覧

PHPのフォームのページ遷移をさせたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

バリデーション

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

0グッド

0クリップ

投稿2021/02/28 13:30

##解決したいこと
・バリデーションを実装時でも3つのページ遷移をさせたい
・セッション状態が残っていると、バリデーションエラーがないとみなされて、いきなりデータが空の確認ページに飛ばされてしまう。(2回目実行時)

##状況
お問い合わせフォーム(contact.php)→入力確認ページ(confirm.php)→完了ページ(complete.php)でページ遷移して入力データを登録させています。
バリデーションを何もつけずに入力していけば、以下のようにページ遷移がうまくいきます。

お問い合わせフォーム
イメージ説明

確認ページ
イメージ説明

完了ページ
イメージ説明

ただ、バリデーションをつけてページ遷移させようとすると、うまくいきません。
※前のセッションが残っていると、いきなりconfirm.phpにダイレクトされて以下のようになる。
イメージ説明
戻るボタンを押してもお問い合わせフォームに遷移せずに確認ページのまま
送信ボタンを押すと完了ページに遷移するが、空のデータが登録されてしまう。

##該当のコード
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">←バリデーションなしの時はaction="confirm.php" <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> 以下文字数の関係で略

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>

complete.php(完了ページ)

<?php ini_set('display_errors', "On"); if (empty($_SERVER["HTTP_REFERER"])) { header('Location: ./contact.php'); exit; } session_start(); require '../common/database.php'; require '../common/function.php'; $name = h($_SESSION['name']); $kana = h($_SESSION['kana']); $tel = h($_SESSION['tel']); $email = h($_SESSION['email']); $body = h($_SESSION['contact']); // データベースの登録 getDatabaseInsert($name,$kana,$tel,$email,$body); ?> <!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/complete.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> <title>CAFE</title> </head> <body> <?php include("../common/header.php"); ?> <div class="complete-wrapper"> <div class="container"> <div class="title"> <h2>お問い合わせ</h2> </div> <div class="form-contents"> <p class="text"> お問い合わせ頂きありがとうございます。<br> 送信頂いた件につきましては、当社より折り返しご連絡差し上げます。<br> なお、ご連絡までに、お時間頂く場合もございますので予めご了承ください。<br> </p> <div class="top"> <a href="../home/index.php">トップへ戻る</a> </div> </div> </div> </div> <?php include("../common/footer.php"); ?> </body> </html>

validation.php(バリデーション)

<?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($errors)) { $_SESSION['name'] = $name; $_SESSION['kana'] = $kana; $_SESSION['tel'] = $tel; $_SESSION['email'] = $email; $_SESSION['contact'] = $contact; header('Location: ./confirm.php'); } ?>

正直に言えば、コードも様々なサイトを参考にし、つぎはぎの部分があります。
PHPがわかっている方達にとってはお見苦しいコードになっていると思いますが、何卒ご指摘のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

GETでcontact.phpに遷移したときにif(empty($errors)) {... }が処理されてしまってます。
POSTの場合にのみ処理しましょう。

php

1以下略 2 } 3 if(empty($errors)) { 4 $_SESSION['name'] = $name; 5 $_SESSION['kana'] = $kana; 6 $_SESSION['tel'] = $tel; 7 $_SESSION['email'] = $email; 8 $_SESSION['contact'] = $contact; 9 header('Location: ./confirm.php'); 10 }

php

1以下略 2 if(empty($errors)) { 3 $_SESSION['name'] = $name; 4 $_SESSION['kana'] = $kana; 5 $_SESSION['tel'] = $tel; 6 $_SESSION['email'] = $email; 7 $_SESSION['contact'] = $contact; 8 header('Location: ./confirm.php'); 9 } 10 }

投稿2021/02/28 13:36

Y.H.

総合スコア7914

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

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

退会済みユーザー

退会済みユーザー

2021/02/28 13:39

すみません。コードはどのように違うのでしょうか...?
Y.H.

2021/02/28 13:39

記載しているとおりです。
Y.H.

2021/02/28 13:42 編集

validation.php の回答に記載上の部分を、下の部分に置換えましょう。 POSTの場合にif(empty($errors)) {... }が処理するように変更しています
退会済みユーザー

退会済みユーザー

2021/02/28 14:24

ありがとうございます!!無事に実装できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問