PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
新人
「PHPでフォームのデータを受け取るにはどうすればいいですか?」
先輩
「フォームとは、ユーザーからの入力を受け取るための仕組みのことだよ。まずはフォームについて説明しよう!」
1. フォームとは?
フォームとは、Webページ上でユーザーが文字を入力したり、選択をしたりして、その内容をサーバーに送信するための仕組みです。ログイン画面やお問い合わせフォーム、検索フォームなど、身近な場面で幅広く使われています。まずは「ユーザーの入力を受け取る箱」のようなものだと考えるとイメージしやすいでしょう。
HTMLでフォームを作成するには、<form>タグを使います。フォームには送信先を指定する action 属性と、送信方法を決める method 属性があります。以下は最も基本的なフォームの例です。
<form action="process.php" method="post">
<label for="name">名前:</label>
<input type="text" id="name" name="name">
<button type="submit">送信</button>
</form>
このフォームでは、ユーザーが入力した「名前」が name というキーで送信され、process.php にデータが渡されます。フォームはユーザーとサーバーの間で情報をやり取りする基本的な仕組みなので、まずはこの動きだけしっかり理解しておくと、後の学習がとてもスムーズになります。
簡単に動きを確認したい場合は、次のような非常にシンプルな受け取り用ファイルを用意すると、フォームの仕組みがつかみやすくなります。
<?php
// process.php
if (isset($_POST["name"])) {
echo "受け取った名前は「" . htmlspecialchars($_POST["name"], ENT_QUOTES, 'UTF-8') . "」です。";
}
?>
このように、フォームはユーザーの情報をサーバー側へ送るための基本的な入り口です。まずは「入力 → 送信 → 受け取って表示」という流れをつかむところから始めてみましょう。
2. PHP でフォームのデータを受け取る方法($_POST と $_GET の違い)
フォームから送られたデータは、PHP の $_POST または $_GET を使って受け取ります。どちらも「ユーザーが入力した値を取り出す」ための仕組みですが、使い方や特徴が少し違います。ここでは、初心者でもイメージしやすいように、具体例を交えて説明します。
$_POST を使ったデータの受け取り
method="post" は、入力内容を URL に含めずに送信する方法です。送られたデータは外から見えないため、ログイン情報などの扱いに向いています。まずは、簡単なサンプルで流れを確認してみましょう。
<?php
// POSTで送信されたデータを受け取る例
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$name = $_POST["name"];
echo "受け取ったお名前は「" . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "」です。";
}
?>
POST では、ユーザーがフォームに入力した値が「見えない形」で送られるため、安心して扱えるのが特徴です。
$_GET を使ったデータの受け取り
method="get" を使うと、送信されたデータが URL に表示される形で送られます。検索フォームなど、URL を共有したい場合に便利です。以下のフォームを送信すると動作がよく分かります。
<form action="process.php" method="get">
<label for="name">名前:</label>
<input type="text" id="name" name="name">
<button type="submit">送信</button>
</form>
このフォームを送信すると、process.php?name=〇〇 のように URL にデータが表示されます。
<?php
// GETで送信されたデータを受け取る例
if ($_SERVER["REQUEST_METHOD"] === "GET") {
$name = $_GET["name"];
echo "URLから受け取った名前は「" . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "」です。";
}
?>
値が URL に見えるため、入力内容を確認しやすい反面、パスワードなどのデリケートな情報には使わないよう注意が必要です。
$_POST と $_GET の違い
| 特徴 | $_POST | $_GET |
|---|---|---|
| データの送信方法 | HTTPリクエストのボディに含める(外から見えない) | URLのクエリパラメータとして送信(外から見える) |
| URL に表示されるか | 表示されない | 表示される |
| セキュリティ | 比較的安全(パスワード向き) | 低い(URLで内容が確認できる) |
| データ量の制限 | 大きなデータも送れる | URL の長さに制限がある |
例えばログイン画面のように「見えないほうが安心な情報」は $_POST、検索フォームのように「URL に残っても便利な情報」は $_GET を使う、と覚えると判断しやすくなります。
3. $_POST を使ったデータの受け取り(フォームから送信されたデータの取得方法)
$_POST を使用すると、フォームから送信されたデータをサーバー側で処理できます。以下の手順で、実際にデータを受け取る方法を見ていきましょう。
基本的なフォームの作成
まず、以下のようなフォームを作成します。
<form action="process.php" method="post">
<label for="username">ユーザー名:</label>
<input type="text" id="username" name="username">
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email">
<button type="submit">送信</button>
</form>
PHP でのデータ受け取り
このフォームを送信すると、入力されたデータは process.php に送信されます。PHP でデータを取得する方法を見てみましょう。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST['username'];
$email = $_POST['email'];
echo "ユーザー名:" . htmlspecialchars($username, ENT_QUOTES, 'UTF-8') . "<br>";
echo "メールアドレス:" . htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
}
?>
このコードでは、フォームのデータを $_POST を使って取得し、HTMLエスケープを行いながら表示しています。
4. $_GET を使ったデータの受け取り(URL パラメータの取得方法)
$_GET は、URL のクエリパラメータを使ってデータを送信する方法です。例えば、検索機能やフィルタリングなどに適しています。
基本的な GET フォームの作成
以下のフォームでは、データを URL に含めて送信します。
<form action="search.php" method="get">
<label for="query">検索キーワード:</label>
<input type="text" id="query" name="query">
<button type="submit">検索</button>
</form>
例えば、「PHP」と入力して送信すると、URL は search.php?query=PHP となります。
PHP でのデータ受け取り
送信されたデータを $_GET を使って取得します。
<?php
if (isset($_GET['query'])) {
$query = $_GET['query'];
echo "検索キーワード:" . htmlspecialchars($query, ENT_QUOTES, 'UTF-8');
}
?>
$_POST と異なり、URL にデータが表示されるため、データの漏洩には注意が必要です。
5. $_POST と $_GET の使い分け(どちらを使うべきか)
$_POST と $_GET にはそれぞれ適した用途があります。以下のポイントを参考に使い分けましょう。
$_POST を使うべきケース
- ログインフォーム(パスワードを扱うため)
- お問い合わせフォーム(個人情報を含むため)
- データの登録・更新(長いデータを送る場合)
$_GET を使うべきケース
- 検索フォーム(URL に検索条件を残せる)
- ページネーション(ページ番号を URL に含める)
- フィルタリング機能(カテゴリの切り替えなど)
$_POST と $_GET の選択基準
| 基準 | $_POST | $_GET |
|---|---|---|
| セキュリティ | 高い(データが URL に表示されない) | 低い(データが URL に表示される) |
| データの長さ | 長いデータの送信が可能 | URL の制限内でのみ送信可能 |
| ページのリロード時の影響 | フォームの再送信に注意が必要 | リロードしても影響なし |
| ブックマーク・共有 | 不可(データが URL に含まれない) | 可能(URL にデータが含まれる) |
例えば、検索ページでは $_GET を使うことで、検索結果ページをブックマークしたり、他の人と共有することができます。一方、ログインフォームではセキュリティ上 $_POST を使うのが適切です。
6. フォームデータのバリデーション(入力チェックの基本)
PHP では、フォームから送信されたデータを適切にバリデーション(入力チェック)することが重要です。不正なデータや誤った入力を防ぐために、基本的なバリデーションを実装しましょう。
基本的なバリデーションの考え方
バリデーションには、以下のような基本的なチェックが含まれます。
- 必須項目チェック(空でないか)
- 文字数制限(最小・最大)
- データ形式の確認(メールアドレス、数字のみなど)
- 特殊文字のエスケープ(XSS対策)
PHP でのバリデーション実装
以下のコードは、基本的なバリデーションを実装した例です。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$errors = [];
if (empty($_POST["username"])) {
$errors[] = "ユーザー名を入力してください。";
} elseif (mb_strlen($_POST["username"]) > 20) {
$errors[] = "ユーザー名は20文字以内で入力してください。";
}
if (empty($_POST["email"])) {
$errors[] = "メールアドレスを入力してください。";
} elseif (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
$errors[] = "正しいメールアドレスを入力してください。";
}
if (empty($errors)) {
echo "入力内容が正しく受け取られました。";
} else {
foreach ($errors as $error) {
echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . "<br>";
}
}
}
?>
このコードでは、ユーザー名とメールアドレスの入力チェックを行い、問題がある場合はエラーメッセージを表示します。
7. $_POST や $_GET を安全に扱う方法(セキュリティ対策)
フォームのデータを安全に扱うためには、適切なセキュリティ対策を行う必要があります。以下のような攻撃に対する対策を見ていきましょう。
XSS(クロスサイトスクリプティング)対策
ユーザーがフォームに JavaScript などのスクリプトを入力して、それをそのまま出力すると XSS 攻撃の対象になります。これを防ぐために、出力時に htmlspecialchars を使用します。
<?php
if (isset($_POST["comment"])) {
$comment = htmlspecialchars($_POST["comment"], ENT_QUOTES, 'UTF-8');
echo "コメント: " . $comment;
}
?>
SQLインジェクション対策
フォームデータを直接 SQL クエリに組み込むと、悪意のある SQL コードを埋め込まれる危険があります。これを防ぐために、PDO や mysqli のプリペアドステートメントを使用します。
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
$sql = "INSERT INTO users (username, email) VALUES (:username, :email)";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":username", $_POST["username"], PDO::PARAM_STR);
$stmt->bindParam(":email", $_POST["email"], PDO::PARAM_STR);
$stmt->execute();
?>
CSRF(クロスサイトリクエストフォージェリ)対策
CSRF 攻撃を防ぐために、フォーム送信時にトークンを使用する方法があります。
<form action="process.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8'); ?>">
<label for="username">ユーザー名:</label>
<input type="text" id="username" name="username">
<button type="submit">送信</button>
</form>
<?php
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (!isset($_POST["csrf_token"]) || $_POST["csrf_token"] !== $_SESSION["csrf_token"]) {
die("CSRF トークンが無効です。");
}
}
?>
これにより、トークンをチェックして不正なリクエストを防ぎます。
8. PHP のフォーム処理を学ぶためのおすすめの方法
PHP のフォーム処理を学ぶために、以下の方法を活用しましょう。
1. 実際にフォームを作成して試す
まずは、基本的なフォームを作成し、$_POST や $_GET でデータを受け取る実践をしてみましょう。動作を確認しながら、エラーハンドリングやセキュリティ対策を学ぶことが重要です。
2. PHP の公式ドキュメントを活用する
PHP の公式サイト(https://www.php.net/manual/ja/)には、フォーム処理やセキュリティ対策に関する情報が詳しく掲載されています。
3. 実践的なプロジェクトに挑戦する
実際に、お問い合わせフォームやログイン機能を作成してみると、より深い理解が得られます。特に、データベースとの連携やセッション管理を学ぶと実用的なスキルが身につきます。
4. セキュリティについて学ぶ
フォームの安全な処理を学ぶために、XSS や SQL インジェクションなどの脆弱性についても調べてみましょう。実践的な知識を身につけることで、より安全なシステムを構築できます。
まとめ
フォームの仕組みは、初心者にとってとても身近でありながら、いざ自分で作成してみると意外に奥が深いことが分かります。特に、PHP でフォームのデータを受け取り、正しく処理して安全に表示するまでには、いくつかの大切なステップがあります。今回の内容では、$_POST と $_GET の基本的な違い、フォームの送信方法、バリデーション、セキュリティ対策まで幅広く触れました。実際に自分でフォームを作ることで、PHP のサーバーサイド処理の流れも理解できるようになります。 フォームは入力、送信、受信、表示の四つが揃って初めて正しく動きます。特にログイン、お問い合わせ、検索フォームなど、現実の Webサイトでも数多く使われている機能なので、一度身につけておくと幅広い用途に応用できます。たとえば、検索結果を URL に残せる GET の強みを使えば、検索結果をシェアしたりブックマークしたりでき、POST を使えばパスワードや個人情報を安全に送信できます。 また、$_POST や $_GET の値はそのまま扱うと危険な場合があります。スクリプトを入力されてしまう可能性、データベースに悪意ある文字列を送られる可能性など、Webフォームには常にリスクが付きまといます。そのため、htmlspecialchars のようなエスケープ処理、プリペアドステートメントなどの安全な書き方も紹介しました。とても基本的な技術ですが、知らないまま開発すると重大な問題につながるため、初心者の段階から丁寧に意識することが大切です。 ここでは、最後に簡単なサンプルを使って、フォーム送信から表示までの流れを再確認しておきます。下のコードは、POST を使って名前を受け取り、バリデーションとエスケープを行ってから安全に表示する例です。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = trim($_POST["name"]);
if (empty($name)) {
$message = "名前を入力してください。";
} else {
$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
$message = "入力した名前は「" . $safeName . "」です。";
}
}
?>
特に trim や empty を組み合わせることで、スペースだけの入力や未入力を防ぎ、htmlspecialchars によって XSS を防ぐことができます。フォームを画面に表示するだけでなく、こうした細かい安全対策も合わせて考えることで、実用的なプログラムへと近づいていきます。 実際のプロジェクトでは、名前やメールアドレスだけでなく、コメント欄、投稿フォーム、ログイン機能など複数の入力項目を扱うことになります。入力項目が増えるほどバリデーションの重要性も上がり、エラー時の表示方法、再入力させる仕組み、セッションを利用したログイン状態の管理など、多くの要素とつながっていきます。フォームは Web開発の入口でありながら、学べば学ぶほど応用範囲が広がる分野です。 さらに、URLに残して検索結果を共有できる GET、個人情報や秘密情報を扱うときに適した POST、両者がもつ性質が違うことで活躍する場面も大きく異なります。初心者のうちは「なんとなくPOSTを使う」より、「目的によって正しく使い分ける」ことを意識すると、より理解が深まります。 バリデーション、安全なエスケープ処理、SQLインジェクション防止、CSRFトークンなど、今回登場した内容は、一見複雑に感じるかもしれません。しかし、Webサイトを安全に動かすうえで欠かせない作法であり、どれも現場で頻繁に利用される考え方です。書き方を覚えるだけでなく、なぜ必要なのか、どういう危険を防ぐのかを知ることも大切です。こうした基礎を積み重ねることで、安心して使えるフォームの仕組みを実装できるようになります。
生徒
「POST と GET の違いが頭で混ざってしまってたんですが、今回で用途が分かりました。ログインやお問い合わせは POST、検索やページ番号は GETという考え方ですね。」
先生
「その理解でぴったりです。特に URL に表示されるかどうかは大きな違いですね。例えば、検索キーワードを共有したい時は URL に残る方が便利です。」
生徒
「あと、htmlspecialchars の大事さも分かりました。知らないとそのまま表示してしまいそうでした。」
先生
「フォームは便利ですが、同時に攻撃の入り口にもなってしまいます。だからこそ、エスケープやバリデーションは欠かせません。」
生徒
「これを応用すれば、ログイン機能やコメント欄、会員登録のページも作れそうです。」
先生
「まさにその通り。フォームを理解できれば Web開発の幅は一気に広がりますよ。少しずつ試しながら進めていきましょう。」