はじめに
アドベントカレンダー12/10=10記事目。
今回の記事では、Laravel 学習中にふと気になった “POSTデータの受け取り方の違い” についてまとめています。
Laravelというものにふれて間もないため、「同じPOSTデータを受け取るだけなのに、書き方がいろいろある?」と疑問に感じました。
この記事では、
-
$_POSTを使う書き方 -
filter_input_array(INPUT_POST)の違い - それぞれの特徴・使う場面
など
上記内容を、“こういう書き方もあるんだ” という軽い読み物として紹介させていただきます
環境など
- Laravel学習中
- Laravelバージョン:おそらく7
- 使用していたパソコン:MacBook
まずはそれぞれの特徴について
POSTデータを受け取る2つの方法を比較し、どんな違いがあるのか整理します
$_POST の特徴(基本の書き方)
- フォームから送られた値を 1つずつ手動で取り出す 方法
例:$name = $_POST['name']; - サニタイズ(無害化)やバリデーション(値のチェック)を自分で書く必要がある
- フォームの項目が増えると、コードがどんどん長くなる傾向にある
- シンプルで仕組みが分かりやすく、初心者が最初に学ぶ書き方としては良いらしい?
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は慣れるまで少し難しいが、実務向けでコードがスッキリする - どちらも使う場面や特徴が違う
- バリデーションはどちらでも“自動ではしてくれない”
「状況によって書き方を使い分ける」 という考え方を知る事ができました
私自身まだ学習中で、記事も調べながら書いた内容が多くあります。
同じように学んでいる方に、「こういう違いがあるんだ」と知るきっかけになれば嬉しいです。