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

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

ただいまの
回答率

91.36%

  • PHP

    15137questions

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

  • 配列

    402questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

PHPの入力チェックでエラーを配列で受け渡し、入力画面に表示させたいです

解決済

回答 1

投稿 2017/11/25 21:49

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

andrew57

score 66

前提・実現したいこと

PHPの入力チェックで確認フォームから「エラーを新規登録画面に配列で受け渡し」エラー内容を入力画面に表示させたいです
新規登録フォームでエラーが出た場合は、リダイレクトさせて新規登録フォームの戻らせている状態です。

発生している問題

エラー内容を「確認画面」から「新規登録画面」に配列で受け渡せないこと。
受け渡すことはできているのですが、空欄になっているフォームだけ、エラー内容を新規登録画面に送ることができないです。
今は、「氏名」「メールアドレス」のみエラーチェックを行っています。

・registration.php(新規登録画面) 左上にエラーが出ています。
イメージ説明

registration.php(新規登録画面) 

<?php
session_start();

$errors[] = $_GET["name_error"];
$errors[] = $_GET["email_error"];

if ($errors >= 1) {
    foreach ($errors as $value) {
        echo $value;
        echo "<br>";
    }
    echo "";
}



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>



<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://192.168.33.15"><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();

$name = $_POST["name"];
$email = $_POST["email"];
$password = $_POST["password"];
$tel = $_POST["tel"];
$prefectures = $_POST["prefectures"];
$hobby = $_POST["hobby"];
$gender = $_POST["gender"];
$contact = $_POST["contact"];

// エラーメッセージの配列の初期化
$errormsg = array();

// 未入力チェック

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

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

if ($errormsg >= 1) {
    foreach ($errormsg as $error) {
        echo $error;
    }
    header("location: registration.php?name_error=名前を入力してください&email_error=メールアドレスを入力してください。");
    exit();
}

  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>


   <form class="form-horizontal" action="#" method="post">
     <fieldset>

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

       <ol class="breadcrumb">
           <li><a href="http://192.168.33.15"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li>
           <li><a href="http://192.168.33.15/registration.html">新規登録フォーム</a></li>
           <li class="active">確認フォーム</li>
         </ol>

    <div class="container">

       <div class="form-group">
           <label class="col-sm-5 control-label">氏名</label>
           <div class="col-sm-5">
               <p class="form-control-static"><?php echo $name; ?></p>
           </div>
       </div>

       <div class="form-group">
           <label class="col-sm-5 control-label">メールアドレス</label>
           <div class="col-sm-5">
               <p class="form-control-static"><?php echo $email; ?></p>
           </div>
       </div>




    <div class="button-group">
      <div class="col-md-5 col-sm-offset-5 col-sm-7 col-xs-offset-4 col-xs-8">
        <a href="http://192.168.33.15/registration.php"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a>
        <button type="submit" class="btn btn-primary">送信する</button>
        <p class="help-block" style=margin-top:15px;>以上の内容でよろしければ、送信ボタンを押してください。</p>
      </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>

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

php PHP 5.3.3

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

$_SESSION を活用すると、上手く書けるのではないでしょうか

registration.php (PHP 部のみ):

<?php
// require_once('vendor/autoload.php'); // composer でインストールしたライブラリの読み込み
session_start();

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

// eval(\Psy\sh()); // Psysh : ブレークポイントの設定

confirm.php (PHP 部のみ):

<?php
// require_once('vendor/autoload.php'); // composer でインストールしたライブラリの読み込み
session_start();

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

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

// eval(\Psy\sh()); // Psysh : ブレークポイントの設定

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

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

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

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

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

  header("location: registration.php");
  exit();
} else {
  session_destroy();
}

簡単に書いてみましたが、何か参考になれば幸いです

※かなり早い段階で管理が大変になるので、スッピンのPHP で機能を実装していくのはお勧めしません なにかしらテンプレートエンジンの導入、ライブラリの利用や、用途に応じたWeb Application Framework の導入をお勧めします

 Links

投稿 2017/11/26 02:21

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/26 12:56

    ご丁寧にありがとうございます!

    もう一つご質問なのですが

    ${$key}


    ${$key} はなぜ{}で囲っているのでしょうか?

    キャンセル

  • 2017/11/26 17:27 編集

    単純に処理の順番で: $key の値(ここでは name)を文字列として展開、$ + 文字列で変数名として解釈($name)、それに対して代入処理($name = ...) ...といった流れだと思います

    (詳細な説明は他の人におまかせしたいと思います)

    キャンセル

  • 2017/11/26 17:52

    ご丁寧にありがとうございます!

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

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

  • PHP

    15137questions

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

  • 配列

    402questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。