こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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ではこのようなことはないようです。
この点について詳しい情報をお持ちの方はお教えいただきたく思います。
よろしくお願いいたします。

投稿日時 - 2008-04-20 13:01:29

QNo.3962054

すぐに回答ほしいです

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

変数名には空白や記号は使えませんが一般の配列のキーには使えます
ただ$_POSTや$_GET等の配列は特殊で配列のキーはregister globalsの設定によっては変数名としても使われるので変数名と同じと考えた方がよいでしょう。
"."(ドット、ピリオド)に関してはマニュアルに"_"に変換されることが明記されていますがその他については記載がありません。
ただ空白や単独の"["も"_"に変換されるようです。
http://jp.php.net/manual/ja/language.variables.external.php

投稿日時 - 2008-04-21 14:51:38

補足

ドットについての記載を確認できました。ありがとうございます。
"重要なことを記述しておくと、このため、外部変数に含まれるドットを 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で同じテストをして確認したところでは、スペース、ドット、タブ、「[」も含めてどの文字もアンダースコアに変換されることはなく、そのまま表示されました。

投稿日時 - 2008-04-21 19:09:27

お礼

やっと求めていた答えにたどり着いたように思います。
ありがとうございました。

投稿日時 - 2008-04-21 20:22:31

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>これはPHPの仕様なのでしょうか。

変数名などのラベルの形式についてはマニュアルに記載があります。

  http://www.php.net/manual/ja/language.variables.php

>キーの部分に変数を代入して利用したいためです。

代入するとしても、空白(やピリオド)があったらマズイのですから、適宜チェックして(必要であれば変換して)代入するのがスジです。

投稿日時 - 2008-04-21 03:00:45

お礼

アドバイスありがとうございます。
マニュアル詳しく調べてみます。
>代入するとしても、空白(やピリオド)があったらマズイのですから、適宜チェックして(必要であれば変換して)代入するのがスジです。
使用文字の制限と置換で対処しようと思います。

投稿日時 - 2008-04-21 19:08:08

ANo.1

変数名や、連想配列のキー名に、スペースは許可されていません。

というか、配列名や連想配列のキー名にスペースがなぜ必要?

投稿日時 - 2008-04-20 13:55:59

補足

早々とご回答いただきありがとうございます。
>変数名や、連想配列のキー名に、スペースは許可されていません。

連想配列のキーに許可されていない文字について詳しく書かれているサイトをご存知でしたら教えていただけませんでしょうか。
先の例では半角のドット「.」も以下のようにアンダースコアに変換されます。
<input type="hidden" name="p.o.s.t" value="p.o.s.t">
→p_o_s_t=p.o.s.t
>というか、配列名や連想配列のキー名にスペースがなぜ必要?
キーの部分に変数を代入して利用したいためです。

投稿日時 - 2008-04-20 14:21:56

お礼

早々とご回答いただきありがとうございました。

投稿日時 - 2008-04-21 17:34:09

あなたにオススメの質問