PHP・機能実装NOTE 15 / DEVELOPMENT

PHPお問い合わせフォームの作り方|入力・確認・送信完了まで解説

PHPお問い合わせフォームを入力・確認・送信・完了の4段階で解説。POSTの受け取り、入力検証、自動返信、二重送信対策まで全体の流れを学べます。

HTMLとCSSでお問い合わせフォームの見た目は作れたものの、「入力された内容をPHPでどう受け取るの?」「確認画面から送信完了まで、どうつながっているの?」と迷う方は多いでしょう。特にWebデザインやコーディングから学び始めた場合、PHPが登場した瞬間にお問い合わせフォームの難易度が一気に上がったように感じます。

PHPのお問い合わせフォームは、基本的に「入力画面 → 入力内容の検証 → 確認画面 → メール送信 → 送信完了画面」という流れで構成されます。一つひとつの役割を分けて考えれば、すべての処理を一度に理解する必要はありません。

この記事では、PHPお問い合わせフォームの基本構造から、POSTデータの受け取り方、確認画面、入力チェック、メール送信、自動返信、二重送信対策、公開前の確認ポイントまで初心者向けに整理します。実際の制作案件でフォームを扱うために、まず全体像を理解していきましょう。

PHPお問い合わせフォームは入力・確認・送信・完了の4段階で考える

PHPお問い合わせフォームを理解するときは、最初にユーザーの動きを4段階へ分けるとわかりやすくなります。最初は名前やメールアドレス、お問い合わせ内容を入力する「入力画面」です。次に、送信された内容に問題がないかPHPで確認し、ユーザー自身にも内容を見せる「確認画面」へ進みます。

確認画面で問題がなければ、本送信を実行します。このタイミングで管理者への通知メールや問い合わせ者への自動返信メールを送信します。処理が正常に完了したら「送信完了画面」を表示し、受付が完了したことをユーザーへ伝えます。

つまりPHPお問い合わせフォームは、単にmail()などでメールを送るだけの仕組みではありません。入力値を受け取り、内容を検証し、ユーザーに確認してもらい、問題がなければ送信するという複数の処理が連携しています。最初から全部を書こうとせず、それぞれの画面が何を担当するのか整理するところから始めましょう。

入力画面ではHTMLからPHPへ送るデータを整理する

PHPお問い合わせフォームの入口になるのがHTMLの入力画面です。ここでは<form>タグを使い、ユーザーが入力した名前、メールアドレス、お問い合わせ内容などをPHPへ渡します。一般的な問い合わせ内容はURLへ表示させる必要がないため、method="post"を利用することが多くなります。

formタグでPHPの処理先を指定する

action属性には、入力された内容を受け取るPHPファイルを指定します。たとえば確認画面をconfirm.phpとして作るなら、フォーム側の送信先もconfirm.phpにします。

基本的な入力フォームは次のような構造になります。

<form action="confirm.php" method="post">
<div>
<label for="name">お名前</label>
<input type="text" id="name" name="name" required>
</div>

<div>
<label for="email">メールアドレス</label>
<input type="email" id="email" name="email" required>
</div>

<div>
<label for="message">お問い合わせ内容</label>
<textarea id="message" name="message" required></textarea>
</div>

<button type="submit">入力内容を確認する</button>
</form>

name属性とPHP側の項目名を対応させる

PHPへ値を渡すうえで重要なのがname属性です。たとえばname="email"と指定した入力欄は、PHP側で$_POST['email']として取得できます。HTMLとPHPは、この名前を使ってデータを受け渡します。

そのため、案件途中で会社名や電話番号などの入力項目を追加した場合は、HTMLだけでなくPHP側の受け取り処理、確認画面、メール本文なども合わせて変更する必要があります。フォームでは一つの項目が複数の処理につながっていることを意識しておきましょう。

HTMLのrequiredだけで入力チェックを終わらせない

requiredやtype="email"を使えば、ブラウザー側で未入力や簡単な形式ミスを検知できます。これはユーザーの入力を助けるうえで便利ですが、PHP側での入力チェックを不要にするものではありません。

サーバーへ送られた値は、PHP側でも改めて確認します。ブラウザーによるチェックはユーザーを助けるための機能、PHPによるチェックはサーバーで受け取った値を適切に処理するための機能として分けて考えます。

PHPではPOSTされた入力内容を受け取り、サーバー側で検証する

入力画面から送信されたデータは、PHPでは$_POSTを使って取得できます。ただし、送信された値をそのままメール本文やHTMLへ使用するのではなく、まず必要な項目が存在するか、入力内容が想定した形式かを確認します。お問い合わせフォームでは、ブラウザーから届く値を最初から信頼しないことが基本です。

POSTデータを安全に取得する

