忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/09/26 05:23 |
PHP0-2:フォームで「すべて選択」「選択解除」

大量のチェックすボックスが存在する掲示板やメールの管理フォームには、
よく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


2008/04/18 17:24 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-4:変数の使用 | HOME | 呪いの数列コンバータを作った>>
忍者ブログ[PR]