MENU

PHPで理解するフォーム送信とバリデーション

目次

はじめに: フォーム送信は入力値を受け取る入口

Webアプリでは、フォームを通じてユーザーの入力を受け取る場面がたくさんあります。お問い合わせ、ログイン、会員登録、検索、記事投稿などは、どれもフォーム送信と関係します。

フォームで送られた値は、HTTPリクエストとしてサーバーに届きます。PHPでは、POSTで送られた値を $_POST から受け取れます。

ただし、受け取った値をそのまま信用して処理してはいけません。入力欄に何も入っていないかもしれませんし、想定より長い文字列、不正な形式、HTMLタグのような文字列が送られてくることもあります。

そこで必要になるのがバリデーションです。バリデーションは、受け取った入力値がアプリケーションの条件に合っているかを確認する処理です。

フォーム送信では、ユーザーが入力した値をサーバーで受け取り、使う前に確認することが大切です。

フォーム送信はHTTPリクエストとして届く

HTMLフォームでは、method="post" を指定すると、入力内容をPOSTリクエストとして送信できます。

<form action="contact.php" method="post">
  <label>
    名前:
    <input type="text" name="name">
  </label>

  <button type="submit">送信</button>
</form>

このフォームでは、name="name" の入力値が contact.php へ送られます。PHP側では $_POST['name'] から値を受け取れます。

ブラウザ側でも、requiredtype="email" のような入力補助はできます。ただし、ブラウザの制限だけに頼るのは危険です。開発者ツールや別のプログラムを使えば、想定外の値を送ることもできるからです。

そのため、フォームの値はサーバー側でも必ず確認します。Webアプリでは、クライアント側のチェックは使いやすさのため、サーバー側のチェックは安全性と正しさのため、と分けて考えると分かりやすいです。

フォームの入力値はHTTPリクエストとして送られ、PHPでは主に $_POST から受け取れます。

バリデーションとは何か

バリデーションは、入力値が期待した条件を満たしているか確認する処理です。

たとえば、お問い合わせフォームなら次のような確認が考えられます。

名前は必須
メールアドレスは必須
メールアドレスの形式になっている
本文は必須
本文は長すぎない

これらの条件を満たさない場合は、メール送信やデータベース保存へ進まず、ユーザーにエラーを伝えます。

バリデーションは、ユーザーを責めるためのものではありません。入力ミスを早く見つけたり、アプリケーションが処理できないデータを受け取らないようにしたりするためのものです。

基本情報技術者試験でも、入力チェックや妥当性検査の考え方は重要です。実務では、それがフォームバリデーションとして毎日のように出てきます。

バリデーションは、受け取った値がアプリケーションの条件に合っているかを確認する処理です。

PHPでフォームを受け取る

まず、PHPでフォームの値を受け取る基本形を見てみます。ここでは、名前、メールアドレス、本文を送るお問い合わせフォームを例にします。

<?php
$name = '';
$email = '';
$message = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = $_POST['name'] ?? '';
    $email = $_POST['email'] ?? '';
    $message = $_POST['message'] ?? '';
}
?>

<!doctype html>
<html lang="ja">
<body>
  <form method="post">
    <label>
      名前:
      <input type="text" name="name" value="<?= htmlspecialchars($name, ENT_QUOTES, 'UTF-8') ?>">
    </label>

    <label>
      メール:
      <input type="text" name="email" value="<?= htmlspecialchars($email, ENT_QUOTES, 'UTF-8') ?>">
    </label>

    <label>
      本文:
      <textarea name="message"><?= htmlspecialchars($message, ENT_QUOTES, 'UTF-8') ?></textarea>
    </label>

    <button type="submit">送信</button>
  </form>
</body>
</html>

$_SERVER['REQUEST_METHOD'] を見ると、今のリクエストがPOSTかどうかを判断できます。初めてページを開いたときはGET、フォーム送信後はPOSTになる、という流れで考えると理解しやすいです。

$_POST['name'] ?? '' は、値が送られていない場合に空文字を使うための書き方です。存在しないキーを直接読もうとして警告が出るのを避けられます。

PHPでは、リクエストメソッドを見てPOST送信かどうかを判断し、フォームの値を受け取れます。

PHPでバリデーションする

次に、受け取った値を確認します。エラーを配列に入れておくと、どの項目に問題があるかを整理しやすくなります。

