フォームの基本構造とPHPでのデータ受け取り

Webフォームは、ユーザーが情報を入力するための仕組みです。
HTMLの <form> タグで作り、送信先のPHPファイルを action 属性で指定します。
送信方法は主に2種類あり、

  • GET:URLにデータを付けて送る
  • POST:HTTPリクエストの本文にデータを隠して送る

例として、ユーザー名を入力するフォームはこう書きます。

<form action="" method="POST">
  <input type="text" name="username">
  <button type="submit">送信</button>
</form>

<?php
$username = $_POST['username'] ?? '';
echo "名前:".$username;
?>
  • $_POST はPOST送信されたデータを連想配列で持つ「スーパーグローバル変数」です。
  • ?? '' は、もしusernameが送られてこなければ空文字を代入する意味です。

このようにフォームとPHPを連携させて、ユーザーの入力データを受け取って処理します。

テキスト入力フォームのデータ受け取りとバリデーション

テキスト入力はフォームで最もよく使われる基本的な要素です。
PHPでデータを受け取ったら、ユーザーの誤入力や不正なデータを防ぐために「バリデーション(入力チェック)」を行います。

以下は「名前」を受け取り、バリデーションをする例です。

<?php
$name = trim($_POST['name'] ?? ''); // 入力の前後の空白を取り除く

$errors = [];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  if ($name === '') {
    $errors[] = "名前は必須です。";
  } elseif (mb_strlen($name) > 50) {
    $errors[] = "名前は50文字以内で入力してください。";
  }
}

if ($errors) {
  foreach ($errors as $error) {
    echo "<p style='color:red;'>$error</p>";
  }
} else {
  echo "こんにちは、" . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "さん!";
}
?>

<form action="test-x.php" method="POST">
  <label for="name">名前:</label>
  <input type="text" id="name" name="name" value="<?php echo htmlspecialchars($name ?? '', ENT_QUOTES, 'UTF-8'); ?>">
  <button type="submit">送信</button>
</form>
  • trim() は文字列の前後にある不要な空白を取り除きます。
  • mb_strlen() は日本語などのマルチバイト文字も正確に文字数を数えられます。
  • htmlspecialchars() はXSS攻撃を防ぐため、HTMLの特殊文字(例: < > &)を安全に変換します。

このようにバリデーションで必須チェックや文字数制限を行い、入力の安全性と正確性を確保します。

ラジオボタン・チェックボックスの値をPHPで処理する方法

  • ラジオボタンは1つだけ選べる。PHPでは文字列として受け取る。
  • チェックボックスは複数選べる。PHPでは配列として受け取る。
  • 送信されなければ値は空(文字列 or 配列)になるので初期値を用意する。
  • 受け取った値はバリデーションやXSS対策を必ず行う。

ラジオボタンとは

ラジオボタンは複数の選択肢から1つだけ選ぶためのフォーム要素です。
性別や年代など、一つだけ選択したい時に使います。

ラジオボタンの例

<form method="POST">
  <label><input type="radio" name="gender" value="male"> 男性</label>
  <label><input type="radio" name="gender" value="female"> 女性</label>
  <button type="submit">送信</button>
</form>

PHPでの受け取りとバリデーション

<?php
// 送信された性別を取得。未送信なら空文字
$gender = $_POST['gender'] ?? '';

// 受け取った値が許可された選択肢かチェック
if (!in_array($gender, ['male', 'female'], true)) {
  echo "性別を選択してください。";
} else {
  // 選択された値をそのまま表示(XSS対策としてエスケープしても良い)
  echo "選択された性別は「" . htmlspecialchars($gender, ENT_QUOTES, 'UTF-8') . "」です。";
}
?>

チェックボックスとは

チェックボックスは複数の選択肢からいくつでも選択できるフォーム要素です。
複数の趣味や興味を選ぶ時などに使います。

チェックボックスの例

複数選択できるように、name 属性に [] をつけて配列で送信します。

<form method="POST">
  <label><input type="checkbox" name="hobbies[]" value="music"> 音楽</label>
  <label><input type="checkbox" name="hobbies[]" value="sports"> スポーツ</label>
  <label><input type="checkbox" name="hobbies[]" value="reading"> 読書</label>
  <button type="submit">送信</button>
</form>

PHPでの受け取りとバリデーション

<?php
// 送信された趣味の配列。未送信なら空配列
$hobbies = $_POST['hobbies'] ?? [];

if (empty($hobbies)) {
  echo "趣味を一つ以上選択してください。";
} else {
  // 各値を安全にエスケープし、文字列に結合して表示
  echo "選択された趣味は:" . implode('、', array_map('htmlspecialchars', $hobbies)) . "です。";
}
?>

了解です。まとめ部分を冒頭に移動し、見出しにせず文章として入れた形で整えました。

セレクトボックス(ドロップダウン)の選択値を取得する方法

<select>タグを使ったセレクトボックスは、複数の選択肢の中から一つだけ選ぶフォーム要素です。
国や都道府県などのリストから選択するときによく使われます。送信された値はPHPで必ずチェックして正しいか確認しましょう。未選択や不正な値の場合はエラーを返し、ユーザーに選択を促すのが基本です。必要に応じて、選択された値を元にフォームに反映させるなど、ユーザーに優しいUIにすることもおすすめです。

セレクトボックスの例

<form method="POST">
  <select name="country">
    <option value="">選択してください</option>
    <option value="jp">日本</option>
    <option value="us">アメリカ</option>
    <option value="fr">フランス</option>
  </select>
  <button type="submit">送信</button>
