• ベストアンサー

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

  • gb75
  • お礼率100% (3/3)
  • PHP
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

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

gb75
質問者

お礼

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

gb75
質問者

補足

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

その他の回答 (2)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

>これはPHPの仕様なのでしょうか。 変数名などのラベルの形式についてはマニュアルに記載があります。   http://www.php.net/manual/ja/language.variables.php >キーの部分に変数を代入して利用したいためです。 代入するとしても、空白(やピリオド)があったらマズイのですから、適宜チェックして(必要であれば変換して)代入するのがスジです。

gb75
質問者

お礼

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

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

変数名や、連想配列のキー名に、スペースは許可されていません。 というか、配列名や連想配列のキー名にスペースがなぜ必要?

gb75
質問者

お礼

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

gb75
質問者

補足

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

関連するQ&A

  • phpのpostについて

    a.phpの値をb.phpにpostしたいのですがうまく値が渡せません post元にはname属性に変数を用いているのですがpost先でnameをどのように指定したらいいかわかりません <a.php> <form action="foo.php" method="POST"> <div id="button"> <input type="submit" name ="PostGo" value="postTime" style="margin-right:30px;" /> </div> <table> <?php for ($data = 1; $data < 5; $data++) { ?> <tr><td> <select name="test<?php echo $data?>"> <option value=1>1 <option value=2>2 <option value=3>3 <option value=4>4 </select> <?php } ?> </table></form> <b.php> <?php for($i=1;$i<5;$i++){ $test =($_POST['test']);←ここの部分のpostをどう指定したらいいかわかりません echo $test; } ?> ※$_POST['test' + $i] これでも取れませんでした

    • ベストアンサー
    • PHP
  • 入力内容の確認を行う前に$_POSTの入力値の前後から半角及び全角の空白を取り除きたい。

    一つのファイルでフォームへの入力及び入力内容の確認ができるファイル(enter.php)を作成しているのですが、入力内容の確認を行う前に入力値の前後から半角及び全角の空白を取り除きたいです。 しかし、半角及び全角の空白を取り除く部分でプログラムが動作しなくなり、なぜかわかりません。具体的には、以下の部分が問題です。 //入力された値の前後の全角及び半角スペースを取る関数。 function remove_space(&$value) { $value = preg_replace('/^[  ]*(.*?)[  ]*$/u', '$1', $value); } 及び //下記で入力された値の前後の全角及び半角スペースを一気に取り除きたい(ここが問題。)。 array_walk($_POST, 'remove_space'); の部分です(これらの部分を取り除くとプログラムは問題なく動作します。)。 どうやら、function remove_spaceの部分よりもarray_walk($_POST, 'remove_space'); が間違っているようなのですが、どこが悪いかわかる方おられますか? 一様、一通りのコードを下記へ載せておきます。 /////////////////////////////enter.phpファイル <?php session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <body> <?php //入力された値の前後の全角及び半角スペースを取る関数。 function remove_space(&$value) { $value = preg_replace('/^[  ]*(.*?)[  ]*$/u', '$1', $value); } if (isset($_POST['confirm'])) { $isErr = false; //下記で入力された値の前後の全角及び半角スペースを一気に取り除きたい(ここが問題。)。 array_walk($_POST, 'remove_space'); if (strlen($_POST['my_name']) == 0) { $isErr = true; $error_person = '名前を入力してください。'; } if (strlen($_POST['hobby']) == 0) { $isErr = true; $error_person = '趣味を入力してください。'; } if (strlen($_POST['school']) == 0) { $isErr = true; $error_person = '学校を入力してください。'; } if (!$isErr) { $_SESSION['input_data'] = $_POST; header('Location: https://www.example.com/mail.php'); exit; } } ?> <form action="enter.php" method="post"> <input type="text" name="my_name"> <input type="text" name="hobby'" > <input type="text" name="school"> <input type="submit" name="confirm" value="確認画面へ進む"> </form> </body> </html> ///////////////////////////// よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで配列をPOSTデータで送った場合の取り出し方を教えてください。

    PHPで配列をPOSTデータで送った場合の取り出し方を教えてください。 知恵袋でも質問したのですか、使い方をよくわかっておらず、補足が追加出来なくって、回答者の方に返事が出来なくなってしまいました。申し訳ありません。 プログラム初心者です。始めたばかりで、自分で考えて知っている範囲で組もうとしているのですが、 例えば <form method="POST" action="○○○"> <input type="checkbox" name="color[]" value="赤" />赤<br /> <input type="checkbox" name="color[]" value="青" />青<br /> <input type="checkbox" name="color[]" value="緑" />緑<br /> <input type="submit" value="送信" /> とこのように書いてすべてにチェックを付けて送った配列のデータはどのように取り出したら良いのでしょうか? foreachで下記のように、 $x = $_POST['color']; foreach( $x as $value ){ echo "色 = ". $value."<br />\n"; } exit; $_POST['color']の配列を取り出そうすると Invalid argument supplied for foreach() と表示されてしまいます。 var_dumpで配列を表示させると、 string(3) "Array" と表示され確かに配列として届いていると思います。 確かにチェックはいれて送信もしています。 print "{$_POST['color']}"で表示してみると、"A"と"r"と"r"でした。 チェックボックスを10個に増やして、それぞれ$_POST['color'][0]~[9]まで 表示させてみたところ、はじめの5個はArrayも文字がいつつ表示され、残りは空白でした。 知恵袋のほうで、取り出し方が間違っているとの指摘をいただきましたが、どのように取り出したら良いのでしょうか。 どなたかお手数ですが、教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのフォームの複数選択で。。。

    すいません当方PHPかなりの初心者で。。。。 入力→確認→送信のような流れのフォームを作成しているのですが。。。 メールフォームで複数選択が可能な場合フォームの受け取り側のPHPはどのように記載すればいいのでしょうか? □A □B □C □D □E □F ↑のようなフォームを作りチェックされたものを 【フォーム側】 <input type="checkbox" value="A" name="is[]">A <input type="checkbox" value="B" name="is[]">B <input type="checkbox" value="C" name="is[]">C <input type="checkbox" value="D" name="is[]">D <input type="checkbox" value="E" name="is[]">E <input type="checkbox" value="F" name="is[]">F 【確認画面のPHP】 // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } //中略// // 確認画面表示箇所 <? $is_value = $_POST["is"]; foreach($is_value as $v){ echo $v ." <br> "; } ?> //中略// // 送信PHPへの受け渡し場所 <input type="hidden" name="service" value="<?= $is_value ?>"> ↑この部分の記載の仕方がわかりません。。。 確認画面で表示させたものを関数に格納して送信PHPの方に受け渡ししたいのですが。。。 どのようにどのあたりに記載したらいいのでしょうか? わかりにくい質問かもしれません。。。 なにとぞなにかお気づきの点がありましたらご教授ねがえると助かります。。。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHP foreachのループの中でPOST送信

    現在掲示板を作っています。 <?php foreach ($result as $record){ $id = $record ["id"]; $title = $record ["title"]; ?> <form method="post" name="form1" action="contents.php"> <input type="hidden" name="id" value="<?php echo $id; ?>"> <a href="javascript:form1.submit()" ><?php echo $title; ?></a> </form> <?php } $dbInfo = null; ?> </form> テーブルのidとtitleをすべて取り出しています。 titleを一覧表示で全件表示させリンクを貼り、移動先にidをPOSTで送信し投稿内容がみられるようにしたいのですが、リンクを貼れても飛べなかったり、移動できてもなにも送信していない状態(ただ移動しただけ)だったり。 2つ目のphp直後の「}」を1つ目の中で閉じるとPOST送信しつつ移動できるのですが、1件しか表示されなくなってしまいます。 <form method="POST" name="con-id"> <input type="hidden" name="id" value="<?php echo $id; ?>"> <a href='contents.php'><?php echo $title; ?></a> </form> などもしてみましたが、POST送信はされませんでした。 なにか方法はありませんでしょうか? ここをこうした方がいい、など教えて頂きたいです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • $POSTの送信

    POSTデータを送信する方法を教えてください。 PHPのPOSTを用いたプログラミングを行っています。 以下のように、前ページ受信したPOSTの内容(「aaa」)を hiddenで送信したいと思いましたが 次ページ(result.php)にて「$name」と受信してしまいます。 (前略) <?php $name = $_POST['name']; echo $name; ?> <form action="result.php" method="POST"> <input type="hidden" name="name2" value=$name> <input type="radio" name="name3" value=" (以下略) 説明下手ではありますがご回答頂きたいと思います。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPでのCookie

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 form2.phpで一度更新しないと、結果が画面に表示されません。 これをform2.phpを開いた時点で表示されるようにするには、どのように書けばいいのでしょう。 後1つあります。form.phpで 「テスト&1」と書くと「テスト」としか表示されなく、&とそれ以降が記憶されません。 これはなぜでしょうか? お願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php if ($_POST) { $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); } parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • PHP
  • POSTで送りたい

    PHP初心者です HTMLタグが混じっ文字をHTMLごとPOSTで次ページに送る方法を教えてください ここでは<p><a href="./">TOPに戻る</a></p>をポストしたいです <form action = "test_view.php" method = "post" > <input type="text" name="<p><a href="./">TOPに戻る</a></p>"> <input type="submit" name="" value="送信"> </form> よろしくお願いします

    • ベストアンサー
    • PHP
  • postのタイムラグ

    以下のソースでPOSTの値が取れないときがあるので困っています。 具体的にはページを表示してから30秒程度待ってからの クリックじゃないとPOSTの値が取れません。 GETの場合はページ表示後すぐにボタンをクリックしても大丈夫でした。 原因が分からず途方に暮れています。 お知恵をお貸しください。 PHP Version 5.2.3 <?php $P_data = $_POST["pg"]; print("POST=>".$P_data."<BR>"); $G_data = $_GET["pg"]; print("GET=>".$G_data."<BR>"); print <<< DOC_END <html> <head> </head> <body> DOC_END; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=1>"; echo"<input type=submit value=あ>"; echo"</form>"; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=2>"; echo"<input type=submit value=い>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=3>"; echo"<input type=submit value=う>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=4>"; echo"<input type=submit value=え>"; echo"</form>"; print <<< END </body> </html> END; ?>

    • 締切済み
    • PHP
  • postによる、phpとの受け渡し???

    いつもお世話になり誠にありがとうございます。 標記の件。 フロントサイドはブラウザ表示されますが、サーバーサイドは 確認できません。 恐らくはphpが誤っているのでしょう。 質問の仕方が悪いですけど、フロントサイド、サーバーサイド共にソースコードを表示します。 フロントサイドは完璧ではないですけどOKです。 PHPが誤っています。 どうかどこが誤っているか、お教えてください。 下記にコードを表示します。 フロントサイド <!--入力画面--> <form action = "./Blog.php" method = "post"> <label class="label" for="name">お名前(ニックネーム)</label> <center><input id="name" type="text" name="name"></center> <label class="label" for="e-mail">メール</label> <input id="e-mail" type="e-mail" name="e-mail"> <label class="label" for="category">カテゴリー</label> <input id="category" type="category" name="categoryl"> <label class="label" for="message">本文</label> <textarea name="area1" style="color:rgb(8, 8, 8); font-size:100%;" cols="50" rows="30"></textarea><br> <input type="submit" name="confiem" value="確認"> </form> <!--確認画面--> <?php if( $mode == 'input' ){ ?> お名前(ニックネーム)<?php echo $_POST['name'] ?><br> Eメール<?php echo $_POST['e-mail'] ?><br> カテゴリー<?php echo $_POST['message']) ?><br> <input type="submit" name="back" value="戻る" /> <input type="submit" name="send" value="送信" /> <?php } else { ?> <!--完了画面--> <?php } ?> フロントサイドの<form></form>の部分と phpのコードをどうか見比べてください。 どう直せばいいでしょうか? フロントサイドをブラウザで表示し、確認ボタンがクリックされたら 確認画面が表示されるようにしたいのです。 ご多忙中恐れ入ります。 ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP