• ベストアンサー

リスト選択後他の項目がクリアされる。

phpで検索条件を設定する画面を作っています。 今ある条件項目Aがリスト選択制で何か選ぶとJavaScriptが動いて別の条件項目Bの内容が表示されるようになっています。 このJavaScriptが動作したために、それまでに入力されていたそれ以外の条件項目(例えばC~F)のデータが一旦クリアされてしまいます。これをクリアしないようにするためにどうしたらよろしいでしょうか?テキストタイプも同じリストタイプもクリアされてしまいました。

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.7

こんにちは。 ・配列のデータ <input type="hidden" name="bbb[]" value = "<?php print $_POST['bbb']; ?>" > 上記のように書いた場合に出力されるHTMLを見てみてください。 <input type="hidden" name="bbb[]" value="Array" /> となっていると思います。 これでは送信されるのは"Array"という情報です。 name[]とすることでPHP側で配列として扱ってくれているだけであってhiddenに格納してもう一度同じデータを送信するなら同じように展開してあげる必要があります。 <?php foreach ( $_POST['type'] as $value ) { ?> <input type="hidden" name="type[]" value="<?= $value ?>" /> <?php } ?> こうすることで送信されてきた分のhidden要素が出来ますので、またPHP側でそのデータを配列として受け取ることが出来ます。

o2shgi3eatge
質問者

お礼

こんにちは。ご回答ありがとうございます。 早速試してみましたが、 <?php foreach ( $_POST['type'] as $value ) { ?> <input type="hidden" name="type[]" value="<?= $value ?>" /> <?php} ?> の{}は違うようだったので <?php foreach ( $_POST['type'] as $value ): ?> <input type="hidden" name="type[]" value="<?= $value ?>" /> <?php endforeach; ?> で行けました。その後動きが可笑しかったですが自力で解決できました。 とりあえず今回で終わりにしたいと思います。 本当多大なる時間と御手間を取らせましてありがとうございました。 今回の質問については別途資料にして残そうと思います。 また、何かphpで分からないことが出てきたらお知恵を拝借できれば幸いです。

その他の回答 (6)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.6

こんにちは。 すみません、考慮漏れでした。 確かに選択されたものしか入ってきませんので以下のようにすればOKです。 名前も一緒でかまいません。 $type = isset ( $_POST['type'] ) ? $_POST['type'] : array(); <input type="checkbox" name="type[]" value="A"<?= in_array('A',$type) ? ' checked="checked"' : '' ?> />A<br /> <input type="checkbox" name="type[]" value="B"<?= in_array('B',$type) ? ' checked="checked"' : '' ?> />B<br /> <input type="checkbox" name="type[]" value="C"<?= in_array('C',$type) ? ' checked="checked"' : '' ?> />C<br /> <input type="checkbox" name="type[]" value="D"<?= in_array('D',$type) ? ' checked="checked"' : '' ?> />D<br /> <input type="submit" value="送信" /> 要はtypeという配列の中に同じvalueがあるか調べればよいのでin_array()を使います。 in_array()については調べてみてください。

o2shgi3eatge
質問者

お礼

こんばんは。毎度回答頂きありがとうございます。 教えて頂いたin_array()を使って試してみたら上手く動く事ができました。ありがとうございます。 一方、それに関係することなのですがもしお手間でなければ相談させて頂きたいのですが、 そのcheckboxをformを使った別のphpファイルに渡した後受けた側ではそのデータを使って検索処理を行って検索結果を表示させています。 先頭ページはいいのですが次のページや表示順を変えたとき、結局自分自身に対してそれらのデータを再度渡すことになるのですがこれが普通のデータなら上手く渡せられるのですが配列データが上手く渡せません。 渡す際にhiddenを使って以下のように設定しています。 ・普通のデータ <input type="hidden" name="aaa" value = "<?php print $aaa;>" > ・配列のデータ <input type="hidden" name="bbb[]" value = "<?php print $_POST['bbb']; ?>" > 自分自身にデータをもう一度渡して同じように検索処理が動くようにしたいのですが何か言い渡し方があるものでしょうか?

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.5

こんにちは。 ループで処理するかは作り方次第です。 $type = isset ( $_POST['type[]'] ) ? $_POST['type[]'] : NULL; <input type="checkbox" name="type[]" value="A">と定義した場合、PHP側で配列になりますが下のような取り方になります。 $_POST['type'][0] なので <input type="checkbox" name="type[]" value="A"<?= $_POST['type'][0] === 'A' ? ' checked="checked"' : '' ?> /> <input type="checkbox" name="type[]" value="B"<?= $_POST['type'][1] === 'B' ? ' checked="checked"' : '' ?> /> とすれば実現出来ます。

