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

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

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

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

Q&A

解決済

1回答

775閲覧

コンタクトフォームに情報を打ち込んで確認画面へ移動できない。

takuo5

総合スコア48

PHP

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

0グッド

0クリップ

投稿2020/04/02 06:47

編集2020/04/02 09:56

前提・実現したいこと

PHP初心者です。
下記のページを参考にしてコンタクトフォームを作成していますが、入力画面に必須情報をすべて入力して確認ボタンを押しましたが確認ページへ移動せず白紙のページが表示されます。
リンク内容
エラーメッセージを見るとfunction.phpのエンコードの部分でエラーが発生していると思うのですがどのように修正すればよろしいでしょうか。
解決方法を教えていただきたいです。

発生している問題・エラーメッセージ

Thu Apr 2 06:29:01 2020] 127.0.0.1:50300 [500]: /contact/confirm.php - Call to undefined function mb_check_encoding() in /home/ec2-user/environment/libs/functions.php on line 22

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' ]; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>コンタクトフォーム</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <link href="../style.css" rel="stylesheet"> </head> <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> <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>

function.php

<?php //エスケープ処理を行う関数 function h($var) { if(is_array($var)){ //$varが配列の場合、h()関数をそれぞれの要素について呼び出す(再帰) return array_map('h', $var); }else{ return htmlspecialchars($var, ENT_QUOTES, 'UTF-8'); } } //入力値に不正なデータがないかなどをチェックする関数 function checkInput($var){ if(is_array($var)){ return array_map('checkInput', $var); }else{ //NULLバイト攻撃対策 if(preg_match('/\0/', $var)){ die('不正な入力です。'); } //文字エンコードのチェック if(!mb_check_encoding($var, 'UTF-8')){ die('不正な入力です。'); } //改行、タブ以外の制御文字のチェック if(preg_match('/\A[\r\n\t[:^cntrl:]]*\z/u', $var) === 0){ die('不正な入力です。制御文字は使用できません。'); } return $var; } }

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

OS : Mac
使用しているツール
AWS Cloud9
PHP 5.6.40

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

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

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

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

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

m.ts10806

2020/04/02 07:52

>PHP初心者です。 わざわざ書かずとも「初心者アイコン」をつけるので十分です。 その9文字を質問充実にあててください。
takuo5

2020/04/02 07:58

ありがとうございます。 今後そのように致します。
m.ts10806

2020/04/02 09:28

質問は編集できますので、今練習しておくと良いかと。
guest

回答1

0

ベストアンサー

mb_check_encoding()関数を使用するには、mbstringモジュールが必要です。
おそらくAWS Cloud9のPHPには標準で上記のモジュールが入っていないため、エラーが発生していると思われます。
画面下部のコンソールで以下のコマンドを実行し、mbstringモジュールをインストールしてみてください。

sudo yum install php56-mbstring

投稿2020/04/02 07:19

takumi9942

総合スコア24

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

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

takuo5

2020/04/02 07:57

ありがとうございます。 上記のものをインストールすれば問題なく確認ページを表示することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問