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

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

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

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

Q&A

解決済

4回答

3958閲覧

php チェックボックスについて

shinoda

総合スコア75

PHP

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

0グッド

0クリップ

投稿2015/01/28 09:30

お世話になります


if(empty($_POST["_icon"])){
$_SESSION["_icon_memo1"] = $_POST["_icon"][0];
$_SESSION["_icon_memo2"] = $_POST["_icon"][1];
$_SESSION["_icon_memo3"] = $_POST["_icon"][2];
}else{
};


上記のコードなのですが前画面でチェックボックスで渡ってきたものをSESSIONに格納するといった流れなのですがチェックされずに空だった場合のelseの後にどのように書けばよいのかわからず困っています。
きっとすごく簡単な事でお恥ずかしいのですがご教授いただければ幸いです。

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

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

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

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

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

guest

回答4

0

ベストアンサー

>Notice: Undefined index: _icon_memo1
>のエラーが出てしまいました。
チェックボックスが送信対象になるのは、「チェックされたとき」だけです。
画面でチェックされない場合にサーバー処理にて「穴あき」のチェックが必要になるのが嫌なら以下のようにすることで解決します。
<<画面側>>
<input type="hidden" name="_icon_memo1" value="false" />
<input type="checkbox" name="_icon_memo1" value="true" />

<<サーバー側>>
○チェックされている場合
_icon_memo1 が要素2個の配列のとき、[0] が hidden の値、[1] が checkbox の値になります。

○チェックされてない場合
_icon_memo1 が要素1個の配列 or 配列ではない場合は画面でチェックされてないので1つの要素は hidden の要素になります。

スクリプトなどで活性・非活性が切り替わる場合は、サーバー側のロジックで活性・非活性の制御が
可能ならば、上記のHTMLのままで。状態を送った方が良い場合は以下のようにします。
<<画面側>>
○初期表示チェック無し、活性
<input type="hidden" name="_icon_memo1" value="false, false" />
<input type="checkbox" name="_icon_memo1" value="true" />

○初期表示チェックあり、活性
<input type="hidden" name="_icon_memo1" value="true, false" />
<input type="checkbox" name="_icon_memo1" value="true" checked="checked" />

○初期表示チェック無し、非活性
<input type="hidden" name="_icon_memo1" value="false, true" />
<input type="checkbox" name="_icon_memo1" value="true" disabled="disabled" />

○初期表示チェックあり、非活性
<input type="hidden" name="_icon_memo1" value="true, true" />
<input type="checkbox" name="_icon_memo1" value="true" disabled="disabled" checked="checked" />

こうすることで、要素が1個のとき、要素が2個のときでチェックボックスの状態が判断できます。
HTMLだけで対処可能ですが、以下のケースを除きます。
初期表示非活性チェック無し、画面送信時に、チェックあり非活性の場合は、スクリプトを使う
しかありません。この場合は、チェックボックスの onclick を設定し、hidden 要素の value を
編集する仕掛けを用意します。

投稿2015/01/29 04:23

ipadcaron

総合スコア1693

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

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

shinoda

2015/01/29 05:05

お世話になっております ご回答ありがとうございました ******************登録画面********************************* <script type="text/javascript"> /* チェックボックスの名前で全選択/全解除処理する例 */ function chkAll_name(bool) { var frm=document.sinnki; for(var i=1; i<=11; i++) { frm.elements["_i"+i].checked=bool; } } </script> <input type="hidden" id="_i1" name="_icon[]" value="false"> <input type="checkbox" id="_i1" name="_icon[]" value="true"><label for="_i1">新着</label> <input type="button" onclick="chkAll_name(true)" value="全選択" /> <input type="button" onclick="chkAll_name(false)" value="全解除" /> ******************確認画面********************************* if( isset( $_POST['_icon'] )) { foreach( $_POST["_icon"] as $_icon ){ echo "{$_icon}<br> "; } } ******************確認画面********************************* 上記のように書いてあるのですが結果から申し上げますと同じエラーが出ました またいくつか質問をさせていただきたいのですが 1.登録画面から確認画面にtrueとfalseという文言ではなく新着というのを送りたい 2.javascriptを活かすにはどうすればよいのでしょうか? 宜しくお願い致します
ipadcaron

2015/01/29 08:36

