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

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

ただいまの
回答率

91.34%

  • PHP

    15174questions

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

PHPのリダイレクト(header関数)の条件分岐が上手く行きません

受付中

回答 1

投稿 2017/11/27 20:04 ・編集 2017/11/27 22:12

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

andrew57

score 68

PHPのリダイレクトの条件分岐が上手く行きません。

もし、新規登録フォームでエラーがあったら新規登録フォームにリダイレクトする。
もし、問題なければ確認フォームへ行く。

このようなフォームの入力チェックを行っているのですが
確認フォームへいくはずが、確認フォームへいきません。

なぜでしょうか?

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

<?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://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
 header("location: registration.php");
      exit;
session_start();

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

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

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

// エラーメッセージの配列の初期化
$_SESSION['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("/[0-9]{2,3}-[0-9]{4}-[0-9]{4}/", $tel)) {
      $errorMsg[] = "電話番号はハイフンなしで入力してください。";
  }

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


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



  } 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>


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

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



      </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>

リダイレクトした画像
イメージ説明
問題ない場合の画像(本当は確認フォームへいくはずなのに、いきません)
イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • ooeok

    2017/11/27 21:40

    必須項目を埋めたら、普通に確認フォーム表示されましたよ。それから、registration.phpに2か所間違いがあります(name"gender")。formの動作に影響ないようですが。

    キャンセル

  • andrew57

    2017/11/27 22:12

    例えばですが、header("location: registration.php"); exit; このコードは一番上に書かないとダメでしたよね?質問欄には、confirm.phpのif 分の中にheader("location: registration.php"); を書いていますが、headerを1番上に書くと、正しく入力しても確認フォームへ行かないんですよね。。

    キャンセル

  • ooeok

    2017/11/27 23:08

    そりゃ一番上に書いたら問答無用でregistration.phpへ飛んじゃうでしょう。そういうことじゃないですよね。確認フォームへ行かないのはなぜかという質問なのだから、再現する手順があるならそれを書くべきです。

    キャンセル

回答 1

+1

「header("location: registration.php");」でHTTPヘッダー出力処理をしていますが、
Location:ヘッダーってURLのフルパス(絶対URL)で書かなきゃいけないんじゃなかったかな。
「http ヘッダー location」とかでネット検索するとその手の文献はいくつも。

それと、「$errorMsg」を初期化していないことも気になります。
セッション変数は初期化しているようですが。
全くエラーが発生しない場合、初期化していない変数を参照して
Notice: Undefined variable とか
Warning: count(): Parameter must be an array or an object that implements Countable とか引き起こします。

投稿 2017/11/27 21:55

編集 2017/11/27 22:00

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.34%

関連した質問

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

  • PHP

    15174questions

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