- ベストアンサー
PHPのPOSTでの半角スペース
PHP5.1.6を使用しています。 POSTで以下のようにnameの値に半角スペースを含め <input type="hidden" name="p o s t" value="p o s t"> 以下のようにデータを受け取って表示させると foreach($_POST as $k=>$v){ print $k."=".$v."<br>\n"; } p_o_s_t=p o s t と表示されます。nameに半角スペースが含まれると強制的にアンダースコアに変換されているように思われます。valueの方は半角スペースのまま表示されます。 これはPHPの仕様なのでしょうか。Perlではこのようなことはないようです。 この点について詳しい情報をお持ちの方はお教えいただきたく思います。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
変数名には空白や記号は使えませんが一般の配列のキーには使えます ただ$_POSTや$_GET等の配列は特殊で配列のキーはregister globalsの設定によっては変数名としても使われるので変数名と同じと考えた方がよいでしょう。 "."(ドット、ピリオド)に関してはマニュアルに"_"に変換されることが明記されていますがその他については記載がありません。 ただ空白や単独の"["も"_"に変換されるようです。 http://jp.php.net/manual/ja/language.variables.external.php
その他の回答 (2)
- shimix
- ベストアンサー率54% (865/1590)
>これはPHPの仕様なのでしょうか。 変数名などのラベルの形式についてはマニュアルに記載があります。 http://www.php.net/manual/ja/language.variables.php >キーの部分に変数を代入して利用したいためです。 代入するとしても、空白(やピリオド)があったらマズイのですから、適宜チェックして(必要であれば変換して)代入するのがスジです。
お礼
アドバイスありがとうございます。 マニュアル詳しく調べてみます。 >代入するとしても、空白(やピリオド)があったらマズイのですから、適宜チェックして(必要であれば変換して)代入するのがスジです。 使用文字の制限と置換で対処しようと思います。
- inu2
- ベストアンサー率33% (1229/3720)
変数名や、連想配列のキー名に、スペースは許可されていません。 というか、配列名や連想配列のキー名にスペースがなぜ必要?
お礼
早々とご回答いただきありがとうございました。
補足
早々とご回答いただきありがとうございます。 >変数名や、連想配列のキー名に、スペースは許可されていません。 連想配列のキーに許可されていない文字について詳しく書かれているサイトをご存知でしたら教えていただけませんでしょうか。 先の例では半角のドット「.」も以下のようにアンダースコアに変換されます。 <input type="hidden" name="p.o.s.t" value="p.o.s.t"> →p_o_s_t=p.o.s.t >というか、配列名や連想配列のキー名にスペースがなぜ必要? キーの部分に変数を代入して利用したいためです。
お礼
やっと求めていた答えにたどり着いたように思います。 ありがとうございました。
補足
ドットについての記載を確認できました。ありがとうございます。 "重要なことを記述しておくと、このため、外部変数に含まれるドットを PHP は自動的にアンダースコアに変換します。" その下にあるUser Contributed Notesに以下の記載を見つけました。 The full list of field-name characters that PHP converts to _ (underscore) is the following (not just dot): chr(32) ( ) (space) chr(46) (.) (dot) chr(91) ([) (open square bracket) chr(128) - chr(159) (various) 最後のchr(128)-chr(153)の意味が不明ですが、やはり、半角スペース、ドット、単独の"["がアンダースコアに変換されるとあります。私が実際にテストして試したところではこれら以外に「タブ」がアンダースコアに変換されました。因みに、以下の特殊文字は変換さずそのまま表示されることを確認しました。 「;」「:」「/」「?」「,」「&」「%」「*」「<」「>」「]」「{」など Perlで同じテストをして確認したところでは、スペース、ドット、タブ、「[」も含めてどの文字もアンダースコアに変換されることはなく、そのまま表示されました。