大量のチェックすボックスが存在する掲示板やメールの管理フォームには、
よくJavaScriptによる「すべて選択」「選択解除」ボタンが実装されています。
これをPHPと併用すると問題が発生します。
<form method="GET"> <input type="checkbox" name="aaaaa" value="1"> <input type="checkbox" name="aaaaa" value="2"> <input type="checkbox" name="aaaaa" value="3"> <input type="button" name="aaa" value="すべて選択" onClick="check(true);"> <input type="button" name="aaa" value="選択解除" onClick="check(false);"> |
aaaaaというnameに複数の値を設定し、valueで区別するというよく見るフォームです。
name="aaaaa"の配列に値が全て入っているので、
JavaScript側ではlengthで長さを取得し、forで回すだけで簡単に実装できます。
function check(check){ for(var count=0;count<document.forms[0].aaaaa.length;count++){ document.forms[0].aaaaa[count].checked=check; } } |
さて、このフォームをPHPに渡すと重大な問題が表れます。
本来HTMLでは同一nameで複数のvalueを許可しており、
http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/interact/forms.html#checkbox
実際送信先に渡されるパラメータも?aaaaa=1&aaaaa=2&aaaaa=3
という形になっていますが、
$_GETで受け取ると、「最後の一個の値しか取得できない」という不具合仕様が現れます。
この場合$_GET['aaaaa']=3となってしまい、
aaaaa=1やaaaaa=2の部分から値を取得することは出来ません。
文字列としてならば、$_SERVER["QUERY_STRING"]で"aaaaa=1&aaaaa=2&aaaaa=3"という値を取得することができます。
これはURLの?以降の部分となります。
method="POST"だと内部構造がどうなってるのかはよくわかりませんが、
$_POSTで受け取れる値はやはり最後の一個だけです。
こちらの場合はURLが変化するわけではないので、$_SERVER["QUERY_STRING"]を使ってもaaaaa=1の値を受け取ることはできません。
ちなみにPerlでは配列で受け取ることが可能です。
PHPの仕様で、どうにもならないのでHTML側を書き換えるしかありません。
<input type="checkbox" name="aaaaa[]" value="1"> <input type="checkbox" name="aaaaa[]" value="2"> <input type="checkbox" name="aaaaa[]" value="3"> |
とすると、PHPで受け取った場合[]内に数値が自動的に入り、
$_GET['aaaaa'][0]等で各値を無事受け取れるようになります。
ところがこうすると今度はJavaScript側で問題が発生します。
JavaScriptはaaaaa[]を配列として見てくれないので、
よってlengthで要素数を取得できません。
またdocument.forms[0].aaaaa[0]等とやっても値は取得できません。
結論から言うと下記で取得できます。
document.forms[0].elements['aaaaa[]']
elementsにはフォーム内の全要素が入るので、
その中からaaaaa[]の集合を抜き出しています。
従って、PHPとJavaScriptで同じnameの要素を使用したい場合、
JavaScript側で、「aaaaa」を「elements['aaaaa[]'」と書き換えると動きます。
function comment_check(check){ for(var count=0;count<document.forms[0]. elements['aaaaa[]'].length;count++){ document.forms[0].elements['aaaaa[]'][count].checked=check; } } |
思うにPHPの作者はJavaScriptが嫌い。
PR
トラックバック
トラックバックURL: