💡 この記事でわかること
- フォーム処理の全体の流れ(HTMLで入力 → PHPで受け取る)
$_POST・$_GETでの値の受け取り方と、methodの違い- 未入力チェック・数値やメール形式のチェック(バリデーション)
htmlspecialchars()による XSS 対策- 1つのファイルで「表示」と「送信処理」をまとめる書き方
1. フォーム処理とは?
フォーム処理とは、
👉 Webページの入力欄(フォーム)にユーザーが入力した内容を、PHPで受け取って処理することです。お問い合わせフォーム、ログイン、検索など、Webサイトの多くの機能がこのしくみで動いています。
基本の流れは次の3ステップです。
- HTMLの
<form>で入力欄を用意する - ユーザーが入力して「送信」ボタンを押す
- 送信先の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:postかget。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) などで変換します。
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() は < > & " などを < のような表記に変換します。第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() を試してみましょう。