• ベストアンサー

特殊文字をPOSTした際の動作は?

特殊文字はPOSTした際、「"」は「%22」などに内部でURLエンコードされ、受け取り元では元の文字にURLでコードされているはずですが、これに絡んだ動作がいまいち理解しきれないので、お教え願えればと思います。 フォームで、テキストエリアに「"」などを入力してPOSTし確認表示させる際に、HTML出力する際に最終の処理をするCGIへPOSTするために「hidden」属性でPOSTするためのデータを持たせています。 ただ、そのままだと <input type="hidden" name="xxx" value="""> となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「"」に置換して <input type="hidden" name="xxx" value="""> としています。 これをPOSTした際、受け取り元でデータを見ると、予想ではそのまま「"」となっているはずでしたが、なぜかちゃんと「"」に戻されています。 ほかの「&」なども同様でした。 これは、正常なのでしょうか? 自分は、POSTされたものは受け取り先でもそのまま「"」だと思っていたので、「"」を元の「"」に置換する処理を入れていたのですが・・・ 基本的なことだと思いますが、よろしくお願いいたします。

  • Perl
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

質問文内の実体参照(&quot; や &amp;)が元の文字に戻されてしまったようですね。(これはここのサイトに昔からあるバグです。) 本題ですが、実体参照はブラウザ内では「参照文字そのもの」として扱われますので、&quot; は " として %22 にエスケープされてから送信されます。 この変換は送信メソッド(POST、GET)には関係なく行われます。

qoozy257
質問者

お礼

