[ PHP ] POST と GET で同時にデータの受け渡し

Pocket

POST および GET メソッドによる値の受け渡し方法は非常に簡単です。ここでは同時に両方の方法(POST / GET)で値を受け渡すサンプルを掲載しています。

スポンサーリンク

以下の src.html ファイルと dst.php ファイルを作成し、同一ディレクトリに配置します。

src.html

<form action="./dst.php?getkey=getvalue" method="POST">
  <input type="text" name="posttextkey" value="posttextvalue">
  <input type="submit" name="postsubmitkey" value="postsubmitvalue">
</form>

dst.php

<?php 
echo $_GET["getkey"]; 
echo $_POST["posttextkey"]; 
echo $_POST["postsubmitkey"]; 

src.html をブラウザで開き、submit ボタンをクリックすると GET および POST メソッドで渡された値が dst.php に渡されます。

dst.php の表示結果
getvalue
posttextvalue
postsubmitvalue

日本語の入った値を GET / POST メソッドで受け渡す

次に、src.html を変更し日本語の値を受け渡すようにして実行した場合の動作確認を行ってみます。

<form action="./dst.php?getkey=ゲット" method="POST">
  <input type="text" name="posttextkey" value="テキスト">
  <input type="submit" name="postsubmitkey" value="サブミット">
</form>

結果は、以下のように GET メソッドによる方法で文字化けが発生します。

dst.php の表示結果

ゲチE??
テキスト
サブミット

URL に日本語などを含む場合は エンコードさせる必要があります。以下のように src.html をエンコードを行うように修正すると文字化けが解消されます。なお、src.html は PHP スクリプトとして実行させるために拡張子を html から php に変更しています。

修正した src.php

<form action="./dst.php?getkey=<?php echo urlencode("ゲット") ?>" method="POST">
  <input type="text" name="posttextkey" value="テキスト">
  <input type="submit" name="postsubmitkey" value="サブミット">
</form>

src.php を開き submit ボタンをクリックすると dst.php は文字化けが発生することなく表示されるようになります。また、src.php で URL エンコードしたため、dst.php で URL デコードする必要はないのか疑問が出ると思いますが、$_GET メソッド内部ですでに urldecode されているために更にデコード処理の必要はありません。

このときブラウザの URL を確認すると以下のように URL がエンコードされていることが確認できます。(最近のブラウザでは日本語のまま表示させているかもしれません)

http://localhost/dst.php?getkey=%E3%82%B2%E3%83%83%E3%83%88

なお、日本語に限らず半角スペースのように URL として使用できない文字やスラッシュなど URL としてすでに使用方法が決まっているもは GET パラメーターの値として受け渡す場合に URL エンコードが必要となります。

特殊な例として “+” は 半角スペースを URL エンコードした結果であるため、”+” 自体を GET パラメーターとして受け渡すには、エンコードして(%2B)に変換する必要があります。

~~ 余談 ~~

実体験では、oracle の rowid にプラス(+) が入ってくることがあることを忘れていたため、 不具合となって困ったことがあります。

忘れたとか書きましたが、実際は知らなかっただけです。見栄はっちゃいました。。。。。許してください。それが男ってヤツです。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *