PHPとHTMLは深く関係しています:PHPはHTMLを生成し、HTMLにはPHPに送信 される情報が記述されています。
エンコードが重要になる場面はいくつかあります。 string $dataというエンコードされ ていない文字列データを渡す場合について考えてみると:
HTMLを通じて渡す場合: 文字列にはどのような値が含まれるか分か らないので、データは必ずhtmlspecialcharsを行い、 ダブルクオートで囲まなければなりません。
URLを通じて渡す場合: URLはいくつかのパーツから成り立ちます。 このデータをそのパーツのうちの一つであると解釈させたいならば、 urlencode()でエンコードしなけれ ばなりません。
注意 $dataをurlencode()をして はいけません。なぜなら、その作業はブラウザに任されているからで す。一般に普及している全てのブラウザは正しくこの処理を行ってく れます。ただ、この処理はメソッド(GETやPOST)が何であるかにかか わらずに行われる、ということに気をつけてください。この処理に気 づくのはGETリクエストのときだけになるでしょう。なぜならPOSTリ クエストの内容は通常目に触れることは無いからです。
注意 ブラウザはエスケープされたシンボルを解釈するので、dataは意図し たとおりに表示されます。
フォームの内容を送信するとき、GETかPOSTかにかかわらずdataはブ ラウザによってURLエンコードされ、PHPによってURLデコードされま す。要は、URLエンコード/デコードを自分で行う必要はなく、これら の処理は全て自動的に行われる、と言うことです。
注意 この例では、実はGETリクエストを摸擬しています。このため、data を手動でurlencode()する必要があります。
注意 全てのURLをhtmlspecialchars()する必要があります。 なぜなら、このURLはHTMLのvalue属性として扱われるからです。この 場合は、ブラウザはまずhtmlspecialchars()されたデー タを元に戻し、それからURLを渡します。URLは urlencode()されているので、PHPはこれを正し く解釈することができます。
URL中の&が& に置き換えられていることに気づくでしょう。もしあなたがこれを忘 れても、ほとんどのブラウザは元に戻してくれますが、必ずそうして くれるとは限りませんので、URLが動的に変更されるものでなくても URLはhtmlspecialchars()されるべき です。
以下のようなタグを使えば、標準のボタンの代わりに画像を使用して フォームを送信することができます:
<input type="image" src="image.gif" name="foo"> |
PHPでは$foo.xと$foo.yという名前は変数名として正しくないので、自 動的に$foo_xと$foo_yという名前に変換されます。要は、ピリオドがア ンダースコアに置き換えられる、と言うことです。
フォームの内容をPHPスクリプトで配列として受け取るには、 <input>, <select> or <textarea>といった要素のnameを以 下のように指定します:
<input name="MyArray[]"> <input name="MyArray[]"> <input name="MyArray[]"> <input name="MyArray[]"> |
<input name="MyArray[]"> <input name="MyArray[]"> <input name="MyOtherArray[]"> <input name="MyOtherArray[]"> |
<input name="AnotherArray[]"> <input name="AnotherArray[]"> <input name="AnotherArray[email]"> <input name="AnotherArray[phone]"> |
注意 HTMLに配列のキーを指定するかどうかは自由です。キーを指定しなかっ た場合はフォームに現れる順番に番号がつけられます。最初の例だと、 キーは0, 1, 2, 3となります。
配列関数と PHPの外部から来る変数 も参照して下さい。
"select multiple"タグを使うと、ユーザはリストから複数の項目を選 択することができるようになります。選択された項目はフォームの actionで指定されたハンドラに渡されます。問題は、これらの値が全て 同じ名前で渡されることです。つまり、
<select name="var" multiple> |
var=option1 var=option2 var=option3 |
<select name="var[]" multiple> |
JavaScriptを使っている場合、フォーム要素に要素名を使って(訳注: document.myform.myelement.value等の様に)アクセスしようとすると、 要素名に含まれる[]が問題となることがあるので 気をつけてください。この場合は、数字で表されるフォーム要素のIDを 使用するか、シングルクオートで要素名を囲んでフォーム要素の配列の インデックスとしてアクセスして下さい。例えば、以下のようにします:
variable = documents.forms[0].elements['var[]']; |