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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

3回答

1590閲覧

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

dog57

総合スコア131

PHP

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

0グッド

1クリップ

投稿2017/11/29 13:50

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

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

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

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

php

1 <!-- インラインチェックボックス 趣味 --> 2 <div class="form-group"> 3 <label class="control-label col-md-4" for="checkbox">趣味 <span class="label label-info">任意</span></label> 4 <div class="col-md-4"> 5 <div class="checkbox"> 6 <label class="checkbox-inline"> 7 <input name="hobby[]" type="checkbox" value="野球"> 野球 8 </label> 9 <label class="checkbox-inline"> 10 <input name="hobby[]" type="checkbox" value="サッカー"> サッカー 11 </label> 12 </div> 13 </div> 14 </div> 15

・確認フォーム confirm.php

php

1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', TRUE); 4error_reporting(E_ALL); 5 6session_start(); 7 8// 文字化けを治す 9header("Content-type: text/html; charset=utf-8"); 10 11// 変数の定義(初期化) 12$name = ""; 13$email = ""; 14$password = ""; 15$tel = ""; 16$prefectures = ""; 17$hobby = ""; 18$gender = ""; 19$contact = ""; 20 21$form_Content = array($name, $email, $password, $tel, $prefectures, $hobby, $gender, $contact); 22 23// エラーメッセージの配列の初期化 24$errorMsg = array(); 25// セッション変数の初期化 26$_SESSION['errorMsg'] = array(); 27 28 29// XSS対策 サニタイズ(無毒化) 30function h($string){ 31 32 if(is_array($string)){ 33 return array_map("h", $string); 34 35 } else { 36 37 return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 38 } 39} 40 41 // XSS対策 (hrefやsrcの値がURLか確認する) 42 function urlCheck($form_Content) { 43 if (!preg_match("/^(https?:.+)$/", $form_Content)) { 44 return $errorMsg[] = "不正を検知しました。"; 45 } else { 46 return true; 47 } 48 } 49 50 51 52// POST時 53if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') { 54 55 56 $name = filter_input(INPUT_POST, 'name'); 57 $email = filter_input(INPUT_POST, 'email'); 58 $password = filter_input(INPUT_POST, 'password'); 59 $tel = filter_input(INPUT_POST, 'tel'); 60 $prefectures = filter_input(INPUT_POST, 'prefectures'); 61 $hobby = filter_input(INPUT_POST, 'hobby'); 62 $gender = filter_input(INPUT_POST, 'gender'); 63 $contact = filter_input(INPUT_POST, 'contact'); 64 65// 66// 未入力チェック 67// 68 69// エラーメッセージの配列の初期化 70$errorMsg = array(); 71 72// 名前の未入力チェック 73if (empty($name)) { 74 $errorMsg[] = "名前を入力してください。"; 75} 76 77// メールアドレスの未入力チェック 78if (empty($email)) { 79 $errorMsg[] = "メールアドレスを入力してください。"; 80} 81 82// パスワードの未入力チェック 83if (empty($password)) { 84 $errorMsg[] = "パスワードを入力してください。"; 85} 86 87// 電話番号の未入力チェック 88if (empty($tel)) { 89 $errorMsg[] = "電話番号を入力してください。"; 90} 91 92// 都道府県の未入力チェック 93if ($prefectures == "選択") { 94 $errorMsg[] = "都道府県を選択してください。"; 95} 96 97 // 98 // 文字数チェック 99 // 100 101 // 名前の文字数チェック 102 if (strlen($name) >= 60) { 103 $errorMsg[] = "氏名が長すぎます。"; 104 } 105 106 // パスワード文字数チェック(8文字以上か) 107 if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $password)) { 108 $errorMsg[] = "パスワードは8文字以上で入力してください。"; 109 } 110 111 // 電話番号の文字数チェック(10文字 or 11文字) 112 if (strlen($tel) >= 1 && strlen($tel) <= 9 && preg_match("/^[0-9]+$/", $tel)) { 113 $errorMsg[] = "電話番号は10文字か11文字で入力してください。"; 114 } elseif (strlen($tel) >= 12 && preg_match("/^[0-9]+$/", $tel)) { 115 $errorMsg[] = "電話番号は10文字か11文字で入力してください。"; 116 } 117 118 // 119 // 形式チェック 120 // 121 122 // メールアドレス形式チェック 123 if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $email) && $email !== "") { 124 $errorMsg[] = "メールアドレスに間違いがあります。"; 125 } 126 127 // 電話番号の形式チェック 128 if (preg_match("/[-]+/", $tel)) { 129 $errorMsg[] = "電話番号はハイフンなしで入力してください。"; 130 } 131 132 // 133 // 半角英数字チェック 134 // 135 136 // 電話番号の数字チェック 137 if (!preg_match("/[0-9]/", $tel) && $tel !== "") { 138 $errorMsg[] = "電話番号は半角数字で入力してください。"; 139 } 140 141 142 // 電話番号の全角チェック Todo 143 //if (strlen($tel) !== mb_strlen($tel, "UTF-8")) { 144 // $errorMsg[] = "電話番号に全角が含まれています。"; 145 //} 146 147 148 if (count($errorMsg) >= 1) { 149 $_SESSION['errorMsg'] = $errorMsg; 150 foreach ($errorMsg as $error) { 151 echo $error; 152 } 153 154 header("location: http://192.168.33.15/registration.php"); 155 exit; 156 157 } else { 158 echo ""; 159 } 160 161 162 163} 164 165 ?> 166 167 <!DOCTYPE html> 168 <html lang="ja"> 169 <head> 170 <meta charset="utf-8"> 171 <title>確認フォーム</title> 172 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 173 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 174 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 175 176 </head> 177 <body> 178 179 180 <form class="form-horizontal" action="registered.php" method="post"> 181 <fieldset> 182 183 <!-- Form Name --> 184 <legend style=background-color:#65ace4;><h1 style=text-align:center;>確認フォーム</h1></legend> 185 186 <ol class="breadcrumb"> 187 <li><a href="http://192.168.33.15"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li> 188 <li><a href="http://192.168.33.15/registration.html">新規登録フォーム</a></li> 189 <li class="active">確認フォーム</li> 190 </ol> 191 192 <div class="container"> 193 194 <div class="form-group"> 195 <label class="col-sm-5 control-label">氏名</label> 196 <div class="col-sm-5"> 197 <p class="form-control-static"><?php echo h($name); ?></p> 198 </div> 199 </div> 200 201 <div class="form-group"> 202 <label class="col-sm-5 control-label">メールアドレス</label> 203 <div class="col-sm-5"> 204 <p class="form-control-static"><?php echo h($email); ?></p> 205 </div> 206 </div> 207 208 <div class="form-group"> 209 <label class="col-sm-5 control-label">パスワード</label> 210 <div class="col-sm-5"> 211 <p class="form-control-static"><?php echo h($password); ?></p> 212 </div> 213 </div> 214 215 216 <div class="form-group"> 217 <label class="col-sm-5 control-label">電話番号</label> 218 <div class="col-sm-5"> 219 <p class="form-control-static"><?php echo h($tel); ?></p> 220 </div> 221 </div> 222 223 <div class="form-group"> 224 <label class="col-sm-5 control-label">都道府県</label> 225 <div class="col-sm-5"> 226 <p class="form-control-static"><?php echo h($prefectures); ?></p> 227 </div> 228 </div> 229 230 <div class="form-group"> 231 <label class="col-sm-5 control-label">趣味</label> 232 <div class="col-sm-5"> 233 <p class="form-control-static"><?php 234 235 if (isset($hobby)) { 236 foreach ((array)$hobby as $value) { 237 echo h($value); 238 } 239 echo " "; 240 } 241 242 243 ?></p> 244 </div> 245 </div> 246 247 <div class="form-group"> 248 <label class="col-sm-5 control-label">性別</label> 249 <div class="col-sm-5"> 250 <p class="form-control-static"><?php echo h($gender); ?></p> 251 </div> 252 </div> 253 254 <div class="form-group"> 255 <label class="col-sm-5 control-label">お問い合わせ</label> 256 <div class="col-sm-5"> 257 <p class="form-control-static"><?php echo h($contact); ?></p> 258 </div> 259 </div> 260 261 262 <div class="button-group"> 263 <div class="col-md-5 col-sm-offset-5 col-sm-7 col-xs-offset-4 col-xs-8"> 264 <a href="http://192.168.33.15/registration.php"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a> 265 <button type="submit" class="btn btn-primary">送信する</button> 266 <p class="help-block" style=margin-top:15px;>以上の内容でよろしければ、送信ボタンを押してください。</p> 267 </div> 268 </div> 269 270 271 272 273 274</div> 275 </fieldset> 276 </form> 277 278 279 280 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 281 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 282 </body> 283 </html> 284

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

php

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

php

1$post = filter_input_array(INPUT_POST, [ 2 'hobby' => [ 3 'flags' => FILTER_REQUIRE_ARRAY 4 ] 5]); 6var_dump($post['hobby']);

または

php

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

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

投稿2017/11/29 14:14

編集2017/11/29 14:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/11/30 00:23 編集

回答の内容を支持しますが、一応・・・ FILTER_REQUIRE_ARRAY以外の細かい設定をする必要がなければ $hobby = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); と、省略することができます
dog57

2017/11/30 01:23

省略もできるんですね。 参考になります。 ご回答いただきありがとうございます。
guest

0

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

  • 野球とサッカー以外は受け付けない
  • 複数選択された場合は「、」でつなぐ

PHP

1<form method="post"> 2<input type="checkbox" name="hobby[]" value="野球">野球<br> 3<input type="checkbox" name="hobby[]" value="サッカー">サッカー<br> 4<input type="checkbox" name="hobby[]" value="不正な値1">不正な値1<br> 5<input type="checkbox" name="hobby[]" value="不正な値2">不正な値2<br> 6<input type="submit" value="go"> 7</form> 8<?PHP 9$option=[ 10 "options"=>["regexp"=>"/^野球|サッカー$/"], 11 "flags"=>FILTER_REQUIRE_ARRAY, 12 ]; 13$hobby = filter_input(INPUT_POST, 'hobby',FILTER_VALIDATE_REGEXP,$option); 14if(is_array($hobby)){ 15 $hobby = array_filter($hobby,function($x){return $x!==false;}); 16 print implode("、",$hobby); 17}

投稿2017/11/30 01:44

yambejp

総合スコア114574

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

https://teratail.com/questions/6031

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

投稿2017/11/29 14:05

gallu

総合スコア506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問