PHPのフォーム処理とは?$_POST・$_GETの受け取り方を解説

PR PHP

PHPのフォーム処理とは?$_POST・$_GETの受け取り方を解説

💡 この記事でわかること

  • フォーム処理の全体の流れ(HTMLで入力 → PHPで受け取る)
  • $_POST$_GET での値の受け取り方と、method の違い
  • 未入力チェック・数値やメール形式のチェック(バリデーション)
  • htmlspecialchars() による XSS 対策
  • 1つのファイルで「表示」と「送信処理」をまとめる書き方

1. フォーム処理とは?

フォーム処理とは、
👉 Webページの入力欄(フォーム)にユーザーが入力した内容を、PHPで受け取って処理することです。お問い合わせフォーム、ログイン、検索など、Webサイトの多くの機能がこのしくみで動いています。

基本の流れは次の3ステップです。

  1. HTMLの <form> で入力欄を用意する
  2. ユーザーが入力して「送信」ボタンを押す
  3. 送信先のPHPファイルが $_POST などで値を受け取り、チェック・保存・表示などを行う

👉 PHPの基本文法(<?php ?>・echo・変数)についての記事はこちら


2. HTMLフォームを用意する

<form method="post" action="contact.php">
  <input type="text" name="username">
  <textarea name="message"></textarea>
  <button type="submit">送信</button>
</form>
  • action:送信先のファイル。省略すると同じファイルに送信される
  • method:postget。PHP側で受け取る変数が変わる
  • name:PHPで値を取り出すときのキーになる。書き忘れると受け取れない

3. $_POST / $_GET で値を受け取る

受け取った値は、method に応じて次の連想配列に入っています。name 属性の値がキーになります。

  • method="post"$_POST["name属性"]
  • method="get"$_GET["name属性"](URLに値が付く。検索など向け)
<?php
$username = $_POST["username"] ?? "";
$message  = $_POST["message"] ?? "";

echo "ようこそ、{$username}さん";

👉 フォームを送信する前(最初にページを開いたとき)は $_POST が空です。存在しないキーを参照すると警告が出るので、?? "" で「なければ空文字」を用意しておきます。

💡 受け取った値は、数字を入力しても文字列(string)で届きます。数値として計算するなら (int) などで変換します。

👉 PHPのデータ型・型変換についての記事はこちら


4. 未入力チェック(バリデーション)

受け取った値は、そのまま使う前に「正しく入力されているか」を確認します。まずは必須項目の空欄チェックです。

<?php
$username = trim($_POST["username"] ?? "");   // 前後の空白を除く

if ($username === "") {
    echo "名前を入力してください";
} else {
    echo "{$username}さん、こんにちは";
}

💡 空欄チェックには empty() もありますが、empty("0")true(空扱い)になります。「0」という入力を弾きたくない場合は、trim() してから === "" で比べるほうが確実です。


5. 数値・メール形式のチェック

<?php
$age   = $_POST["age"] ?? "";
$email = $_POST["email"] ?? "";

if (!is_numeric($age)) {
    echo "年齢は数字で入力してください";
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "メールアドレスの形式が正しくありません";
}
  • is_numeric($v):数値として扱える文字列かどうか
  • filter_var($v, FILTER_VALIDATE_EMAIL):メール形式なら値を、違えば false を返す

👉 チェックに引っかかった項目は、エラーメッセージを配列にためておき、あとでまとめて表示すると分かりやすくなります(7で実例を紹介します)。


6. htmlspecialchars() で安全に表示する(XSS対策)

👉 ユーザーが入力した値を、そのままHTMLに出力してはいけません。入力欄に <script> などのHTMLタグを書かれると、それがページ上で動いてしまうクロスサイトスクリプティング(XSS)という攻撃につながります。

<?php
$comment = $_POST["comment"] ?? "";

// 危険:入力されたタグがそのまま有効になる
echo $comment;

// 安全:タグを無害な文字に変換してから出力する
echo htmlspecialchars($comment, ENT_QUOTES, "UTF-8");

💡 htmlspecialchars()< > & " などを &lt; のような表記に変換します。第2引数の ENT_QUOTES でシングルクォートも変換、第3引数で文字コードを指定します。入力値を画面に出すときは、フォームの再表示も含めて必ず通すと覚えておきましょう。


7. 実例:1つのファイルで表示と処理をまとめる

実際のフォームは、同じファイルの中で「フォームの表示」と「送信されたときの処理」の両方を行うことが多いです。送信されたかどうかは $_SERVER["REQUEST_METHOD"] で判定します。

<?php
$name = "";
$errors = [];

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $name = trim($_POST["name"] ?? "");

    if ($name === "") {
        $errors[] = "名前を入力してください";
    }

    if (!$errors) {
        // ここで保存やメール送信などを行う
        echo "送信しました";
    }
}
?>
<?php foreach ($errors as $error): ?>
  <p><?php echo htmlspecialchars($error, ENT_QUOTES, "UTF-8"); ?></p>
<?php endforeach; ?>
<form method="post">
  <input type="text" name="name"
         value="<?php echo htmlspecialchars($name, ENT_QUOTES, "UTF-8"); ?>">
  <button type="submit">送信</button>
</form>

💡 エラーがあれば一覧表示してフォームを再表示、なければ送信処理、という流れです。入力済みの値を value に戻すことで、ユーザーが最初から入力し直さずに済みます。

👉 PHPのif文・foreach・endif記法についての記事はこちら


8. つまずきやすいポイント

  • name 属性の書き忘れ:$_POST にその値が入ってこない
  • method の取り違え:get なのに $_POST で受け取ろうとしている
  • 初回表示で警告:送信前は $_POST が空 → ?? "" を付ける
  • 出力時のエスケープ忘れ:表示する値は htmlspecialchars() を通す
  • $_POST の値は文字列:数値計算の前に (int) などで変換する

9. まとめ

  • フォームは <form method="post"> + name 属性、PHP側は $_POST["name属性"] で受け取る
  • 受け取った値は ?? "" で初期値を用意し、trim()is_numeric()filter_var() でチェックする
  • 画面に出すときは必ず htmlspecialchars()(XSS対策)
  • 送信判定は $_SERVER["REQUEST_METHOD"] === "POST"
  • エラーは配列にためて、まとめて表示 → フォームを再表示

👉 「受け取る → チェックする → エスケープして表示する」の3つはセットです。まずは名前だけの小さなフォームを作り、空欄チェックと htmlspecialchars() を試してみましょう。

-PHP
-, , ,