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