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

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

ただいまの
回答率

91.35%

  • PHP

    15157questions

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

PHPで入力フォームのエラーを一気に出さないようにするにはどうしたら良いでしょうか?

解決済

回答 2

投稿 2017/11/27 22:23 ・編集 2017/11/28 13:56

  • 評価
  • クリップ 0
  • VIEW 67

andrew57

score 67

PHPで入力チェックを行っています。
新規登録フォームで空欄のまま、送信ボタンを押すとエラーが表示されるように実装しました。
イメージ説明
しかし、エラー表示の下の3つまで表示されてしまいます。下の3つの表示をなくし、上の5つだけ表示させるのはどうしたらよいでしょうか?

・新規登録フォーム registration.php

<?php
session_start();

if (count($_SESSION['errorMsg']) >= 1) {
  foreach ($_SESSION['errorMsg'] as $message) {
    echo "<font color=RED>・$message</font>";
    echo "<br>";
  }
  echo "";
}





 ?>


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>新規登録フォーム</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">

</head>
<body>



<form class="form-horizontal" action="confirm.php" method="post">
    <fieldset>

    <!-- Form Name -->
    <legend style=background-color:#65ace4;><h1 style=text-align:center;>新規登録フォーム</h1></legend>


    <!-- パンくずリスト-->
    <ol class="breadcrumb">
        <li><a href="http://###.###.##.##"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li>
        <li class="active">新規登録フォーム</li>
      </ol>


      <div class="container">

    <!-- Text input 名前-->
    <div class="form-group" style="margin-top:30px;">
      <label class="col-md-4 control-label" for="name">氏名 <span class="label label-danger">必須</span></label>
      <div class="col-md-4">
      <input name="name" class="form-control input-md" id="name" type="text" placeholder="例:鈴木太郎">

      </div>
    </div>




    <!-- Text input メールアドレス-->
    <div class="form-group">
      <label class="col-md-4 control-label" for="email">メールアドレス <span class="label label-danger">必須</span></label>
      <div class="col-md-4">
      <input name="email" class="form-control input-md" id="email" type="email" placeholder="例:suzuki.taro@gmail.com 半角">

      </div>
    </div>


     <!-- Text input パスワード-->
     <div class="form-group">
        <label class="col-md-4 control-label" for="password">パスワード <span class="label label-danger">必須</span></label>
        <div class="col-md-4">
        <input name="password" class="form-control input-md" id="password" type="password" placeholder="パスワード 半角">

        </div>
      </div>

    <!-- Text input 電話番号 -->
    <div class="form-group">
      <label class="col-md-4 control-label" for="tel">電話番号 <span class="label label-danger">必須</span></label>
      <div class="col-md-4">
      <input name="tel" class="form-control input-md" id="tel" type="tel" placeholder="09011112222 ハイフンなし 半角">

      </div>
    </div>

    <!-- Select Basic 都道府県 -->
    <div class="form-group">
      <label class="col-md-4 control-label" for="prefectures">都道府県 <span class="label label-danger">必須</span></label>
      <div class="col-md-4">
        <select name="prefectures" class="form-control" id="prefectures">
          <option value="選択">選択</option>
          <option value="東京">東京</option>
          <option value="名古屋">名古屋</option>
          <option value="大阪">大阪</option>
          <option value="その他">その他</option>
        </select>
      </div>
    </div>


    <!-- インラインチェックボックス 趣味 -->
        <div class="form-group">
            <label class="control-label col-md-4" for="checkbox">趣味 <span class="label label-info">任意</span></label>
            <div class="col-md-4">
              <div class="checkbox">
                  <label class="checkbox-inline">
                      <input name="hobby" type="checkbox" value="野球"> 野球
                    </label>
                    <label class="checkbox-inline">
                      <input name="hobby" type="checkbox" value="サッカー"> サッカー
                    </label>
              </div>
            </div>
          </div>



           <!-- インラインラジオボタン 性別 -->
           <div class="form-group">
              <label class="control-label col-md-4" for="checkbox">性別 <span class="label label-info">任意</span></label>
              <div class="col-md-4">
              <div class="radio-inline" name="gender">
                  <input name="gender" type="radio" value="男性" name="gender" id="man">男性
                </div>
                <div class="radio-inline">
                  <input name="gender" type="radio" value="女性" name="gender" id="woman">女性
                </div>
              </div>
            </div>



    <!-- テキストエリア お問い合わせ -->
        <div class="form-group">
          <label class="col-md-4 control-label" for="contact">お問い合わせ <span class="label label-info">任意</span></label>
          <div class="col-md-4">
            <textarea name="contact" placeholder="お問い合わせ" rows="3" class="form-control" id="contact"></textarea>
          </div>
        </div>



    <!-- Button 送信ボタン -->
    <div class="form-group">
      <label class="col-md-4 control-label" for="singlebutton"></label>
      <div class="col-sm-offset-5 col-sm-7 col-xs-offset-4 col-xs-8">
        <a href="http://192.168.33.15"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a>
        <button name="singlebutton" class="btn btn-primary" id="singlebutton">確認する</button>
      </div>
    </div>

  </div>

    </fieldset>
    </form>


    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    </body>
    </html>

確認フォーム confirm.php (最低限のコードになります)

<?php
session_start();

$keys = array(
  'name',
  'email',
  'password',
  'tel',
  'prefectures',
  'hobby',
  'gender',
  'contact'
);