o2shgi3eatge
質問者

お礼

毎度回答頂き本当に感謝します。 書いて下さった書き方で試した見た所、チェックは全クリアされることがなくなりました。 ただ、間間にチェックを入れてリスト変化すると中途半端にクリアされてしまいます。4つある項目の先頭以外の3つをチェック入れると全クリアされるので 原因は$_POST['type'][0]がチェックされているものだけを順番に格納されているため、比較ではじかれたと思います。 実際、これらのデータを受け取ってSQL文を作るために使いやすいようにとnameが共通の配列を使いましたが、今回の動きを見るとそれぞれに別のnameを指定しないといけないのでしょうか?

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.4

こんにちは。 checkboxも同様です。 値を取得して、表示する際に比較しchecked="checked"を出力してあげれば初期状態でチェックされたものになります。

o2shgi3eatge
質問者

お礼

再び回答していただきありがとうございます。 checkboxも同様ということで試してみました。 ただ、checkboxについては一つ問題があってselectみたいに一つだけではんくいくつかあるのでnameがaaa[]といった配列になるので、 <?= $v3 === 'A' ? ' checked="checked"' : '' ?> といった書き方では上手く行きません。この書き方をループ処理で調べる必要があると思ったのですが、如何でしょうか? 上記書き方のループ版となるとどのような書き方になるのでしょうか? ちなみに現在下記のような書き方になっていますがクリアされます。 $type = isset ( $_POST['type[]'] ) ? $_POST['type[]'] : NULL; <input type="checkbox" name="type[]" value="A" <?= $type === 'A' ? ' checked="checked"' : '' ?>>エー <input type="checkbox" name="type[]" value="B" <?= $type === 'B' ? ' checked="checked"' : '' ?>>ビー <input type="checkbox" name="type[]" value="C" <?= $type === 'C' ? ' checked="checked"' : '' ?>>シー

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.3

こんにちは。 >参考にtextタイプで書いてくださいましたがこれがselect/optionやcheckboxの場合はどうなるのでしょうか? これは例のソースを見ればわかると思いますが、selectでの初期状態を設定するにはselected="selected"をoptionに付けてあげます。 ==== php部分 $v3 = isset ( $_POST['v3'] ) ? $_POST['v3'] : NULL; ==== html部分 <select name="v3"> <option value="A"<?= $v3 === 'A' ? ' selected="selected"' : '' ?>>A</option> <option value="B"<?= $v3 === 'B' ? ' selected="selected"' : '' ?>>B</option> <option value="C"<?= $v3 === 'C' ? ' selected="selected"' : '' ?>>C</option> </select> 上記のようにすることによって選択されていたv3の値が取得できます。 取得した値とそのoptionの値を比較して同じだった場合はselected="selected"を表示しています。

o2shgi3eatge
質問者

お礼

回答ありがとうございます。 ちょっと試してみます。これはcheckboxも同様でしょうか?

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 多分私が作ったスクリプトを参考にしていると思いますが、あのソースだと保持できているのはリストAの選択値のみです。 他にフォーム部品を追加するのであればリロード毎に入力されている内容をセットしてあげないといけません。 (何故かというと選択毎にsubmitしている為です) $v1 = isset ( $_POST['v1'] ) ? $_POST['v1'] : ""; $v2 = isset ( $_POST['v2'] ) ? $_POST['v2'] : ""; <input type="text" name="v1" value="<?= $v1 ?>" /> <input type="text" name="v2" value="<?= $v2 ?>" />

o2shgi3eatge
質問者

お礼

回答ありがとうございます。 その項目ごとに随時内容をセットしないといけないんですね。 参考にtextタイプで書いてくださいましたがこれがselect/optionやcheckboxの場合はどうなるのでしょうか?いずれもデータで送信したい値をvalueに入れているためvalueが使えないと思うのですが。

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.1

ソースが無いので何も指摘ができません... そのJavaScriptがバグっているので、それを直してくださいとしか言いようがありません。

o2shgi3eatge
質問者

補足

すいません。 私の勝手な予想ですが、バグっているというよりかは追加で何か記載すればいけるのかな?と思うのですが。。。(>_<) とりあえずリスト選択時に動作するjavascript のソースを下記に記載します。 <script type="text/javascript"> function setDistrict ( obj ) { document.getElementById('id_district').selectedIndex = 0; document.getElementById('dsearch').submit(); } function setArea ( obj ) { document.getElementById('id_area').selectedIndex = 0; document.getElementById('dsearch').submit(); } </script>

関連するQ&A