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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2111閲覧

コンタクトフォームの必須項目の変更をしたい。

takuo5

総合スコア48

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/04/03 08:05

編集2020/04/03 14:18

前提・実現したいこと

入力画面(contact.php)⇛確認画面(confirm.php)⇛完了画面(complete.php)という構造で問い合わせフォームの実装をしていますが、
項目が 名前・メールアドレス・電話番号・件名・問い合わせ内容 です。
この内電話番号だけ必須条件になっていない状態で、これを必須条件にしたくconfirm.phpに下記の

if ( $tel == '' ) {
$error[ 'tel' ] = '*電話番号は必須です。';
}

を追加して電話番号入力欄を殻にして確認ボタンを押すとエラーページが表示されました。
イメージ説明
その他の項目で空にして確認ボタンを押すと下記のようにページ移動せずにエラーメッセージが表示されます。
イメージ説明

上記を実現するにはどこを修正する必要がありますでしょうか。

contact.php

<?php //セッションを開始 session_start(); //セッションIDを更新して変更(セッションハイジャック対策) session_regenerate_id( TRUE ); //エスケープ処理やデータチェックを行う関数のファイルの読み込み require '../libs/functions.php'; //初回以外ですでにセッション変数に値が代入されていれば、その値を。そうでなければNULLで初期化 $name = isset( $_SESSION[ 'name' ] ) ? $_SESSION[ 'name' ] : NULL; $email = isset( $_SESSION[ 'email' ] ) ? $_SESSION[ 'email' ] : NULL; $email_check = isset( $_SESSION[ 'email_check' ] ) ? $_SESSION[ 'email_check' ] : NULL; $tel = isset( $_SESSION[ 'tel' ] ) ? $_SESSION[ 'tel' ] : NULL; $subject = isset( $_SESSION[ 'subject' ] ) ? $_SESSION[ 'subject' ] : NULL; $body = isset( $_SESSION[ 'body' ] ) ? $_SESSION[ 'body' ] : NULL; $error = isset( $_SESSION[ 'error' ] ) ? $_SESSION[ 'error' ] : NULL; //個々のエラーを初期化 $error_name = isset( $error['name'] ) ? $error['name'] : NULL; $error_email = isset( $error['email'] ) ? $error['email'] : NULL; $error_email_check = isset( $error['email_check'] ) ? $error['email_check'] : NULL; $error_tel = isset( $error['tel'] ) ? $error['tel'] : NULL; $error_tel_format = isset( $error['tel_format'] ) ? $error['tel_format'] : NULL; $error_subject = isset( $error['subject'] ) ? $error['subject'] : NULL; $error_body = isset( $error['body'] ) ? $error['body'] : NULL; //CSRF対策の固定トークンを生成 if ( !isset( $_SESSION[ 'ticket' ] ) ) { //セッション変数にトークンを代入 $_SESSION[ 'ticket' ] = sha1( uniqid( mt_rand(), TRUE ) ); } //トークンを変数に代入 $ticket = $_SESSION[ 'ticket' ]; ?> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script> jQuery(function($){ //エラーを表示する関数(error クラスの p 要素を追加して表示) function show_error(message, this$) { text = this$.parent().find('label').text() + message; this$.parent().append("<p class='error'>" + text + "</p>"); } //フォームが送信される際のイベントハンドラの設定 $("#main_contact").submit(function(){ //エラー表示の初期化 $("p.error").remove(); $("div").removeClass("error"); var text = ""; $("#errorDispaly").remove(); //メールアドレスの検証 var email = $.trim($("#email").val()); if(email && !(/^([a-z0-9+_\-]+)(.[a-z0-9+_\-]+)*@([a-z0-9\-]+.)+[a-z]{2,6}$/gi).test(email)){ $("#email").after("<p class='error'>メールアドレスの形式が異なります</p>"); } //確認用メールアドレスの検証 var email_check = $.trim($("#email_check").val()); if(email_check && email_check != $.trim($("input[name="+$("#email_check").attr("name").replace(/^(.+)_check$/, "$1")+"]").val())){ show_error("が異なります", $("#email_check")); } //電話番号の検証 var tel = $.trim($("#tel").val()); if(tel && !(/^(?\d{2,5})?[-(.\s]{0,2}\d{1,4}[-).\s]{0,2}\d{3,4}$/gi).test(tel)){ $("#tel").after("<p class='error'>電話番号の形式が異なります(半角英数字でご入力ください)</p>"); } //1行テキスト入力フォームとテキストエリアの検証 $(":text,textarea").filter(".validate").each(function(){ //必須項目の検証 $(this).filter(".required").each(function(){ if($(this).val()==""){ show_error(" は必須項目です", $(this)); } }); //文字数の検証 $(this).filter(".max30").each(function(){ if($(this).val().length > 30){ show_error(" は30文字以内です", $(this)); } }); $(this).filter(".max50").each(function(){ if($(this).val().length > 50){ show_error(" は50文字以内です", $(this)); } }); $(this).filter(".max100").each(function(){ if($(this).val().length > 100){ show_error(" は100文字以内です", $(this)); } }); //文字数の検証 $(this).filter(".max1000").each(function(){ if($(this).val().length > 1000){ show_error(" は1000文字以内でお願いします", $(this)); } }); }); //error クラスの追加の処理 if($("p.error").length > 0){ $("p.error").parent().addClass("error"); $('html,body').animate({ scrollTop: $("p.error:first").offset().top-180 }, 'slow'); return false; } }); //テキストエリアに入力された文字数を表示 $("textarea").on('keydown keyup change', function() { var count = $(this).val().length; $("#count").text(count); if(count > 1000) { $("#count").css({color: 'red', fontWeight: 'bold'}); }else{ $("#count").css({color: '#333', fontWeight: 'normal'}); } }); }) </script> </body> </html>

confirm.php

<?php //セッションを開始 session_start(); //エスケープ処理やデータチェックを行う関数のファイルの読み込み require '../libs/functions.php'; //POSTされたデータをチェック URLの直たたき対策 $_POST = checkInput( $_POST ); //固定トークンを確認(CSRF対策) if ( isset( $_POST[ 'ticket' ], $_SESSION[ 'ticket' ] ) ) { $ticket = $_POST[ 'ticket' ]; if ( $ticket !== $_SESSION[ 'ticket' ] ) { //トークンが一致しない場合は処理を中止 die( 'Access Denied!' ); } } else { //トークンが存在しない場合は処理を中止(直接このページにアクセスするとエラーになる) $_SERVER['HTTP_HOST']; dirname($_SERVER['PHP_SELF']); header('Location: /contact_form/contact/contact.php'); exit(); } //POSTされたデータを変数に格納 $name = isset( $_POST[ 'name' ] ) ? $_POST[ 'name' ] : NULL; $email = isset( $_POST[ 'email' ] ) ? $_POST[ 'email' ] : NULL; $email_check = isset( $_POST[ 'email_check' ] ) ? $_POST[ 'email_check' ] : NULL; $tel = isset( $_POST[ 'tel' ] ) ? $_POST[ 'tel' ] : NULL; $subject = isset( $_POST[ 'subject' ] ) ? $_POST[ 'subject' ] : NULL; $body = isset( $_POST[ 'body' ] ) ? $_POST[ 'body' ] : NULL; //POSTされたデータを整形(前後にあるホワイトスペースを削除) $name = trim( $name ); $email = trim( $email ); $email_check = trim( $email_check ); $tel = trim( $tel ); $subject = trim( $subject ); $body = trim( $body ); //エラーメッセージを保存する配列の初期化 $error = array(); //値の検証(入力内容が条件を満たさない場合はエラーメッセージを配列 $error に設定) if ( $name == '' ) { $error[ 'name' ] = '*お名前は必須項目です。'; //制御文字でないことと文字数をチェック } else if ( preg_match( '/\A[[:^cntrl:]]{1,30}\z/u', $name ) == 0 ) { $error[ 'name' ] = '*お名前は30文字以内でお願いします。'; } if ( $email == '' ) { $error[ 'email' ] = '*メールアドレスは必須です。'; } else { //メールアドレスを正規表現でチェック $pattern = '/^([a-z0-9+_\-]+)(.[a-z0-9+_\-]+)*@([a-z0-9\-]+.)+[a-z]{2,6}$/uiD'; if ( !preg_match( $pattern, $email ) ) { $error[ 'email' ] = '*メールアドレスの形式が正しくありません。'; } } if ( $email_check == '' ) { $error[ 'email_check' ] = '*確認用メールアドレスは必須です。'; } else { //メールアドレスを正規表現でチェック if ( $email_check !== $email ) { $error[ 'email_check' ] = '*メールアドレスが一致しません。'; } } if ( preg_match( '/^[0-9]{2,3}[0-9]{2,4}[0-9]{3,4}$/', $tel ) == 0 ) { $error[ 'tel' ] = '*電話番号は9~11桁のハイフン無しでお願いします。'; } if ( $tel != '' && preg_match( '/\A(?\d{2,5})?[-(.\s]{0,2}\d{1,4}[-).\s]{0,2}\d{3,4}\z/u', $tel ) == 0 ) { $error[ 'tel_format' ] = '*電話番号の形式が正しくありません。'; } if ( $subject == '' ) { $error[ 'subject' ] = '*件名は必須項目です。'; //制御文字でないことと文字数をチェック } else if ( preg_match( '/\A[[:^cntrl:]]{1,100}\z/u', $subject ) == 0 ) { $error[ 'subject' ] = '*件名は100文字以内でお願いします。'; } if ( preg_match( '/\A[\r\n\t[:^cntrl:]]{1,1050}\z/u', $body ) == 0 ) { $error[ 'body' ] = '*内容は1000文字以内でお願いします。'; } //POSTされたデータとエラーの配列をセッション変数に保存 $_SESSION[ 'name' ] = $name; $_SESSION[ 'email' ] = $email; $_SESSION[ 'email_check' ] = $email_check; $_SESSION[ 'tel' ] = $tel; $_SESSION[ 'subject' ] = $subject; $_SESSION[ 'body' ] = $body; $_SESSION[ 'error' ] = $error; //チェックの結果にエラーがある場合は入力フォームに戻す if ( count( $error ) > 0 ) { //エラーがある場合 $dirname = dirname( $_SERVER[ 'SCRIPT_NAME' ] ); $dirname = $dirname == DIRECTORY_SEPARATOR ? '' : $dirname; $url = ( empty( $_SERVER[ 'HTTPS' ] ) ? 'http://' : 'https://' ) . $_SERVER[ 'SERVER_NAME' ] . $dirname . '/contact.php'; header( 'HTTP/1.1 303 See Other' ); header( "location: {$url}"); exit; } ?>

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

