「PHPでフォームからの入力を処理したい」「$_POSTの使い方がよくわからない」などPHPでPOSTデータ処理に悩みをお持ちではありませんか?本記事では、PHPのpost処理の基本から応用までを丁寧に解説します。送信・受信の仕組み、JSON対応、セキュリティ対策、よくあるエラーの解消方法まで、実践に役立つ情報を解説します。
これからPOST送信を学ぶ方にも、復習したい方にも役立つ内容ですのでぜひ参考にしてください。
目次
閉じる
1.PHPのPOSTとは?
フォームと連携してユーザーの入力データを扱うときに、PHPで使われるのがPOST送信です。$_POSTはフォームから送られた情報を安全に受信・処理するための基本機能です。ここではPOSTとGETの違い、$_POSTの構文、HTMLフォームとの連携方法を解説します。
POSTとGETの違いとは?
PHPで外部からデータを受け取るときには、POSTメソッドかGETメソッドを使うことが多いです。POSTとGETでは送信方法やデータの扱いに明確な違いがあります。
まずGETは送信する情報をURLに付加する形式です。たとえば「example.php?name=Taro」のようにデータがURLに見える状態で送られます。検索機能やリンクの共有に適していますが、パスワードや個人情報のような機密性の高いデータの送信には向きません。
一方、POSTはHTTPリクエストのボディ部分にデータを含めて送信します。URLには表示されず、データ量の制限が優しいです。主にログイン処理や登録フォームといった、安全性やデータの整合性が重要な処理に適しています。
目的や扱う情報の性質に応じて、PHPではPOSTとGETを適切に使い分けましょう。
PHPで$_POST構文の基本的な使い方
PHPでPOSTデータを受け取る際には、$_POSTというスーパーグローバル変数を利用します。$_POSTはHTMLフォームからPOSTメソッドで送信された情報を自動的に配列として格納する変数です。
コード例
<?php $name = $_POST['name']; echo "あなたの名前は " . $name . " です。"; ?> |
このコード例では、フォームから送信された「name」という項目の値を$nameに代入し、その内容を画面に表示しています。重要なのはHTML側のフォームに「name="name"」と明記されていること、そしてフォームのmethod属性がpostであることです。これらが正しく設定されていなければ、PHPはPOSTデータを正確に取得できません。
また、配列のように複数の入力値を扱う場合も、$_POST['key']の形式でそれぞれのデータを参照可能です。
HTMLフォームとの連携を理解する
POST送信を理解するには、HTMLフォームとPHPの関係性を理解しなければなりません。基本的な流れは次の通りです。
HTMLファイル(例:form.html)
↓
↓ ユーザーが入力して送信
↓
PHPファイル(例:submit.php)
↓
↓ 送信されたデータを受信・処理
↓
結果をブラウザに出力
HTMLのコード例
<form action="submit.php" method="post"> <label>名前:<input type="text" name="name"></label> <input type="submit" value="送信"> </form> |
このコード例のフォームでは、ユーザーが入力した名前がPOSTメソッドを使ってsubmit.phpへ送信されます。PHP側では、$_POST['name']を使ってその値を受け取ります。
この一連の流れを頭に入れておくと、POST送信の全体像がイメージしやすくなり、プログラミングがしやすいので、ぜひ理解してくださいね。
2.PHPで受け取るデータをフォームからPOST送信する
フォームから送信されたデータをPHPで受け取るには、HTMLとPHPの正確な連携が欠かせません。ここでは、基本的なフォームの書き方からPHP側での受信処理まで解説します。
フォーム内属性の正しい書き方
POST送信するフォームを作成するときに、formタグとinput要素を正しく書く必要があります。特にname属性はPHP側でデータを識別するために重要です。
フォームのコード例
<form action="submit.php" method="post"> <label>名前:<input type="text" name="username"></label><br> <input type="submit" value="送信"> </form> |
このフォームでは、usernameという名前が付けられたテキストボックスからユーザーの入力を受け取り、submit.phpにPOST送信します。PHP側では$_POST['username']としてデータを取得できます。
重要なのはすべてのinput要素に必ずname属性を設定することです。nameがなければ、どんなに正しく送信してもPHPはそのデータを受け取れません。ラジオボタンやチェックボックス、セレクトボックスなどの入力項目でも、同様にname属性が必要です。
method="post"とaction="phpファイル"の意味
HTMLで記述するフォームでは、methodとactionを正しく指定しなければPOST送信が成功しません。
method="post"
フォームの送信方法をPOSTに指定するための属性です。ここがgetになっていると、$_POSTではデータを受け取れず、代わりに$_GETが使われることになります。
action="submit.php"
送信先のPHPファイルを指定します。このコード例では、フォームのデータはsubmit.phpというファイルに送信され、PHPがその内容を受信し処理するようになっています。
送信先ファイルが同じページ内の場合は、「action=""」と記述しても問題ありませんが、URLを明示しておく方が意図が明確になるのでおすすめです。また、入力フォームに「enctype="multipart/form-data"」を加えると、ファイル送信にも対応可能です。
PHPでPOST受信して表示する
PHPでPOSTされたデータを受け取るには、$_POST配列を使います。送信された情報は、name属性をキーとした連想配列として格納されます。
受信データを表示するコード例
<?php $username = $_POST['username']; echo "ようこそ、" . htmlspecialchars($username, ENT_QUOTES, 'UTF-8') . " さん!"; ?> |
このコード例ではPOSTされたusernameの値を変数に代入し、その内容HTMLで表示しています。htmlspecialcharsは出力時のXSS対策です。
$_POSTは単なる配列なので、存在しないキーを参照するとエラーになる恐れがあります。回避するためにはissetやemptyと組み合わせて使うと良いでしょう。
issetを使ったコード例
<?php $username = isset($_POST['username']) ? $_POST['username'] : ''; echo "ようこそ、" . htmlspecialchars($username, ENT_QUOTES, 'UTF-8') . " さん!"; ?> |
関連記事
PHP開発環境構築|Docker・VSCode・XAMPPなどWindows・Mac対応の完全ガイド
3.PHPでPOST送信されたデータを全て取得する方法
ユーザーがフォームに入力した情報を正確に受信・処理するには、POSTで送られてくる全てのデータを漏れなく取得する必要があります。入力項目が多いフォームや動的に生成されたname属性を扱う場合には、$_POST配列をループ処理で確認するのが効果的です。
ここではPOSTデータを一括で全て取得する方法や、配列形式で送信された入力の扱い方を紹介します。
POST送信されたデータをforeachで全て取得する
POSTで送られた複数の入力項目を一つずつ確認したい場合、foreachのループが便利です。
$_POSTは連想配列として機能するため、キーと値を順に取り出して処理が可能です。
コード例
<?php foreach ($_POST as $key => $value) { echo $key . ':' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '<br>'; } ?> |
このコード例を活用すれば特定のキーを指定する必要がなく、項目の数が多くてもフォームから送られたすべての項目を順番に表示できます。
なお表示する場合にはhtmlspecialcharsを使ってXSS対策もしてください。また改行が含まれる可能性がある場合はnl2brと組み合わせると見やすい出力になります。
ネストされた配列を受け取る方法
複数行の入力や項目名に[]を付けたフォームでは、POSTデータが配列として送信されます。たとえば次のようなフォームの場合を見てみましょう。
<form action="check.php" method="post"> <input type="text" name="hobby[]"><br> <input type="text" name="hobby[]"><br> <input type="text" name="hobby[]"><br> <input type="submit" value="送信"> </form> |
このコード例のような場合、PHPでは$_POST['hobby']が配列として扱われます。配列としてPOSTされたデータであっても、foreachを使えばPOSTされたデータを全て取得可能です。
<?php $hobbies = $_POST['hobby'];
echo '趣味' . ($index + 1) . ':' . htmlspecialchars($item, ENT_QUOTES, 'UTF-8') . '<br>'; } ?> |
もちろん複数のチェックボックスや、テーブル形式の入力フォームなどにも利用できます。一方で、「name="data[key][subkey]"」のように多次元配列になる場合には、ネストされたループが必要です。構造を把握して正確に処理できるよう、送信元のHTML設計に工夫しなければいけません。
name属性を設定するコツ
POSTデータを正確に受け取るには、フォーム側のname属性の付け方が非常に重要です。たとえば項目数が多いフォームや、JavaScriptで入力フィールドを動的に追加する場合には、name属性に[]をつけるとPHPで配列として受信できるため、foreachを使った処理がしやすくなります。
name属性の使い分けのヒントは次の表を参考にしてください。
name属性 | PHPでの取得形式 | 主な用途 |
---|---|---|
name="email" | $_POST['email'] | 単一のテキスト入力 |
name="hobby[]" | $_POST['hobby'](配列) | 複数のチェックボックス |
name="user[id]" | $_POST['user']['id'] | 入れ子構造(多次元配列) |
また、動的に追加される要素には、連番や一意の識別子を組み合わせてname属性を設定することで、データの衝突や欠損を防げます。逆に、nameが重複していたり空欄だったりすると、送信データが意図しない形で処理される恐れがあるため注意しなければなりません。
POST処理を正しく行うには、フロントエンド側のフォーム構造と、PHP側の受信ロジックをあわせて設計しなければいけません。
関連記事
Laravel【PHP】とは?入門のためのインストール方法やコード付きで使い方をわかりやすく解説
4.PHPでPOST送信されたJSONデータを処理する方法
Web開発の現場ではHTMLフォーム以外からデータをPOST送信することがあります。JavaScriptのfetchやバックエンドからJSON形式のデータをPOSTするケースは、API連携や非同期通信に欠かせません。
ここでは、JSONデータをPOST送信する方法や、そのJSONデータPHPで受信し解析する方法を紹介します。
PHP処理するためのpost送信をフォームを使わず実現する
JavaScriptのfetchを使えば、フォームを使わずにJSONデータをPHPへPOST送信可能です。
コード例
const data = { name: "Taro", email: "taro@example.com" }; fetch("receive.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.error("エラー:", error)); |
このコード例では、Content-Typeにapplication/jsonを指定し、bodyにJSON形式の文字列を渡しているため、PHP側では$_POSTではなく、リクエストボディを直接読み取って解析する必要があります。
fetchでJSONをPOST送信する方法は、フォームでは実現しづらい非同期なデータ送信や、動的に構築したデータのやり取りに適しています。
PHPでJSONデータを受信する
fetchで送られたJSONデータは、$_POSTには格納されません。代わりにPHPでは「file_get_contents("php://input")」を使って、リクエストボディを直接読み取る必要があります。
受信処理のコード例
<?php $json = file_get_contents("php://input"); $data = json_decode($json, true);
$name = $data['name']; $email = $data['email']; echo "受信した名前:$name<br>"; echo "受信したメールアドレス:$email"; } else { echo "無効なJSONデータです。"; } ?> |
ここで重要なのは、json_decode()の第2引数にtrueを指定して連想配列としてデコードしている点です。連想配列としてデコードしておくことで、通常の$_POSTと同じような感覚でデータを扱えます。なおJSONが不正な形式だった場合に備えて、is_arrayなどを使って型チェックを入れておくとさらに安心です。
HTTPヘッダーにはContent-Typeヘッダーの指定が重要
PHPでJSONを正しく受け取るには、送信側でHTTPヘッダーが適切に設定されている必要があります。特に重要なのがContent-Typeヘッダーの指定です。送信時には「Content-Type: application/json」と明示することが基本です。
一方、PHP側ではContent-Typeがapplication/jsonであることを確認した後にfile_get_contentsを実行すれば、データの整合性をより確実に保てます。
セキュリティ対策として、想定外の形式や不正なデータが送信された場合は処理を中断し、適切なレスポンスを返すことも重要です。また、JSONのサイズ制限を設けたり、CSRFトークンによる検証を実装することも推奨されます。
5.PHPでPOST送信後に遷移させる方法
フォームのPOST送信が完了したあと、確認画面や完了ページへ自動的に遷移させたい場合があります。ここでは、PHPのheader関数を使ったリダイレクトの基本、POST-Redirect-GETパターン(PRGパターン)やセッションによるデータ引き継ぎを解説します。
header("Location:URL") の使い方
PHPでPOST送信後に別のページへ遷移させたいときは、header関数を使用しましょう。
コード例
<?php $name = $_POST['name']; header("Location: thanks.php"); exit; ?> |
header("Location: URL")は、HTTPレスポンスヘッダーとしてページ遷移する命令をブラウザに送ります。注意しなければいけないのは、この関数は出力前に実行しなければいけない点です。HTMLを表示する前に実行しないと「headers already sent by~」(ヘッダーはすでに送信されました)というエラーになってしまいます。
また、リダイレクト処理の直後には必ずexit;を入れて、それ以降の処理を中断するようにしてください。不要な処理の実行や誤ったレスポンス出力を防げます。
二重送信を防ぐPOST-Redirect-GETパターン
フォームのPOST送信後にページをリロードすると、ブラウザによっては「フォームの再送信確認」が表示されることがあります。これは、POSTメソッドが再度実行されるため、データの二重登録や重複送信のリスクにつながります。回避する方法として広く用いられているのが、POST-Redirect-GET(PRG)パターンです。
基本的な流れは次のとおりです。
フォーム送信(POST)
↓
処理を実行
↓
Locationヘッダーでリダイレクト
↓
GETメソッドで遷移先ページを表示
PRGパターンを適用すると、ブラウザの再読み込み時にはGETリクエストが再実行されるため、POSTによるデータ送信は繰り返されません。
コード例
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { header("Location: complete.php"); exit; } ?> |
セッション変数を活用したデータ保持
POST送信後にリダイレクトを行うと$_POSTの内容は失われますが、遷移先のページでも入力データを表示したい場合には、セッション変数を使って一時的にデータを保持する方法を使いましょう
コード例
<?php session_start(); if (isset($_POST['name'])) { $_SESSION['name'] = $_POST['name']; header("Location: confirm.php"); exit; } ?> |
遷移先のconfirm.phpでは、次のようにセッション変数からデータを取得可能です。
<?php session_start();
?> |
なお、処理完了後にはセッションを破棄するか、unsetで該当変数を削除することも忘れないようにしてください。
6.PHPでPOSTデータが取得できない?
POST送信したのに、PHPでPOSTデータが取得できないことが起こることがあります。ここでは、POSTデータが取得できないときに確認すべきポイントを解説します。
$_POSTが空になっていないか?
POST送信後に$_POSTが空になった場合、PHP側で値を取得できません。
まず、次の点を確認しましょう。
フォームのmethod属性がpostになっていますか?
フォームにname属性が正しく設定されていますか?
HTMLの送信ボタンがsubmitになっていますか?
JavaScriptでフォーム送信を中断していませんか?
送信そのものが行われていなければ、PHPには何も届きません。POSTリクエストが正しくサーバーへ到達しているかどうかを確認することも忘れないでください。
詳細を確認するためには、PHPファイルの先頭にvar_dump($_POST);を記述して、配列の中身を直接確認することもおすすめです。
HTML構文やname属性を確認しましょう
PHPでPOSTデータを受け取るためには、HTMLフォームに記述されたname属性がとても重要です。name属性が欠けていると、どんなに入力して送信しても$_POSTには値が入りません。
name属性がないコード例
<input type="text" value="Taro"> |
正しいコード例
<input type="text" name="username" value="Taro"> |
また、フォームタグの中にinputが正しくネストされていないと、ブラウザ側で送信自体が無効化される場合があります。ブラウザの開発者ツールなどを使って、構文エラーがないか確認しておきましょう。
PHPの設定値は妥当ですか?
$_POSTが空になる原因のひとつとして、PHPの設定値を超えるサイズのデータを送信している可能性もあります。特にファイルアップロード時や大きなテキスト入力を扱う場合は注意しなければなりません。ぜひ次の値を確認してください。
post_max_size:POST全体の最大許容サイズ
upload_max_filesize:アップロードファイルの最大サイズ
max_input_vars:受け取れる入力項目数の上限
これらの設定値を超えるとPHPは入力を自動的に無視し、$_POSTは空になってしまいます。.htaccessやphp.iniでこれらの値を調整するか、データ量を制限する工夫してください。
7.PHPでPOST送信を安全に処理するためのセキュリティ対策
PHPでPOST送信を安全に処理するためには、セキュリティ対策が欠かせません。フォームを通じて送られてくるデータは改変される可能性があります。悪意あるコードが混入すれば、サイト改ざんや情報漏洩といった被害につながる恐れもあります。
ここではPOST処理における代表的なセキュリティリスクと、最低限実装しておくべき対策を紹介します。
クロスサイトスクリプティング対策
クロスサイトスクリプティング(XSS)とは、悪意のあるスクリプトをWebページに挿入し、他のユーザーの情報を盗み取る攻撃です。POSTされたデータを画面に表示するときに、適切な処理をしないままechoで出力してしまうとXSSの原因になります。
安全に表示するためにはhtmlspecialchars関数を使ってHTMLタグを無効化することが基本的な対策です。htmlspecialchars関数は「<」 や「 >」などの記号をエスケープし、ブラウザにそのまま文字列として表示させます。ENT_QUOTESを指定すると、シングルクォートとダブルクォートの両方が変換されるためより安全です。
XSSは非常に多様な手口があるため、すべての出力処理にエスケープを徹底しておきましょう。
クロスサイトリクエストフォージェリ対策
クロスサイトリクエストフォージェリ(CSRF)とは、ユーザーが意図しないリクエストを強制的に実行させる攻撃です。ログイン中のセッションを悪用して、勝手にフォームを送信させることもできるため、POST処理では必ず対策しましょう。
代表的な防御方法は、ワンタイムトークンであるCSRFトークンを使うことです。
コード例:フォーム生成時のトークン発行
<?php session_start(); $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); ?>
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <!-- その他のフォーム要素 --> </form> |
コード例:送信先でのトークン検証
<?php session_start();
die("不正なリクエストです。"); } // トークンの使い回しを防ぐため、使用後は削除 unset($_SESSION['csrf_token']); ?> |
セッションと一致しないトークンが送られてきた場合は、処理を中断してエラーメッセージを表示します。トークンの有効期限や再利用防止など、細かい対策を加えることで、より堅牢な仕組みになりますので工夫してみてください。
バリデーションとサニタイズの実装
POSTデータの安全性を確保するには、入力値の検証(バリデーション)と不要な情報の除去(サニタイズ)を組み合わせて行うことが有効です。
バリデーションとは?
入力値が期待される形式であるかどうかを検証・判定する処理です。
コード例:メールアドレスかどうかを検証する
$email = $_POST['email'];
echo "メールアドレスの形式が正しくありません。"; } |
サニタイズとは?
有害な文字や記号を取り除いて、安全な状態に整える処理です。
コード例:文字列からタグや記号を除去する
$name = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS); |
バリデーションとサニタイズを上手く取り入れることで、予期しない入力に対する耐性が大幅に向上します。FILTER_SANITIZE_STRINGはPHP 8.1以降で非推奨となっています。代わりにFILTER_SANITIZE_SPECIAL_CHARSやhtmlspecialchars()を使用しましょう。
filter_inputの活用
PHPではfilter_input関数を使えば、POSTデータの取得と検証・サニタイズを一括で行えます。
コード例
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS); $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); |
このコード例では、$_POST['name']をサニタイズし、$_POST['email']が正しいメール形式かどうかをチェックできます。
ただしfilter_inputはフォームが実際にPOSTされたときにしか値を取得できず、手動で$_POSTを書き換えた場合には動作しないことがあるので注意してください
第3引数で指定するフィルターには、FILTER_VALIDATE_INT、FILTER_SANITIZE_EMAILなど様々用意されています。
関連記事
8.PHPのPOST処理でよくある質問(FAQ)
ここではPHPのPOST処理に関してよくある質問とその回答を紹介します。
GETとPOSTは同時に使えますか?
はい、GETとPOSTは同時に使えます。たとえば、URLにクエリパラメータ(GET)を含めつつ、フォームではPOSTで送信するという構成も問題ありません。
配列や多次元データはPOST送信できる?
はい、HTMLフォームでname属性に工夫を加えることで、配列や多次元配列としてPOST送信することが可能です。
配列を送信するコード例
<input type="text" name="colors[]"> <input type="text" name="colors[]"> |
PHP側で取得するコード例
$name = $_POST['colors']; |
多次元配列を送信するコード例
<input type="text" name="user[name]"> <input type="text" name="user[email]"> |
PHP側で取得するコード例
$name = $_POST['user']['name']; $email = $_POST['user']['email']; |
JavaScriptで動的にPOSTする項目を増やす場合も、[]や連想形式を使うと柔軟に対応できます。
9.まとめ
本記事ではPHPでPOST送信を扱うための基本構文から応用的なJSON送信、セキュリティ対策、トラブル時の対応方法までを徹底的に解説しました。HTMLフォームとの連携や、配列・多次元データの受信、POST-Redirect-GETなど、実務でも役立つ知識もたくさん触れています。
フォーム送信の仕組みをしっかり理解し、安全かつ正確にデータ処理ができるようになることで、Webアプリケーション開発の基本知識が大きく強化されることでしょう。ぜひ参考にして役立ててください。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。
自身に最適なフリーランスエージェントを探したい方はこちらよりご確認いただけます。