あ!勘違いしていたことに今気づきました。 POSTなどで変換するのはサーバ側ではなく、ブラウザ側でしたね(^^ゞ Dpopさんがおっしゃっていたのはこのことですね・・・ だから、受け取り側ではPOST・GETにかかわらずURLでコードしなければならないと。 これですべてすっきりしました。 ただ、ブラウザによっては変換しないものもあるんでしょうか?

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

> ブラウザによっては変換しないものもあるんでしょうか? 実体参照の変換(例:&quot; → " )は、どのブラウザでも必ず行われます。(これはブラウザがHTMLを受け取った時点で変換されます。) また、送信時に行われるエスケープ処理( " → %22 )も、ブラウザによらず必ず行われます。

qoozy257
質問者

お礼

何度も、ご丁寧にありがとうございます。 これで、すべてすっきりしました。 基本的なことを忘れずにこれからもPerlに励みます。 本当にありがとうございました。

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

Web屋です。OkWebの様なサイトを作る仕事をしています。 うーん。遣りたい事が今ひとつ良く分かりません。 「"」を送りたいのであれば、送る側でURLエンコードをしてから送り、受け取った方でURLデコードを実行しましょう。 「"」を送ると「%22」に自動的に変換される。と書かれていますが、これは全てのサーバーでこの様な動作をする。と言う保障は無い様な気がします。 ついでに、変換されるのはGETの時かと。 > となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「"」に置換して 1番目の「"」と、2番目の「"」は同じ文字では無いですか? これでは変換している意味は無いですよね?

qoozy257
質問者

お礼

leaz024さんのご指摘で、勘違いしていることに気づきました。 変換するのは、サーバ側ではなくブラウザ側でした。 ありがとうございました。

qoozy257
質問者

補足

今まで私が使ったサーバは、POSTのときURLエンコードしてくれていたようなので・・・勘違いだったのかもしれませんが。 もちろん、GETの時は自分でURLエンコード・デコードする処理を入れています。 >1番目の「"」と、2番目の「"」は同じ文字では無いですか? すみません、これは質問を書き間違えてました。 正しくは、 となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「&quot;」に置換して <input type="hidden" name="xxx" value="&quot;"> としています。 です(&は半角のアンパサンドです)。 どうやら、質問文でアンパサンドも半角で書いたため、HTML表示のときに「"」になってしまっていました。 この「hidden」属性の値がPOSTされた際、「&quot;」となっていると思ったのですが、「"」となっているのです。

関連するQ&A

  • formでsubmitの代わりに画像を使ったとき、POSTできるか

    表題の件で質問です。 どちらかというとHTMLよりな質問になりますが、受け取り側がPHPなのでこちらで質問させていただきます。 まず <form action="受け取りのURL" method="post"> <input type="image" src="....gif" name="image"> <input type="hidden" name="data" value="渡すデータ"> </form> として、受け取りに、 <? $data=$_POST["data"]; printなりの処理; //あるいは if(isset($_POST["image"])) { $data=$_POST["data"]; printなりの処理; } ?> としますが、受け取りURLにとんでもうまくPOSTでデータが渡りません。 type="iamge" を type="submit"に変えればPOSTされます。 submitの代わりにイメージ画像を使うと、POSTできないのでしょうか。

    • ベストアンサー
    • PHP
  • POSTデータのNAME属性をVALUEによって取得する方法

    HTML→PHPのPOSTデータのやりとりについて、 【HTML】 <form name="form1" method="post" action="xxx.php"> <input name="01" type="text" value="1"> <input name="02" type="text" value="0"> <input name="03" type="text" value="0"> <input name="04" type="text" value="1"> <input type="submit" name="Submit" value="送信"> </form> 【xxx.php】 フォームから送信されたデータを使って、「value」が"1"の「name」を拾うのにはどのように書けばいいでしょう? ↓このように取得したいです。 $data[0]="01"; $data[1]="04"; よろしくお願いします。

    • ベストアンサー
    • PHP
  • for文でpostの値を受け取る方法

    以下のようなコードで、postで投げられた値を、for文で、添え字を組み立てて受け取って表示したいのですが、添え字の生成が間違っているのか、うまくいきません。 何を修正すればよいか教えてください。 <form action="" method="post"> <input type="hidden" value="A" name="name_0"> <input type="hidden" value="B" name="name_1"> <input type="hidden" value="C" name="name_2"> <input type="hidden" value="D" name="name_3"> <input type="submit"> </form> <?php for($i =0; $i < 4; $i++){ if (!empty($_POST['name_$i'])) { print $_POST['name_$i']; } } ?>

    • ベストアンサー
    • 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
  • 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
  • 携帯用アンケートページを作成したけど、携帯によってエラーがでてしまう。

    携帯用ページを作成したのですが、機種によりエラー(「ページが表示できません」か「Forriden」)がでてしまいます。全キャリア共通で使いたいのでおかしい部分がありましたら教えてください。よろしくお願いします。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS"><meta http-equiv="Content-Style-Type" content="text/css"><TITLE>xxx</TITLE></HEAD> <BODY><form method="post" action="/cgi-bin/xxx.cgi"> <br>性別<br><input type="radio" name="rc_seibetu" value="男" checked>男<br><input type="radio" name="rc_seibetu" value="女">女<input name="cc_seibetu" type="hidden" value="性別"> <br>キャリア<br><input type="radio" name="rc_com" value="ドコモ" checked>ドコモ<br><input type="radio" name="rc_com" value="voda">voda<br><input type="radio" name="rc_com" value="au">au<br><input type="radio" name="rc_com" value="Tu-Ka">Tu-Ka<input name="cc_com" type="hidden" value="キャリア"> <br>機種<br><input name="oa_kisyu" type="text" value="例)xxx" size="14"><input name="cc_kisyu" type="hidden" value="機種"> <textarea name="oa_body">ご要望</textarea><input name="cc_body" type="hidden" value="ご要望"> <br><INPUT NAME="oa_mailtitle" TYPE="hidden" VALUE="xxx"><INPUT NAME="om_mailto" TYPE="hidden" VALUE="xxx@xxx.co.jp"><INPUT NAME="oh_page_confirm" TYPE="hidden" VALUE="cm_confirm"><INPUT NAME="oh_errpage_nodata" TYPE="hidden" VALUE="cm_nodata"><input type="submit" value="送信"><br></form></BODY>

    • 締切済み
    • CGI
  • JavaScriptにおいてPOSTで送信されたデータを取得出来ますか

    <form action="自分" method="POST"> <input type="hidden" name="abc" value="1"> <input type="submit" name="OK" value="OK"> </form> 上記のように、POST渡しで送信したとき、Javascriptにて、hiddenのデータを取得することができるのでしょうか? 出来るのであればその方法を教えてくださいませんか。 よろしくお願いします。

  • POST からの受け渡しができません・・・

    教えてくださいm(__)m <FORM action="<? echo $PHP_SELF; ?>" method="POST"> :(ここにはif文がはいっています。) : print "お名前:<BR>\n"; print "<input type=\"text\" name=\"handle\" size=\"16\" maxlength=\"30\" value=\"<? echo ($handle); ?>\"><br><br>\n"; print "性別:<BR>\n"; for (reset ($sex_tbl); $key = key ($sex_tbl); next ($sex_tbl)) { echo (" <OPTION value=\"" . $key . "\""); if ($key == $sex) echo (" SELECTED"); echo (">" . $sex_tbl[$key] . "\n"); } print "PRポイント:<BR>\n"; print "<input type=\"text\" name=\"pr\" size=\"16\" maxlength=\"30\" value=\"<? echo ($pr); ?>\"><br><br>\n"; print "<CENTER><input type=\"submit\" value=\"次の人!\"></CENTER><br>\n"; print "<input type=\"hidden\" name=\"page\" value=\"kekkapage\">\n"; print "<input type=\"hidden\" name=\"handle\" value=\"" . $_POST['handle'] . "\">\n"; print "<input type=\"hidden\" name=\"sex\" value=\"" . $_POST['sex'] . "\">\n"; print "<input type=\"hidden\" name=\"pr\" value=\"" . $_POST['pr'] . "\">\n";←80 </FORM> : : ↑なのですが、 「・・・on line 80」エラー表示になりうまくいきません。 の部分が原因と表示にはなっているのですが…。 助けてください。 宜しくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • フォームよりCGIへ複数の値をPOSTしたい…。

    はじめまして。 現在、ショッピングカートのCGIを利用するためにHTMLを調整しています。 【単一商品の場合】 <FORM action="cgi-bin/cart/cart.cgi" method="POST"><INPUT type="hidden" name="shouhinnumber" value="0001"><INPUT type="hidden" name="shouhinmei" value="高級シャンプー"><INPUT type="hidden" name="kakaku" value="3000"> あとはセレクトフォームで数を選択して送信すれば正常に料金計算されるのですが、これが、内容量によって料金が異なる場合、どのようにHTMLを組めばよろしいのでしょうか。 ラジオボタンでそれぞれの行にINPUTを入れたが、先頭のINPUTしか認識せず、フォーム文を複数作るとマージンが空き、複数選択が可能になってしまう。 なお、CGIをいじるのは危険なので、HTML内でどうにかしたい・・・。 つまり・・・ 高級シャンプーの 260mlが1800円 500mlが3000円 というように単一商品名で代金が異なるものを1つのフォーム内でCGIへ送信できないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • formでPOSTするのと同じ動作をボタンとjavascriptで実現したいのですが

    <form name="myFORM" method="POST" action="xxx.php"> <input type="text" name="NAME"> <input type="submit" value="送信"> </form> 上記と同じ動作を <button onclick="fpost('tanaka','POST','xxx.php')">送信</button> とjavascriptで実現したいのですが可能でしょうか? 可能でしたらどのようなスクリプトになりますでしょうか? document.myFORM.submit();とかではなく、formタグを全く使わずPOSTしページ遷移したいのですが。 XMLHttpRequestとlocation.replace()とかでできるのでしょうか?? すみませんがよろしくお願い致します。

専門家に質問してみよう