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

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

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

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

Q&A

解決済

3回答

285閲覧

PHPの配列によるエラーについて

penginer

総合スコア32

PHP

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

0グッド

0クリップ

投稿2017/08/21 11:17

編集2017/08/21 11:44

###前提・実現したいこと
PHPで、アンケートフォームを作っており、
「バリデーションチェックをして下の表に記述。
エラーがあれば表示し、チェックボックスの中身は保持する。
また、値が複数ある場合はすべて表示する」
ということを実現しようと思っています。
###発生している問題・エラーメッセージ

ここを参考にして配列を用いた表示を作成していましたが、
選択していない部分の値が全て
Undefined offset: x(xは選択していない部分の値)と
なって出てきてしまいます。
また、複数を選択しても、最終的に出力される答えは常に、値が大きい物のみになってしまいます。

###該当のソースコード

<?php if (empty($_POST['attribute'])) { $errors['attribute'] = "属性が入力されていません。"; }/* elseif (htmlspecialchars(ctype_digit(strval($_POST['attribute'])), ENT_QUOTES) == false) { $errors['attribute'] = "不正なPOSTです。(属性1)"; } */elseif (intval($_POST['attribute']) > 22) { $errors['attribute'] = "不正なPOSTです。(属性)"; } else { $attribute = $_POST['attribute']; } if (intval($_POST['attribute']) == 22) { $x = $_POST['attribute_custom']; if (($x == null) && (intval($_POST['attribute']) == 23)) { $errors['attribute_custom'] = "属性が入力されていません。(カスタム1)"; } else if ((str_replace(' ' ,'', $_POST['attribute_custom']) == "") && (intval($_POST['attribute']) == 23)) { $errors['attribute_custom'] = "属性が入力されていません。(カスタム2)"; } else { $attribute_custom = $_POST['attribute_custom']; } } ?> <?php $attribute2 = array( 1 => 'a', 2 => 'b', 3 => 'c', //同じようなソースの繰り返し 23 => 'x',); $check_attribute = array(); if (isset($_POST['attribute']) && isset($attribute)) { for($i=0;$i<count(intval($attribute));$i++){ $check_attribute[$attribute[$i]]="checked"; } $check_attribute[intval($attribute)]="checked"; foreach ((array)intval($attribute) as $key => $value) { $select_attribute = $attribute2[$value]."、"; } $attribute_list=rtrim($select_attribute, "、"); } echo <<<EOD <div id="choice"> <input type="checkbox" name="attribute[]" value="1" id="1" {$check_attribute[1]}><label for="1">1</label><br><br> <input type="checkbox" name="attribute[]" value="2" id="2" {$check_attribute[2]}><label for="2">2</label><br><br> <input type="checkbox" name="attribute[]" value="3" id="3" {$check_attribute[3]}><label for="3">3</label><br><br> </label><br><br> //同じようなソースの繰り返し <input type="checkbox" name="attribute[]" value="23" id="other" {$check_attribute[23]}><label for="other">その他</label><br><br> <input type="text" name="attribute_custom" placeholder="カスタム" value="" id="attribute-custom"><br> </p> EOD; ?> //関係ないので中略 <?php if ((isset($_POST['attribute_custom'])) && ($attribute == "23") && (isset($attribute))) { $attribute_custom = htmlspecialchars($_POST['attribute_custom'], ENT_QUOTES); echo "その他\($attribute_custom\)"; } elseif (($attribute !== "23") && (isset($attribute))) { echo $attribute_list; } ?>

###補足情報(言語/FW/ツール等のバージョンなど)
環境
XAMPP最新版、Windows10、Atom1.18.0

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

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

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

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

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

guest

回答3

0

ベストアンサー

ざっとやるとこんな感じです
この手のデータの受け渡しはfilter_input()で処理する方がよいでしょう

PHP

1$attribute2 = [ 2 1 => 'a', 3 2 => 'b', 4 3 => 'c', 5 23 => 'x', 6 ]; 7$select_attribute=""; 8$checked["attribute"] = array_fill(1,23,""); 9$attribute=filter_input(INPUT_POST,'attribute',FILTER_VALIDATE_INT,["flags"=> FILTER_REQUIRE_ARRAY]); 10if(!is_null($attribute)){ 11 foreach($attribute as $val){ 12 $checked["attribute"][$val]=" checked"; 13 } 14 $select_attribute=implode("、",array_filter($attribute2,function($x) use($attribute){ 15 return in_array($x,$attribute); 16 }, ARRAY_FILTER_USE_KEY)); 17} 18echo <<<EOD 19<p id="choice"> 20<form method="post"> 21<input type="checkbox" name="attribute[]" value="1" id="x1"{$checked["attribute"][1]}><label for="x1">1</label><br><br> 22<input type="checkbox" name="attribute[]" value="2" id="x2"{$checked["attribute"][2]}><label for="x2">2</label><br><br> 23<input type="checkbox" name="attribute[]" value="3" id="x3"{$checked["attribute"][3]}><label for="x3">3</label><br><br> 24</label><br><br> 25<input type="checkbox" name="attribute[]" value="23" id="other"{$checked["attribute"][23]}><label for="other">その他</label><br><br> 26<input type="text" name="attribute_custom" placeholder="カスタム" value="" id="attribute-custom"><br> 27<input type="submit" value="go"><br> 28</form> 29{$select_attribute} 30</p> 31EOD;

投稿2017/08/22 01:37

編集2017/08/22 01:38
yambejp

総合スコア114784

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

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

0

さくっと見た限り

PHP

1$attribute

は$_POST['attribute']を代入したものと仮定して、

HTML

1 <input type="checkbox" name="attribute[]" value="1" id="1" {$check_attribute[1]}><label for="1">1</label><br><br>

とやってるので配列のはずなので、

PHP

1intval($attribute)

とするのはおかしいですね。

投稿2017/08/21 11:30

編集2017/08/21 11:32
rururu3

総合スコア5545

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

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

penginer

2017/08/21 11:45

御返答ありがとうございます。 申し訳ございませんが ミスが有ったので訂正しました。 その上でもう一度ご教授いただけると ありがたいです。
rururu3

2017/08/21 11:55

訂正したのを拝見しましたけど、同じ返答になります($_POST['attribute']は配列なのでおかしくなる) ので、まずは配列と数値をしっかり理解して修正しましょう。 ※おかしくなるであろう理由を指摘しておきます http://php.net/manual/ja/function.intval.php phpのintval関数において配列を指定したら0か1しか帰ってこないです
guest

0

ツッコミどころ満載ですね・・・

rururu3さんのおっしゃるとおり、$_POST['attribute']は配列です。

また、$attribute は、PHP5.3以前のphp.iniでは設定可能であった、
register_globals = onを期待する動作なので、
バージョンにも寄りますが、最近の環境では
「isset($attribute)」はfalseですね。

PHP

1if (empty($_POST['attribute'])) {

別のURLからPOSTされる前提ならありですが、
POSTしていない状態(GET)の時は必ず条件となりますね。

Undefined offset: x(xは選択していない部分の値)と

ですが、参考ページでは foreachで回しているところを、
forで回しているからです。
POSTされていない配列を見ようとするからエラーになってます。
checkboxはチェックされていない要素は送られません。

先頭に、

PHP

1print_r($_POST);

でも入れて、内容を確認してみるといいと思います。

配列の処理とかをきちんとされるのが先決のようです。

投稿2017/08/22 00:42

編集2017/08/22 00:48
n884

総合スコア100

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問