</form>
  • <select>タグのname属性で送信時のキー名を指定します。
  • <option>タグのvalue属性が送信される値になります。
  • 最初の「選択してください」は空文字 "" を指定し、未選択を表します。

PHPでの値の受け取りと妥当性チェック

<?php
// フォームから送信された値を取得。送信されなければ空文字を代入
$country = $_POST['country'] ?? '';

// 有効な選択肢の配列
$validCountries = ['jp', 'us', 'fr'];

// 送信された値が有効な選択肢かチェック
if (!in_array($country, $validCountries, true)) {
  echo "国を正しく選択してください。";
} else {
  // 選ばれた国の値を表示(XSS対策としてエスケープ推奨)
  echo "選択された国は「" . htmlspecialchars($country, ENT_QUOTES, 'UTF-8') . "」です。";
}
?>
  • $_POST['country'] ?? '' で、送信されていなければ空文字を代入しています。
  • in_array() で送信値が予め用意した有効な選択肢の中にあるかどうかを確認します。
  • 不正な値や未選択の場合はエラーメッセージを表示します。
  • 有効な値の場合は、XSS対策として htmlspecialchars() を使い安全に表示します。

ファイルアップロードフォームの作り方と安全に使うポイント

Webサイトで画像やファイルを送ってもらうときは「ファイルアップロードフォーム」を使います。
フォームの中にファイルを選ぶボタンを作り、選んだファイルをサーバーに送ります。

ファイルアップロードフォームの作り方

<form method="POST" enctype="multipart/form-data">
  <input type="file" name="upload_file">
  <button type="submit">アップロード</button>
</form>
  • <input type="file"> でファイルを選ぶボタンができます。
  • enctype="multipart/form-data" はファイルを送るときに必ず必要な指定です。

PHPでファイルを受け取る方法

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) {
  $file = $_FILES['upload_file'];

  // ファイルのアップロードでエラーがないか確認
  if ($file['error'] !== UPLOAD_ERR_OK) {
    echo "アップロードに失敗しました。";
    exit;
  }

  // ファイルサイズを5MBまでに制限
  if ($file['size'] > 5 * 1024 * 1024) {
    echo "ファイルが大きすぎます。5MBまでにしてください。";
    exit;
  }

  // 許可するファイルの種類(ここでは画像だけ)
  $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
  if (!in_array($file['type'], $allowedTypes, true)) {
    echo "画像ファイル(jpg, png, gif)のみアップロードできます。";
    exit;
  }

  // 安全なファイル名を作る(元の名前は使わない)
  $safeName = uniqid() . '-' . basename($file['name']);

  // ファイルの保存場所(uploadsフォルダ)
  $uploadDir = __DIR__ . '/uploads/';

  // ファイルをサーバーに移動して保存
  if (!move_uploaded_file($file['tmp_name'], $uploadDir . $safeName)) {
    echo "ファイルの保存に失敗しました。";
    exit;
  }

  echo "ファイルをアップロードしました!";
}
?>

ファイルアップロードを安全に使うためのポイント

  • アップロードするファイルの種類を決めて、それ以外は受け付けない
    たとえば画像だけにするなど制限しましょう。
  • ファイルの名前は元の名前をそのまま使わず、新しい名前を付ける
    変な名前や悪意のある文字を防ぎます。
  • ファイルの大きさにも上限をつける
    サーバーの負担が大きくなりすぎないようにします。
  • アップロードしたファイルがサーバー上で悪さをしない場所に保存する
    たとえばPHPファイルが勝手に動かないように設定します。

ファイルアップロードは便利ですが、間違えると危険です。このポイントを守って安全に使いましょう。

PHPでのフォームデータの活用例とセキュリティポイント

Webフォームでユーザーから送られてきたデータは、たとえば以下のように活用されます。

  • データベースに保存して後で利用する
  • メールで管理者に通知する
  • 画面に入力内容を表示して確認してもらう

しかし、フォームに入力されたデータには悪意のあるものや誤ったものが含まれている可能性があります。そのため、安全に扱うために必ず次のポイントを守る必要があります。

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

  • 必須の項目は必ず入力されているか
  • 文字数が多すぎたり少なすぎたりしないか
  • メールアドレスの形式や電話番号の数字チェックなど、正しい形かどうか

これらをチェックして、ユーザーのミスや悪意のあるデータを事前に防ぎます。

2. エスケープ処理

フォームのデータをそのまま画面に表示すると、悪意のあるコード(例:<script>タグ)が混ざっていると危険です。
そのため、表示するときは htmlspecialchars() などの関数で特別な文字を安全に変換してから表示します。これにより、XSS(クロスサイトスクリプティング)攻撃を防止できます。

3. SQLインジェクション対策

データベースに入力データを保存するとき、悪意あるSQL文を送り込まれる危険があります。
これを防ぐためには、

  • プリペアドステートメント(準備された文)を使う
  • もしくはエスケープ関数で特殊文字を無害化する

ことが必須です。

4. CSRF対策(クロスサイトリクエストフォージェリ)

他の悪意あるサイトから、知らないうちにあなたのフォームを勝手に送信される攻撃があります。
これを防ぐために、

  • フォームに「トークン」と呼ばれるランダムな文字列を入れて送信する
  • 受け取った側でトークンが正しいか必ず確認する

という方法を使います。

5. ファイルアップロードの安全管理

ファイルをアップロードさせる場合は、前の説明のように、

  • ファイルの種類やサイズをチェックする
  • ファイル名を安全な名前に変える
  • アップロード先を安全な場所にする

ことが重要です。