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

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

ただいまの
回答率

91.36%

  • PHP

    15137questions

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

PHPでチェックボックスのデータを受け取れません

解決済

回答 3

投稿 2017/11/29 22:50

  • 評価
  • クリップ 1
  • VIEW 81

andrew57

score 66

phpで新規登録フォームから確認フォームへ遷移する時に、なぜかチェックボックスのデータだけが遷移させることができません。いろいろ試してみたのですが、原因が特定できません。
ご教授いただけると嬉しいです。

エラーは出ていないです。

・新規登録フォーム
イメージ説明
・確認フォーム
イメージ説明

・新規登録フォーム(registration.php) チェックボックスのところのコードのみ

    <!-- インラインチェックボックス 趣味 -->
        <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>

・確認フォーム confirm.php

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

session_start();

// 文字化けを治す
header("Content-type: text/html; charset=utf-8");

// 変数の定義(初期化)
$name = "";
$email = "";
$password = "";
$tel = "";
$prefectures = "";
$hobby = "";
$gender = "";
$contact = "";

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

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


// XSS対策 サニタイズ(無毒化)
function h($string){

    if(is_array($string)){
        return array_map("h", $string);

    } else {

        return htmlspecialchars($string, ENT_QUOTES, "UTF-8");
    }
}

  // XSS対策 (hrefやsrcの値がURLか確認する)
  function urlCheck($form_Content) {
      if (!preg_match("/^(https?:.+)$/", $form_Content)) {
          return $errorMsg[] = "不正を検知しました。";
      } else {
          return true;
      }
  }



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


    $name = filter_input(INPUT_POST, 'name');
    $email = filter_input(INPUT_POST, 'email');
    $password = filter_input(INPUT_POST, 'password');
    $tel = filter_input(INPUT_POST, 'tel');
    $prefectures = filter_input(INPUT_POST, 'prefectures');
    $hobby = filter_input(INPUT_POST, 'hobby');
    $gender = filter_input(INPUT_POST, 'gender');
    $contact = filter_input(INPUT_POST, 'contact');

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  // 電話番号の数字チェック
  if (!preg_match("/[0-9]/", $tel) && $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;
      }

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

  } else {
    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="registered.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><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 h($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 h($email); ?></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 h($password); ?></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 h($tel); ?></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 h($prefectures); ?></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

          if (isset($hobby)) {
              foreach ((array)$hobby as $value) {
                  echo h($value);
              }
              echo " ";
          }


          ?></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 h($gender); ?></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 h($contact); ?></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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+5

$hobby = filter_input(INPUT_POST, 'hobby');

$post = filter_input_array(INPUT_POST, [
    'hobby' => [
        'flags' => FILTER_REQUIRE_ARRAY
    ]
]);
var_dump($post['hobby']);

または

$hobby = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT, [
    'flags' => FILTER_REQUIRE_ARRAY
]);
var_dump($hobby);

http://php.net/manual/ja/function.filter-input.php
http://php.net/manual/ja/function.filter-input-array.php

投稿 2017/11/29 23:14

編集 2017/11/29 23:19

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/30 09:23 編集

    回答の内容を支持しますが、一応・・・
    FILTER_REQUIRE_ARRAY以外の細かい設定をする必要がなければ

    $hobby = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);

    と、省略することができます

    キャンセル

  • 2017/11/30 10:23

    省略もできるんですね。
    参考になります。

    ご回答いただきありがとうございます。

    キャンセル

+2

がると申します。
filter_input関数を使う場合、デフォルトだと「配列での取得」は、出来なかった、と記憶しております。

https://teratail.com/questions/6031

にありますが、第四引数に FILTER_REQUIRE_ARRAY を指定すると、取得できるようになると思います。

投稿 2017/11/29 23:05

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

一応リストを使ってバリデートをすることもできるので参考までに。以下例だと、

  • 野球とサッカー以外は受け付けない
  • 複数選択された場合は「、」でつなぐ
<form method="post">
<input type="checkbox" name="hobby[]" value="野球">野球<br>
<input type="checkbox" name="hobby[]" value="サッカー">サッカー<br>
<input type="checkbox" name="hobby[]" value="不正な値1">不正な値1<br>
<input type="checkbox" name="hobby[]" value="不正な値2">不正な値2<br>
<input type="submit" value="go">
</form>
<?PHP
$option=[
  "options"=>["regexp"=>"/^野球|サッカー$/"],
  "flags"=>FILTER_REQUIRE_ARRAY,
  ];
$hobby = filter_input(INPUT_POST, 'hobby',FILTER_VALIDATE_REGEXP,$option);
if(is_array($hobby)){
  $hobby = array_filter($hobby,function($x){return $x!==false;});
  print implode("、",$hobby);
}

投稿 2017/11/30 10:44

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.36%

関連した質問

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

  • PHP

    15137questions

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