yopisan
@yopisan (kota)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

入力フォームに正しく入力できていない場合、エラーメッセージを出す方法。

入力フォームに正しく入力できていない場合、エラーメッセージを出す方法。

phpで入力フォームの実装中にvalidationの設定をしたはずなのに、エラーメッセージだけが出ないことになりました。(尚正式な入力を行なっていない場合には、入力フォームに戻ることはできている)
なぜ出ないのかわからなくなってしまったので、どなたかアドバイス等お願いいたします。

発生している問題・エラー

バリデーションの設定
• 送信されたパラメータの入力チェック(バリデーション)を入れてください。 処理はJS(JQuery)とPHP両方で行うこと(JSはブラウザ上で無効にできる為) [バリデーション内容]

  • 氏名 → 空チェック、10文字以内(半角、全角区別なし)
  • フリガナ → 空チェック、10文字以内(半角、全角区別なし)
  • 電話番号 → 数字(0-9)かどうか
  • メールアドレス → 空チェック、メールアドレス(xxx@xxx)かどうか - お問い合わせ内容 → 空チェック(確認画面で改行を読み込むこと)

該当するソースコード

contact.php
<body>
    <div class="form-wrapper">
      <div class="error">
        <h1>
          <?php 
            if(isset($_SESSION["texts"])){
            foreach($_SESSION["texts"] as $error){
              echo $error."<br>";
              }
            }?>
        </h1>
      </div>        
      <div class="form">
        <div class="form-title">
          <h1>お問い合わせ</h1>
        </div>
        <div class="form-main">
          <div class="back">  
            <h2>下記の項目をご記入の上送信ボタンを押してください</h2>
          </div>  
            <p>送信頂いた件につきましては、当社より折り返しご連絡を差し上げます。<br>
               なお、ご連絡までに、お時間を頂く場合もございますので予めご了承ください。<br>
            <span>*</span>は必須項目となります。</p>
            <form action="" method="POST">
              <div class="form-contents">
                <div class="form-content">
                  <h3>氏名<span>*</span></h3>
                  <input type="text" name="name" 
                    value="<?php 
                      if(!empty($_SESSION["name"])){
                        echo $_SESSION["name"];
                      }
                      ?>" placeholder="山田太郎" class="inputName">
                </div>
                <div class="form-content">
                  <h3>フリガナ<span>*</span></h3>
                  <input type="text" name="kana" 
                    value="<?php 
                      if(!empty($_SESSION["kana"])){
                        echo $_SESSION["kana"];
                      }
                      ?>" placeholder="ヤマダタロウ" class="inputKana">
                </div>
                <div class="form-content">
                  <h3>電話番号</h3>
                  <input type="text" name="phone" 
                  value="<?php 
                  if(!empty($_SESSION["phone"])){
                    echo $_SESSION["phone"];
                  }
                  ?>" placeholder="09012345678" class="inputPhone">
                </div>
                <div class="form-content">
                  <h3>メールアドレス<span>*</span></h3>
                  <input type="text" name="address"
                    value="<?php 
                    if(!empty($_SESSION["address"])){
                      echo $_SESSION["address"];
                    }
                    ?>" placeholder="test@test.co.jp" class="inputAddress">
                </div>
              </div>
              <div class="back">  
                <h2>お問い合わせ内容をご記入ください<span>*</span></h2>
              </div>  
              <textarea name="question" class="inputQuestion"><?php 
                if(!empty($_SESSION["question"])){
                  echo $_SESSION["question"];
                }?></textarea><br>
              <input type="submit" value="送    信" class="form-submit" formaction="validate.php" >
            </form>
          </div>
        </div>

    </div>

該当するソースコード

validate.php
<?php
foreach($_POST as $key => $val){
    $_SESSION[$key] = $val;
}
    
    $error = 0;
    $errorText = [];

    if(empty($_SESSION["name"])) {
        array_push($errorText,"名前を入力してください。");
        $error++;
    };


    if(mb_strlen($_SESSION["name"]) >10) {
        array_push($errorText,"名前は10文字以内で入力してください。");
        $error++;
    };

    if(empty($_SESSION["kana"])) {
        array_push($errorText,"フリガナを入力してください。");
        $error++;
    };
    
    if(mb_strlen($_SESSION["kana"]) > 10) {
        array_push($errorText,"フリガナは10文字以内で入力してください。");
        $error++;
    };
    
    if(is_numeric($_SESSION["phone"]) == false) {
        array_push($errorText,"電話番号は0~9の数字で入力してください。");
        $error++;
    };

    if(empty($_SESSION["address"])) {
        array_push($errorText,"メールアドレスを入力してください。");
        $error++;
    };
    
    if(!empty($_SESSION["address"]) && !preg_match("/.@./",$_SESSION["address"])) {
        array_push($errorText,"正しいメールアドレスを入力してください。");
        $error++;
    };

    if(empty($_SESSION["question"])) {
        array_push($errorText,"お問い合わせ内容を入力してください。");
        $error++;
    };

    if($error == 0 ){
        header("Location:confirm.php");
    } else {
        unset($_SESSION["texts"]);
        foreach($errorText as $text){
            $_SESSION["texts"][] = $text;
        }
        header("Location:contact.php");
    }
