PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
新人
「PHPでフォームのデータを受け取るにはどうすればいいですか?」
先輩
「フォームとは、ユーザーからの入力を受け取るための仕組みのことだよ。まずはフォームについて説明しよう!」
1. フォームとは?
フォームとは、ユーザーがデータを入力して送信できるWebページの仕組みです。例えば、ログインフォームやお問い合わせフォームがこれに当たります。
HTMLでフォームを作るには、<form>
タグを使用します。以下はシンプルな入力フォームの例です。
<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
にデータが送られます。
2. PHP でフォームのデータを受け取る方法($_POST と $_GET の違い)
フォームのデータは、$_POST
または$_GET
を使って受け取ります。それぞれの違いを見ていきましょう。
$_POST を使ったデータの受け取り
フォームの method
に post
を指定すると、データは HTTPリクエストのボディ部分に送信されます。これにより、URLには表示されず、データの安全性が向上します。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST['name'];
echo "あなたの名前は " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . " です。";
}
?>
$_GET を使ったデータの受け取り
フォームの method
に get
を指定すると、データは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
if ($_SERVER["REQUEST_METHOD"] == "GET") {
$name = $_GET['name'];
echo "あなたの名前は " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . " です。";
}
?>
$_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 インジェクションなどの脆弱性についても調べてみましょう。実践的な知識を身につけることで、より安全なシステムを構築できます。