<script type="text/javascript"> /* チェックボックスの名前で全選択/全解除処理する例 */ function chkAll_name(bool) { var frm = document.sinnki; for (var i=0;i < frm.elements.length;i++) { var ele = frm.elements[i]; if (/checkbox/i.test(ele.type)) { ele.checked = bool; } } } </script> <form name="sinnki"> <input type="hidden" id="_i1" name="_icon1[]" value="false"> <input type="checkbox" id="_i1_1" name="_icon1[]" value="true"><label for="_i1">新着</label> <input type="hidden" id="_i2" name="_icon2[]" value="false"> <input type="checkbox" id="_i2_1" name="_icon2[]" value="true"><label for="_i2">新着</label> <input type="button" onclick="chkAll_name(true)" value="全選択" /> <input type="button" onclick="chkAll_name(false)" value="全解除" /> </form> <<確認画面のPHP>> チェックボックスの活性・非活性が絡まない場合は、 ○チェックされると要素2個 ○チェックされないと要素1個 です。 それを踏まえ、配列の長さだけ見れば判断できますよね。 id は一意である必要があるので、例だとしても、id="_i1" を2個並べちゃいけません。 全部のチェックボックスを同じ名前にすると、PHP側で同じ名前のアイテムは自動的に集約されるのでチェックありなのか無しなのかの判断が付かなくなります。 確認画面のPHP画面イメージを描画する場所で、 _icon1[] の要素が2個なら、チェックされていることになるので "新着" を描画すればいいのでは? _icon1[] の要素が1個なら、チェックされていないことになるので なにも出力しないようにするだけだと思います。 # JavaScript は直しておきました。
shinoda

2015/01/29 09:32

お世話になっております 上記のコードを試してみました登録画面の部分はJavaScriptも含めてうまく動きました 確認画面なのですが渡ってきた_icon1をvar_dumpしてみたところ中身が(_icon1)となっていました。 なので下記のように書いたのですがどごがまちがっていますでしょうか? if(empty($_POST["_icon1"])){ if(($_POST["_icon1"]) == "_icon1"){ $_POST["_icon1"] = "新着"; $_SESSION["_icon_memo1"] = ($_POST["_icon1"]);    } }else{ unset($_SESSION["_icon_memo1"]); };
guest

0

Notice: Undefined index: _icon_memo1が出てしまうのはosamuya さんのご指摘のとおりです。

どのような処理の流れなのかが読めないのでなんとも言えませんが、
この処理のあとに$_SESSION["_icon_memo1"]、$_SESSION["_icon_memo1"] 、$_SESSION["_icon_memo1"] を使うならfalseや""など入れてみてはどうでしょうか。

lang

1if(empty($_POST["_icon"])){ 2$_SESSION["_icon_memo1"] = $_POST["_icon"][0]; 3$_SESSION["_icon_memo2"] = $_POST["_icon"][1]; 4$_SESSION["_icon_memo3"] = $_POST["_icon"][2]; 5}else{ 6$_SESSION["_icon_memo1"] = false; 7$_SESSION["_icon_memo2"] = false; 8$_SESSION["_icon_memo3"] = false; 9}

htmlspecialcharsしてるようでしたのでfalseいれたら何が帰ってくるか試しました。

lang

1var_dump(htmlspecialchars(false,ENT_QUOTES));//結果→string(0) ""

投稿2015/01/29 03:00

hirumahanemui

総合スコア61

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

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

shinoda

2015/01/29 04:01

ご回答有難うございます。 ご回答の件なのですが私の知識があまりにもないため理解に苦しんでおります。 falseをいれることによって返り値が0になるということでしょうか? よろしければメリット、デメリットをご教授いただければ幸いです
hirumahanemui

2015/01/29 04:29

var_dump()はデータの型と値を出力してくれる関数です。 処理の途中で変数とかの中身を調べるときに使います。 データの型も教えてくれるので便利です。 型までは必要ないって場合はprint_r()を使います。 ↑ご存じでしたらすみません。 string(0) "" の意味は0文字、string型で0文字のデータが入ってくるという意味です。 空文字とか呼ばれるものです。 データベースに入れるようでしたら、カラムにNOT NULLとかに空文字入れた時の挙動はちょっと調べたほうが良いかもしれません。 http://sojiro14.github.io/blog/2014/10/20/behavior-of-inserting-rows-at-not-null-column-on-mysql/ 「mysql notnull 空文字」とかで検索すると上のようなサイトが出てきます。 参考までです。
shinoda

2015/01/29 06:58

なるほどvar_dumpは配列の中身などを見るときに使っていますがただ使っているだけで全然、理解せず使っているということがわかりました。 お忙しい中色々とご教授いただき有り難うございました。
guest

0

たぶんunsetした後に
$_SESSION["_icon_memo1"]
$_SESSION["_icon_memo2"]
$_SESSION["_icon_memo3"]
の値をどっかで使っているので、Notice:が出てしまうのだと思います。この値を使うところで、

lang

1if (isset($_SESSION["_icon_memo1"])){ 2 ...... 3} else { 4 ...... 5} 6if (isset($_SESSION["_icon_memo2"])){ 7 ...... 8} else { 9 ...... 10} 11if (isset($_SESSION["_icon_memo3"])){ 12 ...... 13} else { 14 ...... 15}

というふうにすると大丈夫だと思います。

