• 締切済み

PHPでチェックボックスの結果を離れた配列に入れる

PHPにて、複数あるチェックボックスの操作結果(オン/オフ)を変数に格納する方法を探しています。 予定として プログラム実行 → ボタンが1つと、チェックボックスが複数表示される → チェックボックス操作 → ボタンを押す → 複数のオン/オフ状況が配列に格納される といったものを作りたいと考えています。 現在はそのためのテストとして、ボタンを押した際のオン/オフの状況が画面に順に表示されるものを作っていますが、変数がUndefined Indexであると言われ、表示することができません。 現在のプログラムは下の通りです。 実際のプログラム上では、(1),(2),(3)はそれぞれソース内のかなり離れた場所にあります。 各チェックボックス(各<form>~</form>)毎にボタンを用意していないのが原因であるとは思うのですが、ボタンは特定の箇所に1つだけ用意したいと考えています。 またチェックボックス表示部とボタン表示部は(ソース的に)離れているため、 ボタン表示部で<form>を開いて、開いたまま進み、チェックボックス表示部が終わってやっと閉じる、という方法は難しいと思います。 どうすればチェックボックスの結果を離れた箇所にある配列に入れることができるのでしょうか。 宜しくお願いします。 [regist.php] <?php //(1) 更新ボタンを押すとチェックボックスのon/off結果が表示される if(isset($_POST['cmd_Print'])){ $check = $_POST["cb"]; for($i=0; $i<count($check); $i++){ print "${check[$i]}<br>"; } } //(2) 更新ボタンの表示 print("<form method=\"post\" action=\"regist.php\">"); print("<input type=\"submit\" name=\"cmd_Print\" value=\"結果表示\">"); print("</form>"); //(3) チェックボックス(on,off)を交互に表示 for($i=0; $i<5; $i++){ //チェックボックスをオンの状態で表示 print("<form method=\"POST\" action=\"./regist.php\">"); print sprintf('<input type="hidden" name="cb[]" value="off">'); print sprintf('<input type="checkbox" name="cb[]" value="on" checked="checked">'); print("</form>"); //↑チェックボックス操作後、オフの状態なら$cb[]に"off"を、オンの状態なら$cb[]に"on"を入れる //チェックボックスをオフの状態で表示 print("<form method=\"POST\" action=\"./regist.php\">"); print sprintf('<input type="hidden" name="cb[]" value="off">'); print sprintf('<input type="checkbox" name="cb[]" value="on">'); print("</form>"); //↑チェックボックス操作後、オフの状態なら$cb[]に"off"を、オンの状態なら$cb[]に"on"を入れる } ?>

  • PHP
  • 回答数4
  • ありがとう数2

みんなの回答

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.4

#2です。 >offの場合には「結果を出力しない」ではなく、「offであった」という結果が欲しいと思い、 >hiddenを用いました。 配列を使っているケースで、これをやってはダメです。print_r($_POST)などとすれば一目瞭然だと思います。 offも必要であれば前のレスでforeachで書いた部分を、input要素を書き出したときと同じようにforで回せばいいです。 <?php $boxnum = 5; // チェックボックスの数 //(1) 更新ボタンを押すとチェックボックスのon/off結果が表示される if(isset($_POST['cmd_Print'])){ $check = $_POST["cb"]; for($i=0; $i<$boxnum; $i++){ if (((is_array($check)))&&(in_array('on' . ($i + 1), $_POST["cb"]))) { print $i . " is on <br>"; } else { print $i . " is off <br>"; } } } //(2) 更新ボタンの表示 ?> <form method="post" action="regist.php"> <input type="submit" name="cmd_Print" value="結果表示"> <?php //(3) チェックボックスを表示 for($i=0; $i<$boxnum; $i++){ print sprintf('<input type="checkbox" name="cb[]" value="on' . ($i + 1) . '" checked="checked">'); } ?> </form>

re_re_re
質問者

お礼