存在しないキーを直接参照するとPHPの警告につながるため、$_POST['name'] ?? ''のように初期値を用意して取得できます。さらにtrim()を利用すれば、入力値の前後に入った不要な空白を取り除けます。

たとえば名前、メールアドレス、お問い合わせ内容を取得する処理は次のように書けます。

<?php
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');

$errors = [];
?>

必須項目やメールアドレスの形式を確認する

値を受け取ったら、必要な項目が空になっていないか確認します。メールアドレスについては、単純に@が入っているかを見るのではなく、PHPのfilter_var()を利用して形式を検証できます。

たとえば次のような処理です。

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

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

if ($message === '') {
    $errors[] = 'お問い合わせ内容を入力してください。';
}
?>

入力チェックでは用途に応じた条件を決める

お問い合わせフォームでは、すべての項目へ同じチェックを行うわけではありません。名前、お問い合わせ内容、電話番号、郵便番号など、それぞれに適した条件を設定します。

代表的には次のようなチェックがあります。

  • 必須項目が入力されているか
  • メールアドレスなどの形式が正しいか
  • 文字数が上限を超えていないか
  • 選択肢が想定された値になっているか
  • 必要な同意項目が選択されているか

条件を厳しくしすぎると、正しい入力までエラーになる可能性があります。フォームの用途を確認したうえで、本当に必要なチェックを設定しましょう。

また、入力エラーを単に「エラーがあります」と表示するだけでは不親切です。どの項目を、どのように修正すればよいのか具体的に伝えるとユーザーが修正しやすくなります。

確認画面では入力内容を安全に表示し、修正できるようにする

入力内容に問題がなければ確認画面へ進みます。確認画面では、名前、メールアドレス、お問い合わせ内容などをユーザーへ表示し、「この内容で送信してよいか」を確認してもらいます。必ず設置しなければならない画面ではありませんが、入力項目が多いフォームでは送信前の確認として利用されます。

ここで注意したいのが、ユーザーが入力した値をそのままHTMLへ出力しないことです。入力値にHTMLとして解釈される文字が含まれている場合に備え、表示するときはhtmlspecialchars()などを使ってエスケープします。

また、確認画面から入力画面へ戻った場合に、それまで入力した内容がすべて消えてしまうと再入力の負担が大きくなります。セッションやPOSTデータなどを利用して入力値を保持し、修正しやすい導線を作ることも重要です。

確認画面から本送信するときに管理者通知と自動返信を行う

確認画面でユーザーが「送信する」ボタンを押したら、本送信処理へ進みます。ここで管理者へお問い合わせ内容を通知し、必要に応じて問い合わせ者へ自動返信メールを送ります。メール送信では宛先だけでなく、件名、本文、送信元、返信先なども設定します。

管理者通知メールで問い合わせ内容を受け取る

管理者通知は、Webサイト運営者やクライアントが問い合わせ内容を確認するためのメールです。名前、メールアドレス、お問い合わせ本文などを読みやすい形でまとめます。

たとえばメール本文は次のような形にできます。

Webサイトからお問い合わせがありました。

■ お名前
山田 太郎

■ メールアドレス
example@example.com

■ お問い合わせ内容
サービスについて詳しく知りたいです。

自動返信メールで受付完了をユーザーへ知らせる

自動返信メールは、問い合わせを送信したユーザーへ「お問い合わせを受け付けました」と知らせるメールです。受付内容を一緒に記載しておけば、自分が何を送ったのか確認できます。

ただし、自動返信メールへ重要な個人情報をそのまま大量に記載する必要があるかは、フォームの用途に応じて判断します。問い合わせ内容や扱う情報の種類を考慮して本文を設計しましょう。

PHPからのメール送信には送信環境も必要になる

PHPでメール本文を作成しても、実際に配送するためのメール送信環境が必要です。サーバー環境によってはSMTPを利用し、PHPMailerなどのライブラリから認証付きでメールを送信する方法があります。

SMTPを利用するときは、一般的に次のような情報を設定します。

  • SMTPサーバー
  • ポート番号
  • ユーザー名や認証情報
  • TLSなどの暗号化設定
  • 送信元メールアドレス

これらの設定は利用するメールサービスによって異なります。Gmailを利用する場合も、PHP側の設定だけでなくGoogleアカウント側の準備が必要になる場合があります。

FreelanceFormではSMTPによるメール送信や自動返信などをまとめています。具体的な機能についてはPHPお問い合わせフォームの機能一覧で確認できます。

問い合わせ者へ返信しやすい管理者通知にする

フォームから通知メールが届いたあと、クライアントが実際に問い合わせへ返信する場面まで想定しておくと運用しやすくなります。メールを受け取るだけではなく、問い合わせ者のメールアドレスを確認しやすくするなど、対応の流れも考えます。