<?php
$name = '';
$email = '';
$message = '';
$errors = [];

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

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

    if ($email === '') {
        $errors['email'] = 'メールアドレスを入力してください。';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors['email'] = 'メールアドレスの形式で入力してください。';
    }

    if ($message === '') {
        $errors['message'] = '本文を入力してください。';
    } elseif (mb_strlen($message) > 1000) {
        $errors['message'] = '本文は1000文字以内で入力してください。';
    }

    if ($errors === []) {
        // ここでメール送信やデータベース保存などの処理を行う
    }
}

trim() は、前後の空白を取り除くために使っています。空白だけの入力を「入力あり」と扱わないようにするためです。

メールアドレスの形式チェックには filter_var()FILTER_VALIDATE_EMAIL を使っています。自分で複雑な正規表現を書くより、PHPが用意している仕組みを使うと読みやすくなります。

本文には文字数チェックを入れています。長すぎる入力をそのまま受け取ると、画面表示や保存処理に問題が出ることがあります。

PHPのバリデーションでは、受け取った値を条件ごとに確認し、問題があればエラーメッセージとして整理します。

バリデーションとエスケープの違い

フォーム入力を扱うとき、バリデーションとエスケープを混同しないことが大切です。

バリデーションは、値が条件に合っているかを確認する処理です。必須か、文字数は範囲内か、メールアドレスの形式か、といった確認を行います。

エスケープは、値をHTMLなどに出力するときに、特別な意味を持つ文字を安全に扱う処理です。PHPでHTMLに出力する場合は、htmlspecialchars() を使います。

<?= htmlspecialchars($name, ENT_QUOTES, 'UTF-8') ?>

たとえば、ユーザーが <script> のような文字列を入力した場合、そのままHTMLとして出力すると危険です。htmlspecialchars() を通すことで、HTMLタグとして解釈されにくい形に変換できます。

重要なのは、バリデーションをしてもエスケープが不要になるわけではないことです。入力値の条件確認と、出力時の安全対策は別の役割です。

バリデーションとエスケープは役割が違い、フォーム入力を安全に扱うには両方が必要です。

試験ではどう問われるか

基本情報技術者試験では、入力チェックや妥当性検査として問われることがあります。

たとえば、必須項目が入力されているか、数値が範囲内か、日付やメールアドレスが形式に合っているか、といった確認です。

これはWebフォームのバリデーションと同じ考え方です。プログラムは、外部から入ってくる値をそのまま正しいものとして扱うのではなく、条件に合っているか確認してから処理します。

また、不正入力への対策はセキュリティにも関係します。入力チェックだけですべての攻撃を防げるわけではありませんが、想定外の値を処理に進めないことは、品質と安全性の基本です。

試験では、入力値をそのまま処理せず、条件に合うか確認する考え方が重要です。

実務ではどう使われるか

実務では、フォーム送信とバリデーションはほぼセットで考えます。

お問い合わせフォームなら、名前、メールアドレス、本文の必須チェックが必要です。会員登録なら、パスワードの長さ、メールアドレスの重複、利用規約への同意なども確認します。

クライアント側のバリデーションも役に立ちます。入力中にすぐエラーを表示できるため、ユーザーにとって使いやすくなります。ただし、最終的な確認は必ずサーバー側でも行います。

エラーメッセージも重要です。「入力が不正です」だけでは、ユーザーは何を直せばよいか分かりません。どの項目に、どのような問題があるのかを具体的に伝えると、使いやすいフォームになります。

実務では、フォーム送信を受け取るたびに、入力値の検証、エラー表示、安全な出力をセットで考えます。

まとめ: フォームは受け取ってから確認する

フォーム送信は、ユーザー入力をHTTPリクエストとしてサーバーへ送る仕組みです。PHPでは、POSTされた値を $_POST から受け取れます。

受け取った値は、そのまま処理せず、必須、文字数、形式などを確認します。これがバリデーションです。問題があれば、処理を進めず、エラーメッセージとしてユーザーに伝えます。

また、画面に出力するときは htmlspecialchars() によるエスケープが必要です。バリデーションは値の妥当性確認、エスケープは表示時の安全対策として、役割を分けて理解しましょう。

フォーム送信を理解すると、Webアプリがユーザー入力をどのように受け取り、安全に処理しているのかが見えやすくなります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

20代前半に、ゲームボーイアドバンス、ニンテンドーDS、Wii向けソフトの開発に携わりました。

その後、20代後半にかけては組み込み系エンジニアとして、主にサーバーソフトウェアの開発を経験。

30代からはWebエンジニアとして、さまざまなWebサービスの開発に携わってきました。

現在は40代となり、ゲーム開発、組み込み開発、Web開発で培った経験を活かしながら、技術をわかりやすく伝える活動にも取り組んでいます。

コメント

コメントする

CAPTCHA


目次