外部からの変数:$_GETと$_POST
$_GETと$_POST
ご存知の方も多いでしょうが、ブラウザからの要求には「GETメソッド」という要求と「POSTメソッド」という要求の2種類があります。HTMLからスクリプトに要求を出す1つの手段として<form>タグが挙げられます。<form>にはmethod属性というものがあり、<form
method="get">や<form method="post">などとすると思いますが、このmethod属性の部分が「どちらのメソッドで要求を出すか」を決定する属性です。
PHPがフォームからの要求を受けた場合、GETメソッドで要求を受けたら$_GET、POSTメソッドで要求を受けたら$_POSTという変数に連想配列として格納されます。$_GETと$_POSTの違いは次のページでやりますので、今はちょっと片隅に置いておいて頂いて、とにかくフォームからの値をmethod属性の値によって$_GETか$_POSTという連想配列で受け取れる、と覚えて下さい。
配列のキーとしては<form>の各部品の名前、つまりname属性の値が格納され、値として各部品の値、つまりvalue属性の値を持ちます。
各部品というのは<input>だとか<select>だとかのフォーム部品になるわけですが、ここで説明をしていると無意味に長くなるので割愛します。優秀なHTMLサイトがたくさんありますのでフォーム部品についてはそちらで調べて下さい。HTMLタグについてはHTMLの知識になりますのであまり細かく説明しません。入力フォームの処理をするのには<form>関連のタグは必須ですのでこの機会に覚えてきて下さいね。
さて、各部品の名前と言っても分かりにくいと思いますのでまずは簡単なフォームのHTMLをご覧下さい。
<form action="" method="POST">
<input type="submit" name="sub" value="GO" />
</form>このフォームの部品<input>にアクセスするためのPHPスクリプトが以下のサンプルのようになります。<form>のメソッド(method)をPOSTとしたので$_POSTの配列に格納され、部品(ここでは<input>)のname属性の値がキーとなります。
- $_POST["sub"];
上記の連想配列に入っている値は<input>のvalue属性の値となります。分かりにくいと思うので出力してみますが、出力結果には最初は何も表示されていないと思います。これは実際にPOSTとしてPHPスクリプトに値が渡されていないからです。
- print $_POST["sub"];
出力結果
上記のフォームからPHPに値を渡すためには、実際にフォームのボタンをクリックしないと渡せません。まだボタンを押してない状態なので上記の$_POST["sub"];には値が何も入っていないわけです。さっきのフォーム部品を置いておきますので、クリックしてみて、出力結果をご覧下さい。
クリックすると「出力結果」のところに$_POST["sub"]の値、つまり部品のvalue属性の値が表示されたと思います。
混乱しやすいと思うので、クリックという動作によって何が起こってるか見てみます。
- ユーザがボタンをクリック
<form>に指定されているメソッド(ここではPOST)でPHPに値が渡される。- PHPが自動的に$_POSTという連想配列にキーと値を格納してくれる。
- 格納されてる値をprint()
上記の流れは細かい部分をだいぶはしょってます。いきなり細かい話をどうのこうのと言っても混乱させるだけなのでこの辺の理解は後でいいです。これ以上の話はフォーム処理のあたりで嫌でも覚えてもらうので、今のところは$_GETと$_POSTでフォームの値を取得できるというのだけ理解しておいて下さい。
<form method="GET">にした場合は$_GET['sub']でアクセスできる事になります。PHPではこのように$_GETや$_POSTの変数(配列)を使って簡単にフォームの値にアクセスする事ができます。
次のページで$_GETと$_POSTの違いについて説明しますが、その前にサーバ変数についてでも説明したregister_globals関連の注意点があります。$_SERVERとまるっきり同じ注意になりますので、分かってる方は読み飛ばしてどんどん次に進んで下さい。
register_globalsによる違い
$_GETや$_POSTもサーバ変数と同様に、register_globals値の影響を受けます。PHP4.2.0以降、PHPの設定(php.ini)で「register_globals」という値のデフォルト値が「OFF」に変更されました。この設定がONになっていれば、$_GET['name']や$_POST['name']ではなく、単に$nameとすれば使えます。
例えば上記のスクリプトも$_POST['sub']ではなく、単に$subとすれば使えます。
とても便利なのですが、register_globalsがOFFになったのはセキュリティ上の理由によるらしいです。旧バージョンとの互換性を考えてregister_globalsの値をONとしてくれているサーバも存在しますが、セキュリティ上とても危険だという事なので、ご自分で設定できる場合はデフォルト値のOFFとしておいて、ちゃんと$_GETや$_POSTなどとして使うのをお勧めします。
register_globalsの値はphpinfoなどで確認できますので、確認しておいて下さい。phpinfo()で出力される情報の「Configuration」に載ってるはずです。