フォームの開発時には技術的にメールが届くかだけを確認しがちですが、公開後はクライアントが日常的に使います。件名や本文のわかりやすさも含めて設計しましょう。

送信完了画面では二重送信を防ぎ、次の行動をわかりやすくする

メール送信が正常に完了したら、ユーザーへ送信完了画面を表示します。「お問い合わせありがとうございました」「内容を確認後、担当者よりご連絡します」など、受付が完了したことを明確に伝えます。

送信後にリロードしても再送信されないようにする

POSTされたページでそのまま完了画面を表示すると、ユーザーがブラウザーを再読み込みした際にフォームが再送信される可能性があります。そのため、送信処理が完了したあとに別の完了ページへリダイレクトする構成が使われます。

たとえば処理完了後にheader()で完了ページへ移動させます。リダイレクトを行う前にHTMLを出力しないよう注意します。

<?php
// メール送信処理など

header('Location: thanks.php');
exit;
?>

セッションを使ってフォームの状態を管理する方法もある

入力画面、確認画面、送信処理の間でデータを保持するためにPHPのセッションを利用する方法があります。確認画面で修正する場合や、不正な画面遷移を制御する場合にも活用できます。

フォームでセッションを利用する場合は、処理を始めるページでsession_start()を実行し、不要になったデータは送信完了後など適切なタイミングで削除します。

完了画面には次の行動を案内する

送信完了画面では「送信しました」だけで終わらせず、その後の流れがわかるようにすると親切です。

たとえば次のような案内を掲載できます。

  • 返信までのおおよその流れ
  • 自動返信メールが届くこと
  • 届かない場合に確認する内容
  • トップページへ戻るリンク

特に自動返信メールを送るフォームでは、「数分経っても届かない場合は迷惑メールフォルダをご確認ください」など、必要に応じて補足できます。

お問い合わせフォームは送信ボタンを押した瞬間に終わるものではありません。ユーザーが「正常に受付された」と理解できるところまでがフォーム設計です。

PHPお問い合わせフォームを公開する前にセキュリティと動作を確認する

PHPお問い合わせフォームは外部から入力値を受け取るため、公開前の確認が重要です。入力画面が表示され、メールが届けば完成というわけではありません。想定していないデータが送信された場合や、同じフォームが何度も送信された場合なども考慮する必要があります。

出力時のエスケープと入力値の検証を行う

ユーザーから受け取った文字列をHTMLへ表示するときは、表示先に合わせて適切に処理します。確認画面で文字列を表示する場合にはhtmlspecialchars()などを使い、入力された内容が意図せずHTMLとして解釈されないようにします。

また、サーバー側では必須項目、形式、文字数、想定された選択肢などをチェックします。ブラウザー側のJavaScriptやHTML属性だけではなく、PHP側でも検証することが重要です。

不正送信や連続送信への対策も検討する

公開されたフォームには、自動プログラムから大量に送信される可能性があります。フォームの規模や用途に応じて、CSRF対策、連続送信の制限、ボット対策などを検討します。

公開前には次のような項目を確認しておきましょう。

  • 必須項目を空にした場合の動作
  • 不正な形式の値を送った場合の動作
  • 確認画面から戻った場合の入力保持
  • 送信ボタンを連続で操作した場合の動作
  • 送信完了後に再読み込みした場合の動作

正常系だけでなく、ユーザーが間違った操作をした場合にもフォームが破綻しないか確認します。制作案件では、こうした例外時の動作確認まで含めて実装と考えます。

また、ファイル添付を許可する場合は、ファイル形式、容量、保存方法など追加の確認項目が発生します。必要以上の機能を付けず、案件で必要な範囲を明確にすることも大切です。

本番サーバーでメール送信までテストする

ローカル環境でPHPが動いていても、実際のサーバーで同じようにメール送信できるとは限りません。PHPのバージョン、必要な拡張機能、SMTP接続、サーバー側の制限などによって挙動が変わるためです。

公開前には実際の受信先を設定し、入力から確認、送信完了、管理者通知、自動返信まで一連の流れをテストします。FreelanceFormの動作環境や設置手順についてはお問い合わせフォームの導入方法も参考にしてください。

PHPお問い合わせフォームは毎回ゼロから作る必要があるとは限らない

PHPお問い合わせフォームの仕組みを学ぶために、自分で入力画面、確認画面、送信処理、完了画面を一度作ってみることは有益です。どのタイミングでPOSTデータを受け取り、どの値を検証し、どこでメール送信するのかを経験すれば、フォーム全体の構造を理解できます。

一方、実際のWeb制作案件では、同じ確認画面やメール送信処理を案件ごとに毎回ゼロから作ることが目的ではありません。一般的なお問い合わせフォームであれば、動作する土台を用意しておき、案件ごとに入力項目やデザイン、送信先などを変更する方法も効率的です。

