Blog Article
PHP のフォーム送信を理解しよう! GET ・ POST ・ スーパーグローバル変数 の基礎からフォーム処理まで徹底解説

はじめに
Web サイトには、「ログイン」「会員登録」「お問い合わせ」「検索」など、ユーザーが情報を入力する場面が数多くあります。
例えば、お問い合わせフォームでは名前やメールアドレスを入力し、検索ページでは検索したいキーワードを入力します。これらの入力した情報は、ブラウザの中だけで処理されるわけではありません。入力した内容は Web サーバーへ送信され、 PHP が受け取って処理を行います。
この「ブラウザからサーバーへ情報を送る仕組み」を理解するために欠かせないのが、 GET、 POST、そして スーパーグローバル変数 です。
PHP を学び始めたばかりの方は、
- 「 GET と POST の違いが分からない」
- 「なぜ
$_GETや$_POSTが存在するのか分からない」 - 「フォーム送信の仕組みがよく分からない」
という疑問を持つことが少なくありません。しかし、これらは PHP を使った Web アプリケーション開発では毎日のように使う知識です。
この記事では、単にコードを書くだけではなく、「なぜその仕組みが必要なのか」「内部では何が起きているのか」まで順番に説明していきます。
この記事を読み終える頃には、次の内容を説明できるようになることを目標としています。
- GET と POST の違い
- スーパーグローバル変数 が何なのか
$_GET、$_POST、$_SERVER、$_SESSION、$_COOKIEの役割- PHP で簡単なフォーム送信処理を書く方法
参考にしたリンク
- https://www.php.net/manual/ja/reserved.variables.php
- https://www.php.net/manual/ja/tutorial.forms.php
- https://developer.mozilla.org/ja/docs/Learn_web_development/Extensions/Forms/Sending_and_retrieving_form_data
ブラウザからサーバーへ情報を送る仕組みを理解しよう
PHP はサーバー側で動作するプログラミング言語です。つまり、ブラウザに表示されている画面の中で PHP が動いているわけではありません。
例えば、お問い合わせフォームで次のように入力したとします。
- 名前 : 山田太郎
- メールアドレス : test@example.com
入力が終わり、「送信」ボタンを押した瞬間、ブラウザは入力された内容をまとめて Web サーバーへ送信します。サーバーはその情報を受け取り、 PHP を実行します。
PHP は受け取ったデータを利用して、
- データベースへ保存する
- メールを送信する
- 計算する
- ログイン判定を行う
など、さまざまな処理を実行します。
つまり、フォーム送信とは「ブラウザからサーバーへデータを届ける仕組み」のことです。もしこの仕組みが存在しなければ、ユーザーが入力した名前やパスワードを PHP が知る方法はありません。
PHP はサーバー側で動いているため、ブラウザの入力欄を直接見ることはできないからです。そのため、「入力内容をサーバーへ送る」という処理が必要になります。
内部では次のような流れで処理が行われています。
- ユーザーがフォームへ入力する
- 「送信」ボタンを押す
- ブラウザが HTTP リクエストを作成する
- サーバーへ送信する
- PHP がリクエストを受け取る
- PHP が処理を実行する
- HTML を返す
- ブラウザが画面を表示する
この一連の流れを理解しておくと、これから学ぶ GET や POST が何のために存在しているのかが分かりやすくなります。
GET と POST はデータを送る方法の違い
ブラウザからサーバーへデータを送る方法にはいくつかありますが、その中でも最もよく使われるのが GET と POST です。一言でいうと、どちらも「ブラウザからサーバーへデータを送る HTTP メソッド」です。
重要なのは、「どのようにデータを送るか」という違いです。GET は、送信するデータを URL の末尾に付け加えてサーバーへ送信します。
例えば、
<https://example.com/search.php?keyword=php>という URL があったとします。この URL の ? より後ろにある
keyword=phpという部分が送信されたデータです。
ブラウザは URL にデータを付けた状態でサーバーへアクセスします。そのため、検索結果ページを更新しても同じ検索結果を表示できたり、 URL をコピーして他の人へ共有できたりします。
一方、 POST は URL にデータを付けません。送信するデータは HTTP リクエストの本文に格納され、サーバーへ送られます。
そのため、住所やパスワード、メールアドレスなどのように URL に表示したくない情報を送る場合は POST が使われます。
ここで注意したいのは、「 POST は暗号化される」という意味ではありません。POST は URL に表示されないだけであり、通信自体を安全にするのは HTTPS の役割です。
つまり、
- GET は URL にデータを付けて送る
- POST はリクエスト本文にデータを入れて送る
という違いがあります。
内部では、ブラウザがフォームの method 属性を確認し、その値が get なら URL にデータを付加し、 post なら HTTP リクエスト本文へ格納して送信します。サーバー側では、送られてきた HTTP リクエストを PHP が解析し、送信方法に応じて $_GET または $_POST にデータを格納します。
つまり、 PHP はフォームの入力欄を直接見ているわけではありません。
ブラウザが送信した HTTP リクエストを受け取り、その中に含まれるデータを取り出しやすいように スーパーグローバル変数 に用意してくれているのです。
だからこそ、「 GET と POST は単なる書き方の違い」ではなく、「ブラウザがサーバーへデータを送る方法そのものの違い」と理解することが重要です。
スーパーグローバル変数 とは何かを理解しよう
ここまでで、ブラウザは GET や POST を使ってサーバーへデータを送信することが分かりました。
では、サーバーへ送られてきたデータは、PHP のプログラムからどのように取得するのでしょうか。その役割を担っているのが スーパーグローバル変数 です。
一言で言うと、スーパーグローバル変数 とは PHP があらかじめ用意している特別な変数 のことです。
通常、PHP では変数を使う前に自分で作成する必要があります。
例えば、次のコードでは name という変数を自分で作成しています。
ファイル名:sample.php
<?php
$name = "田中";
echo $name;このように、通常の変数は自分で作成しなければ存在しません。
一方、スーパーグローバル変数 は違います。PHP がプログラムの実行開始時に、自動的に用意してくれる特別な変数です。
そのため、自分で作成しなくても最初から利用できます。
例えば、ブラウザから送信されたフォームのデータは、自動的に $_GET や $_POST の中へ格納されています。つまり、PHP はブラウザから送られてきた HTTP リクエストを解析し、その内容を開発者が扱いやすい形へ変換してくれているのです。
もし スーパーグローバル変数 が存在しなかったらどうなるでしょうか。ブラウザから送られてきた HTTP リクエストは、文字列として送信されます。
例えば、 GET の場合は次のような URL が送られてきます。
<https://example.com/search.php?keyword=php&page=1>PHP は、この URL を受け取っただけでは、どこがデータなのか分かりません。
そのため、
?の位置を探す&で区切る=の前後を分割する- URL エンコードを元に戻す
といった処理を毎回自分で書かなければならなくなります。POST の場合はさらに大変です。HTTP リクエスト本文の中からデータを読み取り、送信形式に応じて解析しなければなりません。このような処理は、フォームを作るたびに必要になるため非常に面倒です。
そこで PHP は、「受け取ったデータを最初から配列へ整理しておこう」という仕組みを用意しました。それが スーパーグローバル変数 です。つまり、スーパーグローバル変数 は単なる便利な変数ではありません。
HTTP リクエストを PHP が解析した結果を、すぐに利用できる形で提供してくれる仕組み と考えると理解しやすいでしょう。
内部では、次のような流れで処理が行われています。
- ブラウザが HTTP リクエストを送信する
- Web サーバーがリクエストを受け取る
- PHP が実行される
- PHP が HTTP リクエストを解析する
- GET のデータは
$_GETに格納する - POST のデータは
$_POSTに格納する - Cookie の情報は
$_COOKIEに格納する - セッション情報は
$_SESSIONに読み込まれる - サーバー情報は
$_SERVERに格納される - プログラムの処理が始まる
つまり、あなたが $_GET や $_POST を使う頃には、PHP がすでに必要な情報を整理し終えているのです。そのため、開発者は複雑な HTTP の解析処理を書くことなく、配列から値を取り出すだけでデータを利用できます。
だからこそ、スーパーグローバル変数 は PHP のフォーム処理や Web アプリケーション開発において欠かせない存在なのです。
スーパーグローバル変数 は配列としてデータを管理している
スーパーグローバル変数 のもう一つの特徴は、配列としてデータを管理していることです。
例えば、検索フォームから次のデータが送信されたとします。
keyword = php
page = 1PHP はこれらのデータを、それぞれ独立した変数として管理しているわけではありません。
代わりに、配列の中へ「キー」と「値」の組み合わせで保存しています。
イメージすると、次のような状態です。
$_GET
├── keyword => php
└── page => 1そのため、keyword の値を取得したい場合は、配列から取り出すように記述します。
ファイル名:search.php
<?php
echo $_GET['keyword'];実行結果
phppage を取得したい場合は、キーの名前を変更するだけです。
ファイル名:search.php
<?php
echo $_GET['page'];実行結果
1このように、スーパーグローバル変数 は通常の配列と同じような書き方でデータを取得できます。これは、送信されるデータの数が毎回変わる可能性があるためです。
例えば、お問い合わせフォームでは名前・メールアドレス・件名・本文を送信するかもしれません。
一方、検索フォームでは検索キーワードだけを送信することもあります。もし PHP が固定の変数だけで管理していたら、送信項目が増えるたびに新しい変数を用意しなければなりません。
しかし、配列で管理していれば、送信される項目が増えても、その分だけキーが追加されるだけです。この仕組みによって、フォームの種類が変わっても柔軟にデータを扱えるようになっています。
だからこそ、$_GET['keyword'] や $_POST['email'] のような書き方になっているのです。
「配列だからこの書き方になる」のではなく、「送られてくるデータの数や内容が毎回変わるため、配列で管理するのが最も適している」と理解すると、今後さまざまなフォームを作成するときにも応用しやすくなります。
よく使う スーパーグローバル変数 の役割を理解しよう
PHP には複数の スーパーグローバル変数 が用意されていますが、初学者が最初に覚えるべきものは次の 5 つです。
スーパーグローバル変数 | 主な役割 |
|---|---|
| GET で送信されたデータを取得する |
| POST で送信されたデータを取得する |
| サーバーやリクエストに関する情報を取得する |
| セッションに保存したデータを取得する |
| Cookie に保存されたデータを取得する |
これらはすべて「何らかの情報を取り出す」という点では共通していますが、取得する情報の種類が異なります。$_GET と $_POST は、ユーザーがフォームから送信したデータを取得するために使用します。
例えば、検索フォームで入力されたキーワードや、ログイン画面で入力されたユーザー名・パスワードなどが対象です。
$_SERVERはユーザーが入力した情報ではありません。現在アクセスしている URL、使用している HTTP メソッド、ブラウザの情報など、リクエストそのものやサーバーの状態に関する情報が格納されています。$_SESSIONは、一時的にユーザーごとの情報を保存しておくために使用します。例えば、ログインに成功したユーザーの情報を保存しておくことで、別のページへ移動しても「このユーザーはログイン済みである」と判定できます。
$_COOKIEは、ブラウザに保存されている情報を取得するために使用します。「ログイン状態を一定期間保持する」「前回選択した表示設定を記憶する」といった機能で利用されることがあります。
このように、すべて同じ スーパーグローバル変数 ではありますが、それぞれ担当している役割は異なります。
重要なのは、「どの スーパーグローバル変数 を使うか」は、どこから送られてきた情報なのかによって決まるということです。ブラウザから GET で送信されたなら $_GET、POST なら $_POST、Cookie に保存された情報なら $_COOKIE というように、情報の保存場所や送信方法に応じて使い分けます。
だからこそ、スーパーグローバル変数 を暗記するのではなく、「どの情報を取得するための変数なのか」という役割で理解しておくことが、PHP を学習していく上で非常に重要です。
PHP でフォーム送信処理を実装してみよう
ここまでで、ブラウザは GET や POST を使ってサーバーへデータを送信し、PHP は スーパーグローバル変数 を使ってそのデータを受け取ることを学びました。ここからは、実際にフォームを作成し、送信されたデータを PHP で受け取る流れを確認していきます。
フォーム送信とは、一言で言うとユーザーが入力したデータをブラウザからサーバーへ送る仕組みです。この仕組みがあることで、ログインや会員登録、お問い合わせ、検索などの機能を実現できます。PHP は入力欄を直接見ているわけではなく、ブラウザから送られてきた HTTP リクエストを受け取り、その内容を $_GET や $_POST に格納しています。そのため、私たちは スーパーグローバル変数 から値を取得するだけで、入力内容を利用できます。
HTML でフォームを作成する
まずは、ユーザーが名前を入力するフォームを作成してみましょう。
ファイル名:form.html
<form action="result.php" method="post">
<label for="name">名前</label>
<input type="text" id="name" name="name">
<button type="submit">送信</button>
</form><form> タグは、フォーム全体を表します。action 属性には送信先のファイルを指定し、この例では result.php にデータを送信します。また、method="post" は POST メソッドでデータを送信することを意味しています。
ここで特に重要なのが name 属性です。PHP は id を見てデータを受け取るのではなく、name の値をキーとして受け取ります。そのため、この入力欄に入力された内容は、name という名前で送信されます。
PHP で送信されたデータを受け取る
次は、送信されたデータを PHP で受け取って表示してみましょう。
ファイル名:result.php
<?php
$name = $_POST['name'];
echo $name;$_POST は配列なので、$_POST['name'] と書くことで、name というキーに対応する値を取得できます。例えばフォームで「山田 太郎」と入力して送信すると、画面にはそのまま「山田 太郎」と表示されます。
実際のアプリケーションでは、取得したデータを表示するだけではありません。データベースへ保存したり、ログイン認証を行ったり、メールを送信したりと、さまざまな処理に利用します。まずは「フォームで送信した値を PHP が取得できる」という基本を理解することが大切です。
フォーム送信では内部で何が起きているのか
送信ボタンを押すと、ブラウザはフォームに入力された内容をまとめて HTTP リクエストを作成します。そして、action 属性で指定された result.php へリクエストを送信します。
サーバーでは PHP がそのリクエストを受け取り、送信されたデータを解析します。今回は POST で送信しているため、PHP は受け取ったデータを自動的に $_POST へ格納します。その後、プログラムが実行されるため、$_POST['name'] と書くだけで入力された名前を取得できます。
フォームへ入力
│
▼
送信ボタンを押す
│
▼
ブラウザが HTTP リクエストを送信
│
▼
PHP がリクエストを解析
│
▼
$_POST にデータを格納
│
▼
プログラムで値を取得
このように、フォーム送信は HTML がデータを送信し、HTTP がデータを運び、PHP が スーパーグローバル変数 に格納するという流れで実現されています。この仕組みを理解しておくと、今後ログイン機能やお問い合わせフォームなどを作成するときも、「ブラウザから送られてきたデータを PHP が受け取って処理している」という共通の考え方で理解できるようになります。
理解度チェック
学んだ内容を確認してみましょう。各問題の選択肢から正しい答えを選んでください。
フォームで POST メソッドを使用した場合、送信されたデータはどのスーパーグローバル変数で取得しますか。
フォームで入力した値を PHP に送信するとき、PHP が値を識別するために使用する属性はどれですか。
次のうち、フォームで入力された name の値を取得するコードはどれですか。
次の処理のうち、フォーム送信後にユーザーへ入力内容を表示するコードとして正しいものはどれですか。