前提・実現したいこと
PHPで作成したコンタクトフォームにバリデーションを 電話番号に【ハイフン抜き半角数字9~11桁】 という制限をつけて実装しました。
バリデーションに引っかかると確認ページに移行せずにエラーメッセージを表示するような仕様で作りましたが、なぜかエラーページが表示されます。※下記写真
入力した番号は「090-4567-4567」です。エラーページから戻るボタンを押すと元の入力ページにエラーメッセージが表示されている状態で画面に表示されています。
他のメールアドレス等は不正な入力があるとページ移動せずエラーメッセージが表示されるだけなのですが、電話番号のぺー時移行を防ぐにはどのようにすればよろしいでしょうか。
ちなみにエラーページに飛びますがそのときにコンソール上にはエラーメッセージは表示されません。
※文字数制限でHTMLのコードははいりませんでした。必要でしたらお申し付けください。
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' ]; ?>
confirm.php(確認ページ)
<?php //セッションを開始 session_start(); //エスケープ処理やデータチェックを行う関数のファイルの読み込み require '../libs/functions.php'; //POSTされたデータをチェック $_POST = checkInput( $_POST ); //固定トークンを確認(CSRF対策) if ( isset( $_POST[ 'ticket' ], $_SESSION[ 'ticket' ] ) ) { $ticket = $_POST[ 'ticket' ]; if ( $ticket !== $_SESSION[ 'ticket' ] ) { //トークンが一致しない場合は処理を中止 die( 'Access Denied!' ); } } else { //トークンが存在しない場合は処理を中止(直接このページにアクセスするとエラーになる) die( 'Access Denied(直接このページにはアクセスできません)' ); } //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 ( $body == '' ) { $error[ 'body' ] = '*内容は必須項目です。'; //制御文字(タブ、復帰、改行を除く)でないことと文字数をチェック } else 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
回答2件
あなたの回答
tips
プレビュー