// POST で受けたキー値と同名の変数に値を代入(可変変数)
foreach ($keys as $key) {
    ${$key} = $_POST[$key];
}

//
// 未入力チェック
//

// エラーメッセージの配列の初期化
$_SESSION['errorMsg'] = array();
$errorMsg = array();

// 名前の未入力チェック
if (empty($name)) {
    $errorMsg[] = "名前を入力してください。";
}

// メールアドレスの未入力チェック
if (empty($email)) {
    $errorMsg[] = "メールアドレスを入力してください。";
}

// パスワードの未入力チェック
if (empty($password)) {
    $errorMsg[] = "パスワードを入力してください。";
}

// 電話番号の未入力チェック
if (empty($tel)) {
    $errorMsg[] = "電話番号を入力してください。";
}

// 都道府県の未入力チェック
if ($prefectures == "選択") {
    $errorMsg[] = "都道府県を選択してください。";
}

  //
  // 文字数チェック
  //

  // 名前の文字数チェック
  if (strlen($name) >= 30) {
    $errorMsg[] = "氏名が長すぎます。";
  }

  // パスワード文字数チェック(8文字以上か)
  if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $password)) {
      $errorMsg[] = "パスワードは8文字以上で入力してください。";
  }

  // 電話番号の文字数チェック(10文字 or 11文字)
  if (strlen($tel) >= 1 && strlen($tel) <= 9) {
      $errorMsg[] = "電話番号は10文字か11文字で入力してください。";
  } elseif (strlen($tel) >= 12) {
      $errorMsg[] = "電話番号は10文字か11文字で入力してください。";
  }

  //
  // 形式チェック
  //

  // メールアドレス形式チェック
  if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)) {
      $errorMsg[] = "メールアドレスの形式が違います。";
  }

  // 電話番号の形式チェック
  if (preg_match("/[0-9]{2,3}-[0-9]{4}-[0-9]{4}/", $tel)) {
      $errorMsg[] = "電話番号はハイフンなしで入力してください。";
  }

  //
  // 半角英数字チェック
  //

  // メールアドレスの半角英数字チェック
  if (!preg_match("/^([a-zA-Z0-9])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)) {
      $errorMsg[] = "メールアドレスは半角で入力してください。";
  }

  // パスワードの半角英数字チェック
  if (!preg_match("/^[a-zA-Z0-9]+$/", $password)) {
     $errorMsg[] = "パスワードは半角で入力してください。";
  }

  // 電話番号の全角チェック Todo
  //if (strlen($tel) !== mb_strlen($tel, "UTF-8")) {
    //  $errorMsg[] = "電話番号に全角が含まれています。";
  //}


  if (count($errorMsg) >= 1) {
      $_SESSION['errorMsg'] = $errorMsg;
      foreach ($errorMsg as $error) {
          echo $error;
      }

      header("location: http://192.168.33.15/registration.php");
      exit;

  } else {
      session_destroy();
  }






 ?>

 <!DOCTYPE html>
 <html lang="ja">
 <head>
     <meta charset="utf-8">
     <title>確認フォーム</title>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen">
     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">

 </head>
 <body>


 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
   <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
   </body>
   </html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

サンプル

<?php

// 開発時にこれを書かないのはNG
ini_set('display_errors', TRUE);
error_reporting(E_ALL);

// セッションスタート
session_start();

// XSS対策
function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}

// POST時
if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') {

    $name = filter_input(INPUT_POST, 'name');
    $email = filter_input(INPUT_POST, 'email');

    $errors = [];
    if (empty($name)) {
        $errors['name'] = '名前は入力必須です。';
    }
    if (empty($email)) {
        $errors['email'] = 'メールは入力必須です。';
    }

    // エラーがなければ確認ページへ
    if (count($errors) === 0) {
        $_SESSION = filter_input_array(INPUT_POST);
        header('location: confirm.php');
    }
}
?><!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>サンプル</title>
        <style type="text/css">
            .red {
                color: red;
            }
        </style>
    </head>
    <body>
        <form action="" method="post">
            <?php if (isset($errors) && count($errors)) : ?>
                <div>
                    <?php foreach ($errors as $error) : ?>
                        <p class="red"><?= h($error); ?></p>
                    <?php endforeach; ?>
                </div>
            <?php endif; ?>
            <div>
                <label>必須&nbsp;名前:<input type="text" name="name" value="<?= h(filter_input(INPUT_POST, 'name')); ?>" /></label>
            </div>
            <div>
                <label>必須&nbsp;メール:<input type="text" name="email" value="<?= h(filter_input(INPUT_POST, 'email')); ?>" /></label>
            </div>
            <div>
                <button>送信</button>
            </div>
        </form>
    </body>
</html>
/**
 * confirm.php
 */
<?php
ini_set('display_errors', TRUE);
error_reporting(E_ALL);

session_start();
?><!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php var_dump($_SESSION); ?>
    </body>
</html>

投稿 2017/11/27 22:59

編集 2017/11/27 23:00

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 09:46

    ありがとうございます。こちらを参考にコーディングしてみたいと思います。

    キャンセル

+1

メアドとパスワードの文字数チェック(1文字以上入力されているかどうか)を調べる処理を入れればいいだけです。

投稿 2017/11/28 09:42

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.35%

関連した質問

同じタグがついた質問を見る

  • PHP

    15157questions

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

  • トップ
  • PHPに関する質問
  • PHPで入力フォームのエラーを一気に出さないようにするにはどうしたら良いでしょうか?