特にフリーランスや副業Webデザイナーの場合、限られた制作時間をPHPの共通処理ではなく、クライアントごとのデザインやコンテンツへ使う考え方もあります。自作できる知識を持ちながら、必要に応じてテンプレートを活用することで、対応できる案件の幅を広げられます。

提言:PHPを全部暗記するより、フォーム全体の流れを理解しよう

PHPお問い合わせフォームを学び始めると、関数やコードの書き方をすべて覚えなければ仕事で使えないように感じるかもしれません。しかし、Webデザイナーが最初に身につけたいのは、PHPそのものを暗記することではなく「入力されたデータがどこへ行き、どの処理を経てメールになるのか」という全体像です。

入力画面ではHTML、デザインはCSS、操作補助にはJavaScript、入力値の検証やメール送信にはPHPといった役割を理解できれば、既存コードを読むときも修正箇所を判断しやすくなります。現在はAIエージェントを利用してコードの意味を確認したり、項目追加を補助してもらったりする方法もありますが、土台となる構造を理解しているほど指示もしやすくなります。

FreelanceFormは、PHPの送信処理を毎回ゼロから作らず、HTML・CSSを入口に案件へフォームを導入できるよう設計しています。自作の仕組みを理解したうえで制作を効率化したい場合は、FreelanceFormの特徴・強みも確認してみてください。

PHPお問い合わせフォームの作り方に関するよくある質問

PHPお問い合わせフォームには何個のファイルが必要ですか?

決まった数はありません。入力、確認、送信処理、完了をそれぞれ別ファイルに分ける方法もあれば、一つまたは少数のPHPファイル内で処理を切り替える方法もあります。

初心者の場合は、各画面や処理の役割が理解できる構成にすることが大切です。ファイル数の少なさよりも、どこで何を処理しているのか追いやすい設計を優先しましょう。

確認画面は必ず作らなければいけませんか?

確認画面は必須ではありません。入力項目が少ないフォームでは、入力画面から直接送信する構成もあります。一方、住所や複数の選択項目、長文入力などがある場合は、送信前にユーザー自身が内容を確認できるメリットがあります。

サイトの目的、入力項目数、ユーザー層などを考えて必要性を判断します。「お問い合わせフォームには確認画面が必須」と決めつける必要はありません。

PHPのmail関数だけでお問い合わせフォームは作れますか?

メールを送信する処理だけでなく、入力値の受け取り、検証、エラー表示、確認画面、二重送信対策など周辺の処理も必要です。また、実際にメールが配送できるかどうかはサーバー側のメール環境にも影響されます。

SMTPを利用してメールを送る構成もあり、PHPMailerなどのライブラリが使われることもあります。案件のサーバー環境やメールサービスに合わせて送信方法を選択します。

PHPがほとんどわからなくてもお問い合わせフォームを設置できますか?

PHPをゼロから開発する場合は基本的な知識が必要ですが、すでに送信処理が組み込まれたテンプレートやドキュメントを利用して導入する方法もあります。

ただし、完全に仕組みを理解せず設定だけ変更するより、POST、入力チェック、確認、送信という基本の流れは理解しておく方が安全です。問題が起きたときにも原因を切り分けやすくなります。

PHPお問い合わせフォームをクライアントへ納品する前に何を確認すればいいですか?

入力画面から確認・完了までの動作、管理者通知、自動返信、エラー表示、スマートフォン表示などを確認します。また、実際にクライアントが使用するメールアドレスで受信できるか確認することも重要です。

フォームは公開後に継続して使われる機能です。正常に送れることだけでなく、クライアントが問い合わせ内容を確認し、返信しやすい状態になっているところまで確認して納品しましょう。

まとめ:PHPフォームは入力から送信完了までを一つの流れで考える

PHPお問い合わせフォームは、入力画面でデータを受け付け、PHPで内容を検証し、確認画面を経て管理者通知や自動返信を行い、最後に送信完了画面へ進むという流れで構成できます。HTML・CSSだけを見るのではなく、PHPやメール送信環境まで含めて一つの機能として考えることが大切です。

すべてのPHPコードを暗記する必要はありません。まずは入力、検証、確認、送信、完了という役割を理解し、それぞれがどのようにつながっているのかを把握しましょう。一度仕組みが見えるようになれば、自作するときも既存テンプレートをカスタマイズするときも、フォーム制作へのハードルは大きく下がります。

THANKS FOR READING.ページの先頭へ
YOUR NEXT STEPFROM KNOWING TO MAKING. ↗

学んだことを、
次の制作案件へ。

フォームの土台があれば、デザインにもっと向き合える。HTML・CSSで編集できる、買い切りのお問い合わせフォーム。

FreelanceFormを見てみる HTML・CSSで編集 / 10デザイン / 買い切り