ありがとうございます。 print sprintf('<input type="hidden" name="cb[]" value="off">'); print sprintf('<input type="checkbox" name="cb[]" value="on" checked="checked">') とすることで、問題なくチェックがオンの時にはon、オフの時にはoffが配列に入りました。 チェックがオン、オフどちらの場合でも、一度に配列は1つしか消費しないことを確認しました。 上記の記法では、チェックがオンの際には、1行目でoffを格納した配列に上書きしています。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

> その場合、結果的に <form><form></form></form>という形になってしまい、希望する通りに処理が行われません。 その発想はなかった。いや むしろ、柔軟な発想をする人だとすら思いました。 ちょっとキツめの事を言おうかと思いましたが、誰かみたいに ちょっと苦言の類を言われただけで説教と受け取ってしまうゆとりちゃんだったりしたら面倒なので、今回はやめときます。 一言だけ言うと、「もうちょっと基礎もやったほうがいいですよ」 んで、こっから まともな回答です。 <form></form> の間で、<form>みたいに 他に変数を飛ばしたいなら、<a href=hoge.php?cd=3>みたいにしてGETで飛ばすか、JavaScript で 飛ばすかですね。 <form></form> の間から飛ばした結果を <form></form> に戻すような事をしたいなら JavaScriptですね。 まぁ、良くある 郵便番号を入力してボタンを押すと 住所を検索してテキストボックスに入れてくれるみたいな奴は JavaScript です。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

>ボタン表示部で<form>を開いて、開いたまま進み、チェックボックス表示部が終わって >やっと閉じる、という方法は難しいと思います。 それが出来ないとダメです。form要素の外のinput要素はPOSTされませんよ(htmlの仕様です)。 また、チェックボックスは「チェックしたもの」だけがPOSTされますから、name属性で配列にした場合、同じvalueでは区別が出来ません(何個チェックされたかはわかりますが、何番目かはわからない)。そのあたりを考えておかないとマズイと思います。 input="hidden"のinput要素が何の為にあるのか、value="on"とvalue="off"のチェックボックスを並べてどうしたいのか・・・は読み取れませんでした。 以下はとりあえず5個だけ並べたサンプルソースです。叩き台にどうぞ。 <?php //(1) 更新ボタンを押すとチェックボックスのon/off結果が表示される if(isset($_POST['cmd_Print'])){ $check = $_POST["cb"]; foreach ($check as $val) { print $val . "<br>"; } } //(2) 更新ボタンの表示 ?> <form method="post" action="regist.php"> <input type="submit" name="cmd_Print" value="結果表示"> <?php //(3) チェックボックスを表示 for($i=0; $i<5; $i++){ print sprintf('<input type="checkbox" name="cb[]" value="on' . ($i+1) . '" checked="checked">'); } ?> </form>

re_re_re
質問者

補足

ありがとうございます。今からプログラムの確認を行います。 実際の処理としては、on/offの結果をデータベースに書きこむ都合上、offの場合には「結果を出力しない」ではなく、「offであった」という結果が欲しいと思い、hiddenを用いました。 (書き方を間違っていますが、nameが同じであれば後の値が優先されると聞いたので) 追加で質問となってしまい申し訳ないのですが、 実際のプログラムでは、(2)更新ボタンの表示 と (3)チェックボックスの表示 の間に、いくつか別の処理を行うボタンの用意を考えています。 その際、別の処理のボタンなので、新たにformを開いて閉じる必要が出てくるのですが、 その場合、結果的に <form><form></form></form>という形になってしまい、希望する通りに処理が行われません。 こういった場合はどう処理するべきなのでしょうか。

  • kamikami30
  • ベストアンサー率24% (812/3335)
回答No.1

チェックボックスとボタンの間にソースの記載が多いと、同じフォームにできないのか試してみましょう。

re_re_re
質問者

お礼

ありがとうございます。 同じフォーム内にチェックボックスとボタンを入れなければならないのですね。

