$_POST変数はパラメータ名をクォートで囲まなくても使える

$_POST変数はパラメータ名をクォートで囲まなくても使えるということを最近知ったのでメモ。

先日、PHPのソースコードを眺めていたところ、$_POST[1]という記述を見かけた。

$_POSTはHTTPのPOSTメソッドで送られたデータを参照するときに使われる変数だが、大抵のサンプルコードでは以下のようにパラメータ名をダブルクォートやシングルクォートで囲むのが通常である。

$_POST["name"]

対して自分が見かけたコードは1というパラメータ名をクォートで囲んでいなかった。

$_POST[1]

この書き方でもPOSTされたデータを参照できるのか気になったので検証してみた。(ちなみにPHPのバージョンは5.5.9)

以下はPOSTされたデータをそのまま出力するだけの簡単なテスト・プログラムである。

<?php
print(htmlspecialchars($_POST[1], ENT_QUOTES, 'UTF-8'));
?>

以下のcurlコマンドで上記のテスト・プログラムにHello! How are you?というメッセージをHTTPのPOSTリクエストに乗せて送ってみた。

curl -i http://localhost/post-test.php -d "1=Hello! How are you?"

以下はサーバーからの応答である。

$ curl -i http://localhost/post-test.php -d "1=Hello! How are you?"
HTTP/1.1 200 OK
Date: Wed, 08 Feb 2023 13:27:59 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.29
Content-Length: 19
Content-Type: text/html

Hello! How are you?

プログラムがPOSTされたデータを読み取って、レスポンスとして出力しているのが確認できた。

テスト・プログラムの$_POST[1]の部分を$_POST[name]に書き換えて、再度検証してみた。

<?php
print(htmlspecialchars($_POST[name], ENT_QUOTES, 'UTF-8'));
?>
$ curl -i http://localhost/post-test2.php -d "name=Hello! How are you?"
HTTP/1.1 200 OK
Date: Wed, 08 Feb 2023 13:36:45 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.29
Content-Length: 19
Content-Type: text/html

Hello! How are you?

こちらもPOSTされたデータを読み取って、レスポンスとして出力しているのが確認できた。

検証の結果、$_POST変数はパラメータ名をクォートで囲まなくてもデータを参照できることが分かった。

以下のどちらのコードもnameパラメータに渡されたデータを参照できる。

$_POST["name"]
$_POST[name]

ただし、クォートで囲まなかった場合どのような影響が出るのか不明なので、コーディングの際はちゃんとパラメータ名をクォートで囲んだ方が無難と思われる。

Leave a Reply

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