前提・実現したいこと
入力画面(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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/04 03:14