投稿2015/01/28 16:54

osamuya

総合スコア241

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

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

shinoda

2015/01/29 02:43

お世話になっております ご回答された件について試しましたが結果から申しますと同じエラ-が出ました 使っている部分のコードを書きます ******************************************** if (isset($_SESSION["_icon_memo1"])){ $_icon_memo1= htmlspecialchars($_SESSION["_icon_memo1"],ENT_QUOTES); } else { $_icon_memo1= htmlspecialchars($_SESSION["_icon_memo1"],ENT_QUOTES); } if (isset($_SESSION["_icon_memo2"])){ $_icon_memo2=htmlspecialchars($_SESSION["_icon_memo2"],ENT_QUOTES); } else { $_icon_memo2=htmlspecialchars($_SESSION["_icon_memo2"],ENT_QUOTES); } ******************************************** 上記のような感じです。 ご教授お願い致します
hirumahanemui

2015/01/29 03:04

elseブロックに同じ処理が書かれてるからです。 if (isset($_SESSION["_icon_memo2"])){ $_icon_memo2=htmlspecialchars($_SESSION["_icon_memo2"],ENT_QUOTES); } 特にやることがなければelseブロックはいりません。
shinoda

2015/01/29 03:57

お世話になっております 仰るとおりにしましたらエラーは消えました。 ありがとうございます。 追記で質問になって申し訳ないのですが 新規登録→確認→登録 という構成になっており先ほどのご回答は確認画面での問題でした。 最後の登録画面ではSESSIONに格納された変数を配列に入れるというようになっています。 *************************************** "0" => array( "name" => "icon_new", "memo" => "$_icon_memo1", ), *************************************** 上記のように渡ってきた変数を入れているのですがこちらに直接下記のようにしたほうがいいのでしょうか? "memo" => if (isset($_SESSION["_icon_memo1"])){ $_icon_memo1=htmlspecialchars($_SESSION["_icon_memo1"],ENT_QUOTES); }
shinoda

2015/01/29 04:10

追記の質問で申し訳ありません 確認画面で先ほど変数にしたものを単純にechoしましたら以下の様なエラーが出ました echo $_icon_memo1; ↓ 結果 Notice: Undefined variable: _icon_memo1 原因は何なのでしょうか? よろしくお願いします。
hirumahanemui

2015/01/29 06:01

>htmlspecialchars htmlspecialchars()は何のためにやるかによります。 そもそもラジオボックスでhtml形式のデータがわたってくる想定がちょっと微妙です。 ラジオボックスは数字や記号のキーを渡してマスターデータで任意のデータに変換したほうがよいと思います。マスターデータを元にラジオボタンを作ればラジオボックスの増減などの変更に強くなりますよね。 もしもhtmlspecialchars()がわからなければ「htmlspecialchars」を検索してみてください。 >Notice: Undefined variable: これは「Notice: Undefined variable:」でググってみてください。 phpのエラーはよほどマニアックでなければごっそりエラーでググれば情報たくさんあります。 ちなみにNoticeはエラーではないのですが。。 僕は上級者って言えるほどではありませんが、phpは基本ネットに腐るほど情報がありますよー! お互い頑張りましょう! 僕も自分の仕事をしなきゃです( ;∀;)
shinoda

2015/01/29 06:55

お世話になっております 仰るとおりです。 チェックボックスなのですが確かに文字列を送られることはないですね。 他にもフォームから送られているものがありみんなまとめて同じ処理していました お忙しい中いろいろご教授して頂きありがとうございました。 もっと勉強していきたいと思います。
guest

0

一度送信されSESSIONに保存され、今度は空で送信されてきた前提でしたらunsetでどうでしょうか。

lang

1if(empty($_POST["_icon"])){ 2$_SESSION["_icon_memo1"] = $_POST["_icon"][0]; 3$_SESSION["_icon_memo2"] = $_POST["_icon"][1]; 4$_SESSION["_icon_memo3"] = $_POST["_icon"][2]; 5}else{ 6unset($_SESSION["_icon_memo1"]); 7unset($_SESSION["_icon_memo2"]); 8unset($_SESSION["_icon_memo3"]); 9};

投稿2015/01/28 10:01

hirumahanemui

総合スコア61

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

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

shinoda

2015/01/28 11:08

早速のご回答ありがとうございます。 上記のコードを試したのですがその下に書かれてる ******************************** $_icon_memo1= htmlspecialchars($_SESSION["_icon_memo1"],ENT_QUOTES); $_icon_memo2=htmlspecialchars($_SESSION["_icon_memo2"],ENT_QUOTES); $_icon_memo3=htmlspecialchars($_SESSION["_icon_memo3"],ENT_QUOTES); ******************************** Notice: Undefined index: _icon_memo1 のエラーが出てしまいました。 元々のエラーなのかもしれませんがご教授いただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問