AWS Cloud9
PHP 5.6.40

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

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

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

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

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

guest

回答1

0

自己解決

contact.phpのHTMLコードがはいりきらなかったのでこちらに貼り付けておきます。

<body> <div class="container"> <h2>お問い合わせフォーム</h2> <p>以下のフォームからお問い合わせください。</p> <form id="main_contact" method="post" action="confirm.php"> <div class="form-group"> <label for="name">お名前(必須) <span class="error"><?php echo h( $error_name ); ?></span> </label> <input type="text" class="form-control validate max50 required" id="name" name="name" placeholder="氏名" value="<?php echo h($name); ?>"> </div> <div class="form-group"> <label for="email">Email(必須) <span class="error"><?php echo h( $error_email ); ?></span> </label> <input type="text" class="form-control validate mail required" id="email" name="email" placeholder="Email アドレス" value="<?php echo h($email); ?>"> </div> <div class="form-group"> <label for="email_check">Email(確認用 必須) <span class="error"><?php echo h( $error_email_check ); ?></span> </label> <input type="text" class="form-control validate email_check required" id="email_check" name="email_check" placeholder="Email アドレス(確認のためもう一度ご入力ください。)" value="<?php echo h($email_check); ?>"> </div> <div class="form-group"> <label for="tel">お電話番号(半角英数字) <span class="error"><?php echo h( $error_tel ); ?></span> <span class="error"><?php echo h( $error_tel_format ); ?></span> </label> <input type="text" class="validate max30 tel form-control" id="tel" name="tel" value="<?php echo h($tel); ?>" placeholder="お電話番号(半角英数字でご入力ください)"> </div> <div class="form-group"> <label for="subject">件名(必須) <span class="error"><?php echo h( $error_subject ); ?></span> </label> <input type="text" class="form-control validate max100 required" id="subject" name="subject" placeholder="件名" value="<?php echo h($subject); ?>"> </div> <div class="form-group"> <label for="body">お問い合わせ内容 <span class="error"><?php echo h( $error_body ); ?></span> </label> <span id="count"> </span>/1000 <textarea class="form-control validate max1000 required" id="body" name="body" placeholder="お問い合わせ内容(1000文字まで)をお書きください" rows="3"><?php echo h($body); ?></textarea> </div> <button type="submit" class="btn btn-primary">確認画面へ</button> <!--確認ページへトークンをPOSTする、隠しフィールド「ticket」--> <input type="hidden" name="ticket" value="<?php echo h($ticket); ?>"> </form> </div>

投稿2020/04/03 08:07

takuo5

総合スコア48

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

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

takuo5

2020/04/04 03:14

ご質問の仕方が悪かったので改めます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問