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

はじめに
Web サイトには、「ログイン」「会員登録」「お問い合わせ」「検索」など、ユーザーが情報を入力する場面が数多くあります。
これらの入力した情報は、ブラウザの中だけで処理されるわけではありません。入力した内容は Web サーバーへ送信され、 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 は、ブラウザからサーバーへデータを送る方法が異なります。
ブラウザからサーバーへデータを送る方法にはいくつかありますが、その中でも最もよく使われるのが GET と POST です。重要なのは、「どのようにデータを送るか」という違いです。
GET
GET は、送信するデータを URL の末尾に付け加えてサーバーへ送信します。
💡 例えば GET は、
<https://example.com/search.php?keyword=php>という URL があったとします。この URL の ? より後ろにある keyword=php という部分が送信されたデータです。ブラウザは URL にデータを付けた状態でサーバーへアクセスします。
そのため、検索結果ページを更新しても同じ検索結果を表示できたり、URL をコピーして他の人へ共有できたりします。
POST
一方、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 という変数を自分で作成しています。
<?php
$name = "田中";
echo $name;このように、通常の変数は自分で作成してから利用します。
一方、スーパーグローバル変数は、PHP が自動的に用意してくれるため、自分で作成する必要がありません。
ブラウザから送信されたフォームのデータは、$_GET や $_POST に格納されます。PHP はブラウザから送られてきた HTTP リクエストを解析し、その内容を開発者が扱いやすい形にしてくれます。
なぜスーパーグローバル変数が必要なのか
スーパーグローバル変数がなければ、HTTP リクエストからデータを自分で取り出して解析する必要があります。
GET の場合、例えば次のような URL が送られてきます。
https://example.com/search.php?keyword=php&page=1このデータを利用するには、
?の位置を確認する&でデータを区切る=の前後を分ける- URL エンコードを元に戻す
といった処理が必要になります。
POST の場合も、HTTP リクエスト本文からデータを読み取り、送信形式に応じて解析する必要があります。
そこで PHP は、HTTP リクエストを解析したデータを、開発者がすぐに利用できる形で用意する仕組みを提供しています。それがスーパーグローバル変数です。
HTTP リクエストを PHP が解析した結果を、すぐに利用できる形で提供してくれる仕組み と考えると理解しやすいでしょう。
スーパーグローバル変数が用意される流れ
内部では、次のような流れで処理が行われています。
- ブラウザが HTTP リクエストを送信する
- Web サーバーがリクエストを受け取る
- PHP が実行される
- PHP が HTTP リクエストを解析する
- GET のデータは
$_GETに格納される - POST のデータは
$_POSTに格納される - Cookie の情報は
$_COOKIEに格納される - セッション情報は
$_SESSIONに読み込まれる - サーバー情報は
$_SERVERに格納される - プログラムの処理が始まる
つまり、$_GET や $_POST を使う頃には、PHP がすでに必要な情報を整理しています。そのため、開発者は HTTP の解析処理を自分で書くことなく、用意された変数からデータを取得できます。
スーパーグローバル変数は、PHP が HTTP リクエストから取得した情報を、プログラムから利用しやすい形で提供する仕組みです。PHP のフォーム処理や Web アプリケーション開発では、この仕組みを利用してブラウザから送られてきたデータを扱います。
スーパーグローバル変数 は配列としてデータを管理している
スーパーグローバル変数 のもう一つの特徴は、配列としてデータを管理していることです。
検索フォームから次のデータが送信されたとします。
keyword = php
page = 1PHP はこれらのデータを、それぞれ独立した変数として管理しているわけではありません。代わりに、配列の中へ「キー」と「値」の組み合わせで保存しています。
イメージすると、次のような状態です。
$_GET
├── keyword => php
└── page => 1そのため、keyword の値を取得したい場合は、配列から取り出すように記述します。
<?php
echo $_GET['keyword'];実行結果
phppage を取得したい場合は、キーの名前を変更するだけです。
<?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 でフォーム送信処理を実装してみよう
ここまでで、ブラウザは GET や POST を使ってサーバーへデータを送信し、PHP は スーパーグローバル変数 を使ってそのデータを受け取ることを学びました。ここからは、実際にフォームを作成し、送信されたデータを PHP で受け取る流れを確認していきます。
フォーム送信とは、ユーザーが入力したデータをブラウザからサーバーへ送る仕組みです。この仕組みがあることで、ログインや会員登録、お問い合わせ、検索などの機能を実現できます。
1. 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 で受け取って表示してみましょう。
<?php
$name = $_POST['name'];
echo $name;$_POST は配列なので、$_POST['name'] と書くことで、name というキーに対応する値を取得できます。例えばフォームで「山田 太郎」と入力して送信すると、画面にはそのまま「山田 太郎」と表示されます。
フォーム送信では内部で何が起きているのか
送信ボタンを押すと、ブラウザはフォームに入力された内容をまとめて HTTP リクエストを作成します。そして、action 属性で指定された result.php へリクエストを送信します。
サーバーでは PHP がそのリクエストを受け取り、送信されたデータを解析します。今回は POST で送信しているため、PHP は受け取ったデータを自動的に $_POST へ格納します。その後、プログラムが実行されるため、$_POST['name'] と書くだけで入力された名前を取得できます。
フォームへ入力
│
▼
送信ボタンを押す
│
▼
ブラウザが HTTP リクエストを送信
│
▼
PHP がリクエストを解析
│
▼
$_POST にデータを格納
│
▼
プログラムで値を取得
このように、フォーム送信は HTML がデータを送信し、HTTP がデータを運び、PHP が スーパーグローバル変数 に格納するという流れで実現されています。この仕組みを理解しておくと、今後ログイン機能やお問い合わせフォームなどを作成するときも、「ブラウザから送られてきたデータを PHP が受け取って処理している」という共通の考え方で理解できるようになります。
理解度チェック
学んだ内容を確認してみましょう。各問題の選択肢から正しい答えを選んでください。
フォームで POST メソッドを使用した場合、送信されたデータはどのスーパーグローバル変数で取得しますか。
フォームで入力した値を PHP に送信するとき、PHP が値を識別するために使用する属性はどれですか。
次のうち、フォームで入力された name の値を取得するコードはどれですか。
次の処理のうち、フォーム送信後にユーザーへ入力内容を表示するコードとして正しいものはどれですか。