関連するQ&A

  • 画面が更新されてもチェックボックスのチェック状態を維持したい

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1972507 に追加質問です。 表示されている sample.php にあるチェックボックスをON/OFFしてから 再計算ボタンを押下後、チェックボックスのON/OFF状態を 引き継いで(維持して)sample.phpを表示させたいという質問ですが、 上記質問では、チェックボックスが配列扱いとなっており、 回答者の皆さんからはforeachによる解法をお教えいただきました。 今回は、下記のように配列でない場合の質問です。 <form action="<?php $PHP_SELF ?>" method="post"> <input type="checkbox" name="fruit" value="apple">りんご</td> <input type="submit" name="exec" value="再計算"> </form> よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 検索後にチェックボックスのON/OFF状態を再現して表示したい

    下記の例で、表示されている sample.php にあるチェックボックスを ON/OFFしてから再計算ボタンを押下後、チェックボックスのON/OFF状態を 引き継いで(維持して)sample.phpを表示させることはできませんか? 「りんご」だけにチェックして再計算ボタンを押下後、再表示された sample.php は「りんご」だけチェックが入っているイメージです。 <form action="./sample.php" method="post"> <input type="checkbox" name="fruit[]" value="apple">りんご</td> <input type="checkbox" name="fruit[]" value="orange">みかん</td> <input type="checkbox" name="fruit[]" value="grape">ぶどう</td> <input type="submit" name="exec" value="再計算"> </form> なお、name="fruit[]" は配列になっていて、SQL発行に生かされています。

    • ベストアンサー
    • PHP
  • チェックボックスでの送信

    チェックボックスにチェックを入れて送信したときは1を チェックを入れずに送信したときは0をPHP側で受けたいのですが チェックを入れずに送信するとPHP側で$_POST['flg']を取得できないため、エラーになります。 方法はないでしょうか? <form action="test.php" method="post"> フラグ:<input type="checkbox" name="flg" value="1" /> </form> === test.php =========== <?php $flg = $_POST['flg']; print($flg); ?>

    • ベストアンサー
    • PHP
  • PHPのチェックボックス受け渡し

    現在、PHPにて以下の機能を作りたいと思っています。 表の各マスの中に ○ または × が入っている。(データベースから取得します) 「編集」ボタンを押すと、○はチェックボックス(オン)に、×はチェックボックス(オフ)に変化する。 ユーザーはチェックボックス(オン/オフ)の操作をする。 「更新」ボタンを押すと、操作の結果に応じて、チェック(オン)は○に、チェック(オフ)は×に変化する。 データベースの更新を行う。 データベースから○/×の取得までは出来たのですが、 チェックボックスと表示の受け渡し方法が分かりませんが、どうしたら良いのでしょうか?

    • 締切済み
    • PHP
  • phpのエラーチェックについて質問です!

    phpのエラーチェックについて質問です! エラーチェックについてです><; if(isset($_POST['name'])){ $name = htmlspecialchars($_POST['name']); if (empty($name)) { $message = '未入力があります'; と記入してエラーメッセージを表示したい場所に記載してます。 しかし、フォームで <form action="regist2.php" name="form" method="post"> でsubmit押すとフォームが空白でもactionでregist2.phpに送られてしまいます><; エラーがなければ、そのままsubmitでaction=regist2.phpに送りたいと考えております。 なにか解決方法はないでしょうか? ご教授お願いします!!!!!!!!

    • 締切済み
    • PHP
  • PHPのメールフォームでチェックボックス

    PHPでメールフォームを作っているのですが、チェックボックスの値がメールで送信されません。 ソースは・・・(チェックボックスの部分だけ) *フォームページ <form method="post" action="form1.php" name="infoform" id="infoform" onsubmit="return checkForm();"> <INPUT type="checkbox" name="k_menu[]" id="k_menu[]" value="メニュー1" />メニュー1&nbsp;<INPUT type="checkbox" name="k_menu[]" id="k_menu[]" value="メニュー2" />メニュー12&nbsp;<INPUT type="checkbox" name="k_menu[]" id="k_menu[]" value="メニュー3" />メニュー3 <input type="reset" name="no" id="no" value="リセット" /><input type="submit" name="send" id="send" value="確認" /> </form> *確認ページ <?php $p_k_menu = $_REQUEST['k_menu']; ?> <table> <th>興味のあるメニューは?</th> <td> <?php for($i=0; $i<sizeof($p_k_menu); $i++){ print "${p_k_menu[$i]}<br />"; } ?></td> </tr> </table> <form method="post" action="form2.php" name="h_form" id="h_form"> <input type="hidden" name="k_menu" id="k_menu" value="<?php print htmlspecialchars($k_menu); ?>" /> *メール送信ページ <?php $p_k_menu = $_POST['k_menu']; mb_language("Ja"); mb_internal_encoding("EUC-JP"); $mailbody = "興味のあるメニューは?:".$k_menu; $address = "メールアドレス"; $subject = "件名"; if(mb_send_mail($address,$subject,$mailbody,"from:メールアドレス")){ print "応募を受け付けました。"."<br />"."ありがとうございました。"; }else{ print "応募を確認できませんでした。"."<br />"."申し訳ございませんが、もう一度ご送信下さい。"."<br />"."<form><input type='button' name='bk' id='bk' value='戻る' onclick='history.go(-2)'></form>"; } ?> ソースは以上です。 何処が悪いんでしょうか??

  • <?php

    <?php if(isset($_POST['name'])){ $name = htmlspecialchars($_POST['name']); if (empty($name)) { $message = '未入力があります'; } } if(isset($_POST['regist'])) { $regist = htmlspecialchars($_POST['regist']); if($message) { header('Location:regist2.php'); } } ?> <html> <form action="regist2.php" name="form" method="post"> <div align=left> 名前<input type="text" name="name" maxlength="16" istyle="1" format="M" mode="hiragana" style="-wap-input-format:&quot;*&lt;ja:h&gt;&quot;; -wap-input-format:*M;" /><br /> <input type="submit" name="regist" value="送信" /> </form> と携帯サイトを作成してるのですが、空白でもそのままregist2にいってしまい困っております。 空白の場合はsubmit押してもエラーを表示させたいのです 問題がなければ、そのままregist2.phpへいかせる方法はないでしょうか? ご教授お願い致します。

    • 締切済み
    • PHP
  • チェックボックスから配列を使って値を受け取る方法

    チェックボックスから配列を使って値を受け取る方法について、 以下の通りに試してみたのですが、上手く行かず、 配列$fCに値が入りません。 どなたか原因を教えていただけないでしょうか。 ------------------------------------------------ hoge.html <form action="hoge.php"> <input type="checkbox" name="fC[]" value="hoge"> hoge <br> <input type="checkbox" name="fC[]" value="foo"> foo <br> <input type="checkbox" name="fC[]" value="bar"> bar <br> <input type="submit" value="OK"> </form> ---------------------------------------------------------- ------------------------------------------------- hoge.php <? for( $i=0; $i<count($fC); $i++ ) { print $i ." ::: " . $fC[$i] . "<br>\n"; } ?> ----------------------------------------------------------

    • ベストアンサー
    • PHP
  • チェックボックス、セレクトメニューについて

    現在フォームを作成しております。 入力フォームで各項目を入力してから確認画面、送信となるフォームです。 入力フォームにて各項目を入力し、確認画面が表示され、確認画面にて入力等の間違えや、入力をし忘れた等などがあった場合「戻る」で、入力画面に戻るようにしています。 (必須項目が記入されていなかった場合は自動で入力画面に戻るように設定。) 入力画面にてセレクトメニュー(1990年01月01日に選択したとする。)、チェックボックス(MF,FWにチェックをしたとする。)を選択し、 確認画面が表示されたあと入力画面に戻るとセレクトメニューは選択した値(1990年01月01日)のはずが初期値の値(1980年01月01日)に戻っている。 チェックボックスは選択されていたはずなのにチェックがはずれているという現象が起きています。 入力画面→確認画面→入力画面ページが表示されてもセレクトメニューの値はそのままでなおかつチェックボックスの値もそのまま表示されているようにしたいです。 この現象を直すにはどのように記述したらよろしいでしょうか? 下記は入力フォームと確認画面の記述になります。 /***** 入力画面 *****/ <tr> <td class="title_back1"><label for="mail">生年月日</label></td> <td class="title_back2"> <p class="error"><?php print $_SESSION['err_birthday_ereg']; ?></p> <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -29; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> </td> </tr> <tr> <td class="title_back4"><label for="position">希望ポジション</label></td> <td class="title_back5"> <input type='checkbox' name='position[]' value='GK'>GK <input type='checkbox' name='position[]' value='DF'>DF <input type='checkbox' name='position[]' value='MF'>MF <input type='checkbox' name='position[]' value='FW'>FW <input type='checkbox' name='position[]' value='MG'>MG </td> </tr> /***** 確認画面 ******/ $year = isset($_POST['year']) ? sprintf("%04d",$_POST['year']) : NULL; $month = isset($_POST['month']) ? sprintf("%02d",$_POST['month']) : NULL; $day = isset($_POST['day']) ? sprintf("%02d",$_POST['day']) : NULL; $position = isset($_POST['position']) ? implode(" , " , $_POST["position"]) : NULL; //生年月日をチェック if (checkdate($month, $day, $year) === false) { $_SESSION['err_birthday_ereg'] = '生年月日が正しくありません。'; $error = TRUE; } else { unset($_SESSION['err_birthday_ereg']); } <tr> <td class="title_back1">生年月日</td> <td class="title_back2"><?php print h($year) ;?>年&nbsp;<?php print h($month) ;?>月&nbsp;<?php print h($day) ;?>日</td> </tr> <tr> <td class="title_back4"><label for="career">希望ポジション</label></td> <td class="title_back5"><?php print h($position) ;?></td> </tr> と以上になります。 とても説明がしずらいためわかりにくいとこがあると思いますが、宜しくお願いします。 また、何か足りない記述等が御座いましたら、お申しでください。 他のテキストボックスなどは正常に動作しております。 (入力画面→確認画面→入力画面の動作をおこなってもテキストボックス内に表示されています。) 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • チェックボックスで画像を一括表示

    下記サイトを参照して、 「チェックボックスのON / OFFで画像を表示する」 「全てのチェックボックスのON / OFFを切り替える」 を組み合わせて、 「全てのチェックボックスのON / OFFを切り替えて画像の一括表示」をしたいのですが、全てのチェックボックスのON / OFFの切り替えはできるのですが、それに伴って画像の表示・非表示までは反応しませんでした。各チェックボックスのON / OFFでの画像の表示・非表示は可能です。 http://iswebmag.hp.infoseek.co.jp/sample163.html http://iswebmag.hp.infoseek.co.jp/sample164.html ▼htmlソースです。 <FORM name="f1"> <INPUT type=checkbox name="f1" onClick="show(0,'img01')">朝焼に輝く星<BR> <INPUT type=checkbox name="f1" onClick="show(1,'img02')">木立の隙間から<BR> <INPUT type=checkbox name="f1" onClick="show(2,'img03')">夜明け<BR> <INPUT type=checkbox name="f1" onClick="show(3,'img04')">自転を感じる<BR> <INPUT type=checkbox name="f1" onClick="show(4,'img05')">昼の星空<BR> <INPUT type=checkbox name="f1" onClick="show(5,'img06')">砂丘の月<BR> <INPUT type=checkbox name="f1" onClick="show(6,'img07')">月の軌跡<BR> <INPUT type=checkbox name="f1" onClick="show(7,'img08')">彗星の飛来<BR> <INPUT type=checkbox name="f1" onClick="show(8,'img09')">彗星 <BR> <INPUT type=button value="全てOn" onClick="all_on(this.form.f1)"> <INPUT type=button value="全てOff" onClick="all_off(this.form.f1)"> </FORM> ▼チェックボックスのON / OFFで画像を表示するJavaScript <SCRIPT language="JavaScript"> <!-- function show(c,img){ if(document.f1.elements[c].checked == true){ document.getElementById(img).style.width=200; } else { document.getElementById(img).style.width=0; } } // --> </SCRIPT> ▼全てのチェックボックスのON / OFFを切り替えるJavaScript <SCRIPT language="JavaScript"> <!-- function all_on(chk){ for (i = 0; i < chk.length; i++) { chk[i].checked = true; } } function all_off(chk){ for (i = 0; i < chk.length; i++) { chk[i].checked = false; } } // --> </SCRIPT>

専門家に質問してみよう