0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(12/10) Laravel学習中に気づいたPHPの基本:POSTデータの扱い方と書き方の差

Last updated at Posted at 2025-12-09

はじめに

アドベントカレンダー12/10=10記事目。

今回の記事では、Laravel 学習中にふと気になった “POSTデータの受け取り方の違い” についてまとめています。

Laravelというものにふれて間もないため、「同じPOSTデータを受け取るだけなのに、書き方がいろいろある?」と疑問に感じました。

この記事では、

  • $_POST を使う書き方
  • filter_input_array(INPUT_POST) の違い
  • それぞれの特徴・使う場面
    など

上記内容を、“こういう書き方もあるんだ” という軽い読み物として紹介させていただきます

環境など

  • Laravel学習中
  • Laravelバージョン:おそらく7
  • 使用していたパソコン:MacBook

まずはそれぞれの特徴について

POSTデータを受け取る2つの方法を比較し、どんな違いがあるのか整理します


:white_check_mark: $_POST の特徴(基本の書き方)

  • フォームから送られた値を 1つずつ手動で取り出す 方法
    例:$name = $_POST['name'];
  • サニタイズ(無害化)やバリデーション(値のチェック)を自分で書く必要がある
  • フォームの項目が増えると、コードがどんどん長くなる傾向にある
  • シンプルで仕組みが分かりやすく、初心者が最初に学ぶ書き方としては良いらしい?

:white_check_mark: filter_input_array(INPUT_POST) の特徴(まとめて扱う事のできる書き方)

  • POSTされた値を 一括で配列として取得 できる
  • 取り込むタイミングでフィルター(チェックルール)を指定できる
    そのため、サニタイズやバリデーションのコードがまとめやすくなる
  • 項目が多くてもスッキリ書け、実務ではよく使われる
  • 少し慣れが必要だが、扱えるとコードの見通しが良くなる

コードの違い

実際にコードの量、記述方法がどうかなとなっているのか、下記に示します


① filter_input_array でサニタイズ&バリデーションする場合

🌱フィルターの設定(どんな値であるべき?を書く)

$filters = [
  'name' => FILTER_SANITIZE_STRING,       // 文字列を無害化(サニタイズ)
  'age' => [
    'filter' => FILTER_VALIDATE_INT,      // 整数かどうかチェック(バリデーション)
    'options' => ['min_range' => 1]       // 年齢が1以上かどうか
  ],
  'mail_address' => FILTER_VALIDATE_EMAIL // メールアドレス形式かをチェック(バリデーション)
];

ここでは、POST値に対して「どう扱うか?」をまとめて定義しています

  • name → 文字列を無害化
  • age → 整数で1以上
  • mail_address → メール形式かどうか

🌱実際にPOSTデータをまとめて取得する

$input = filter_input_array(INPUT_POST, [
  'name' => FILTER_SANITIZE_STRING,
  'age' => FILTER_VALIDATE_INT,
  'email' => FILTER_VALIDATE_EMAIL
]);

この1行でPOSTから必要項目をまとめて取得 & 同時にチェックしています


🌱エラー処理(自動ではやってくれない!)

if (!$input['name']) {
  $error[] = '名前が未入力です。';
}
if ($input['age'] === false) {
  $error[] = '年齢は数値で入力してください。';
}
if ($input['email'] === false) {
  $error[] = 'メールアドレスが不正です。';
}

filter_input_arrayは便利ですが、エラーメッセージまでは勝手に作ってくれません
→ 自分で書く必要があります。


② $_POST で手動チェックする場合

$name = $_POST['name'];
$age = $_POST['age'];
$email = $_POST['email'];

if (!isset($name) || $name === '') {
  $error[] = '名前が未入力です。';
}
if (!is_numeric($age)) {
  $error[] = '年齢は数値で入力してください。';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $error[] = 'メールアドレスが不正です。';
}

こちらは、ひとつずつ取り出して、ひとつずつチェックするという方式。

手順が分かりやすい反面、項目が増えるとコード量も増え、
サニタイズやバリデーションを自分で逐一書く必要があります

おまけ:実際にこんなコードをかいていた(まちがい)

<!-- <li><?php if (empty($input['name'])) {echo"名前は必須です";} : ?></li> -->
<!-- <li><?php if (filter_var($input['mail_address'])){echo"メールアドレス形式で入力してください"} :?></li> -->
間違いの箇所 問題点 正しい形
filter_var($input['mail_address']) 第二引数が必要 filter_var($input['mail_address'], FILTER_VALIDATE_EMAIL)
{ ... } : {}: を混ぜて使っている { ... } だけ、または : ... endif; だけ使う
echo"..." セミコロンがない echo "..." ;

さいごに

今回の記事では、POSTデータを受け取る2つの方法を比較し、
「同じことをするのに書き方が違うのはなぜ?」という疑問を整理してみました。

  • $_POST は分かりやすいけれど、コードが長くなりやすい
  • filter_input_array は慣れるまで少し難しいが、実務向けでコードがスッキリする
  • どちらも使う場面や特徴が違う
  • バリデーションはどちらでも“自動ではしてくれない”

「状況によって書き方を使い分ける」 という考え方を知る事ができました

私自身まだ学習中で、記事も調べながら書いた内容が多くあります。
同じように学んでいる方に、「こういう違いがあるんだ」と知るきっかけになれば嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?