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

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

ただいまの
回答率

90.49%

  • PHP

    20781questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,695

shinoda

score 82

お世話になります
***********
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の後にどのように書けばよいのかわからず困っています。
きっとすごく簡単な事でお恥ずかしいのですがご教授いただければ幸いです。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

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 14: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を活かすにはどうすればよいのでしょうか?

    宜しくお願い致します

    キャンセル

  • 2015/01/29 17: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 は直しておきました。

    キャンセル

  • 2015/01/29 18: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"]);
    };

    キャンセル

0

一度送信されSESSIONに保存され、今度は空で送信されてきた前提でしたらunsetでどうでしょうか。
if(empty($_POST["_icon"])){
$_SESSION["_icon_memo1"] = $_POST["_icon"][0];
$_SESSION["_icon_memo2"] = $_POST["_icon"][1];
$_SESSION["_icon_memo3"] = $_POST["_icon"][2];
}else{
unset($_SESSION["_icon_memo1"]);
unset($_SESSION["_icon_memo2"]);
unset($_SESSION["_icon_memo3"]);
}; 

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/28 20: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
    のエラーが出てしまいました。

    元々のエラーなのかもしれませんがご教授いただければ幸いです。

    キャンセル

0

たぶんunsetした後に
$_SESSION["_icon_memo1"]
$_SESSION["_icon_memo2"]
$_SESSION["_icon_memo3"]
の値をどっかで使っているので、Notice:が出てしまうのだと思います。この値を使うところで、
if (isset($_SESSION["_icon_memo1"])){
  ......
} else {
  ......
}
if (isset($_SESSION["_icon_memo2"])){
  ......
} else {
  ......
}
if (isset($_SESSION["_icon_memo3"])){
  ......
} else {
  ......
}
というふうにすると大丈夫だと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/29 11: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);
    }
    ********************************************

    上記のような感じです。
    ご教授お願い致します

    キャンセル

  • 2015/01/29 12:04

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

    キャンセル

  • 2015/01/29 12:57

    お世話になっております
    仰るとおりにしましたらエラーは消えました。
    ありがとうございます。
    追記で質問になって申し訳ないのですが
    新規登録→確認→登録
    という構成になっており先ほどのご回答は確認画面での問題でした。
    最後の登録画面ではSESSIONに格納された変数を配列に入れるというようになっています。
    ***************************************
    "0" => array(
    "name" => "icon_new",
    "memo" => "$_icon_memo1",
    ),
    ***************************************

    上記のように渡ってきた変数を入れているのですがこちらに直接下記のようにしたほうがいいのでしょうか?

    "memo" => if (isset($_SESSION["_icon_memo1"])){
    $_icon_memo1=htmlspecialchars($_SESSION["_icon_memo1"],ENT_QUOTES);
    }

    キャンセル

  • 2015/01/29 13:10

    追記の質問で申し訳ありません

    確認画面で先ほど変数にしたものを単純にechoしましたら以下の様なエラーが出ました

    echo $_icon_memo1;
    ↓ 結果
    Notice: Undefined variable: _icon_memo1

    原因は何なのでしょうか?
    よろしくお願いします。

    キャンセル

  • 2015/01/29 15:01

    >htmlspecialchars
    htmlspecialchars()は何のためにやるかによります。
    そもそもラジオボックスでhtml形式のデータがわたってくる想定がちょっと微妙です。
    ラジオボックスは数字や記号のキーを渡してマスターデータで任意のデータに変換したほうがよいと思います。マスターデータを元にラジオボタンを作ればラジオボックスの増減などの変更に強くなりますよね。

    もしもhtmlspecialchars()がわからなければ「htmlspecialchars」を検索してみてください。

    >Notice: Undefined variable:
    これは「Notice: Undefined variable:」でググってみてください。
    phpのエラーはよほどマニアックでなければごっそりエラーでググれば情報たくさんあります。
    ちなみにNoticeはエラーではないのですが。。

    僕は上級者って言えるほどではありませんが、phpは基本ネットに腐るほど情報がありますよー!

    お互い頑張りましょう!

    僕も自分の仕事をしなきゃです( ;∀;)

    キャンセル

  • 2015/01/29 15:55

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

    キャンセル

0

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

どのような処理の流れなのかが読めないのでなんとも言えませんが、
この処理のあとに$_SESSION["_icon_memo1"]、$_SESSION["_icon_memo1"] 、$_SESSION["_icon_memo1"] を使うならfalseや""など入れてみてはどうでしょうか。
if(empty($_POST["_icon"])){
$_SESSION["_icon_memo1"] = $_POST["_icon"][0];
$_SESSION["_icon_memo2"] = $_POST["_icon"][1];
$_SESSION["_icon_memo3"] = $_POST["_icon"][2];
}else{
$_SESSION["_icon_memo1"] = false;
$_SESSION["_icon_memo2"] = false;
$_SESSION["_icon_memo3"] = false;
}
htmlspecialcharsしてるようでしたのでfalseいれたら何が帰ってくるか試しました。 
var_dump(htmlspecialchars(false,ENT_QUOTES));//結果→string(0) "" 

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/29 13:01

    ご回答有難うございます。

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

    キャンセル

  • 2015/01/29 13: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 空文字」とかで検索すると上のようなサイトが出てきます。
    参考までです。

    キャンセル

  • 2015/01/29 15:58

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

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    20781questions

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