?>

該当するソースコード

index.js
//contact.php

window.addEventListener('DOMContentLoaded', function(){
  if (document.URL.match("/contact.php") || document.URL.match("/confirm.php") ||  document.URL.match("/complete.php")){
      $(".header-container").addClass('fixedBlack');
  }

  $(".form-submit").on("click",function(){
      $error = 0;
      $errorText = [];
  
      if($(".inputName").val() == "") {
          $errorText.push("名前を入力してください。");
          $error++;
      };
  
      if($(".inputName").val().length > 10) {
          $errorText.push("名前は10文字以内で入力してください。");
          $error++;
      };
  
      if($(".inputkana").val() == "") {
          $errorText.push("フリガナを入力してください。");
          $error++;
      };
      
        if($(".inputkana").val().length > 10) {
          $errorText.push("フリガナは10文字以内で入力してください。");
          $error++;
      };
      
      if(!$.isNumeric($(".inputPhone").val())) {
          $errorText.push("電話番号は0~9の数字で入力してください。");
          $error++;
      };
  
      if($(".inputAddress").val() == "") {
          $errorText.push("メールアドレスを入力してください。");
          $error++;
      };
      
      
      if(!$(".inputAddress").val() == "" && !$(".inputAddress").val().match(".@.")) {
          $errorText.push("正しいメールアドレスを入力してください。");
          $error++;
      };
  
      if($(".inputQuestion").val() == "") {
          $errorText.push("お問い合わせ内容を入力してください。");
          $error++;
      };
  
      if($error > 0){
          $errorLog = "";
          $.each($errorText,function(key,val){
              $errorLog = $errorLog +"\n"+val;
          });
          alert($errorLog);
      }
  });
});

自分で試したこと

資料も読みましたが、結局今の現状から、どこを直せばいいのかもわからないです。
https://web-svr.com/PHP%E7%B7%A8/61.php
https://www.sejuku.net/blog/29821
PHPでメールフォームを作ってみよう【プログラミングクッキング】
https://www.youtube.com/watch?v=tHLnMiRXzNw&t=675s

0

1Answer

JavaScriptの処理は期待どおりに動いていて、PHPのvalidationが期待どおりに動いていない、ということでいいでしょうか?
残念ながら添付の画像からだと、どのような動きをしているのか判断が難しいところです。(画面遷移しているか など)

現状で気になるのはセッションが使える状態かどうかです。
記載のコードではsession_startをしていないようですが、他のところでしているのでしょうか?
これをやらないとセッションは使えません。
まずは$_SESSIONを用いてページ間で値のやり取りができるか確認してください。

0Like

Comments

  1. @yopisan

    Questioner

    コメントありがとうございます。
    画像がわかりにくく申し訳ございません。
    javascriptに関しては、正常に動いていてはいました。入力されていなかったらアラートで呼び出しはできていたので、ただ、phpが動かない状態です。
    画面の遷移に関しては
    https://i.gyazo.com/b3988361fb1bd7d681c0ca73082a44da.gif
    全ての入力が正常に行われた場合、ページの遷移は一応できています。なので、入力ができていなかった場合のエラーメッセージができていない状態です。
    セッションが使える状態かどうかは確かめてみたところ、今回載せているページにはありませんでしたが、別のページにsession_start();は書いてありました。
  2. session_startはそれぞれのページで、セッションを使う前に実行する必要があります。

    あとはvar_dumpメソッドなどで変数の中身を確認してみるのも良いと思います。
    例えば「validate.phpで$_SESSIONに値がセットされているか」「contact.phpでその値が参照できるか」など。
  3. @yopisan

    Questioner

    コメントありがとうございます。
    やはり@blue32aさんがおっしゃられた通り、各ページにセットしたことでエラーメッセージ
    が出るようになりました。なるほど、そういった方法で調べてみる方法もあるのですね!
    まだまだ、phpの知識が浅いのでもっと深めていきます。
    ありがとうございました。
  4. var_dumpメソッドなどで値を出力し、どのように処理されているか確認するのは、原始的ですが有効です。

    システム開発はいろいろな要素を扱うので、いっぺんにやろうとすると、どこに問題があるのか分からずに詰まってしまいます。
    小さな実験を繰り返して、理解できている領域を広げていくのが良いでしょう。
  5. @yopisan

    Questioner

    おっしゃる通りで、まさに一番最後にやってしまったおかげで、どこが間違っていたのかもわからなくなっていたので、一つ一つコツコツとやっていく重要性が理解できました。
    これからも精進いたします。ありがとうございました。

Your answer might help someone💌