
PHPで自動返信メール機能付きのコンタクトフォームを作成する(入力画面)
今回はPHPで作成する自動返信メール機能が付いたコンタクトフォームについて。このコンタクトフォームは各フォームパーツへ入力された値を確認画面に表示し、その値をメールで送信するという内容です。
コンタクトフォームの仕組み
コンタクトフォームの画面については、- 1.情報を入力する「入力画面」【form.php】
- 2.入力した情報を確認する「確認画面」【check.php】
- 3.情報を送信し閲覧者へ伝える「送信画面」【send.php】
- 1.入力画面でinputやtextareaなどのフォームパーツに情報が入力される
- 2.入力した情報を値としてPOST形式で確認画面へ送られPOST変数に格納されます
- 3.確認画面で入力された情報が表示される
- 4.POST変数をSESSION変数に格納
- 5.送信画面でSESSION変数の値をメール送信し完了のメッセージを表示する
コンタクトフォームの入力画面
HTMLでまずはフォームのパーツを生成します。その後tableなどでレイアウトを整えます。 【form.php】※一部抜粋<form method="post" action="./check.php">
<?php
//CSRF対策のワンタイムトークン発行
$randomNumber = openssl_random_pseudo_bytes(16);
$token = bin2hex($randomNumber);
echo '<input name="input_token" type="hidden" value="'.$token.'">';
//トークンをセッションに格納
session_start();
$_SESSION['input_token'] = $token;
?>
<table>
<thead>
<tr>
<th colspan="2">
<h1>PHPメールフォームサンプル(入力画面)</h1>
</th>
</tr>
</thead>
<tbody>
<tr>
<th>全角テキスト</th>
<td><input type="text" name="input_text" value="" placeholder="テキストを入力してください"></td>
</tr>
<tr>
<th>カタカナ</th>
<td><input type="text" name="input_kana" value="" placeholder="フリガナを入力してください"></td>
</tr>
<tr>
<th>メールアドレス</th>
<td><input type="text" name="input_email" value="" placeholder="メールアドレスを入力してください"></td>
</tr>
<tr>
<th>電話番号</th>
<td><input type="text" name="input_tel" value="" placeholder="電話番号を入力してください"></td>
</tr>
<tr>
<th>URL</th>
<td><input type="text" name="input_url" value="" placeholder="urlを入力してください"></td>
</tr>
<tr>
<th>郵便番号</th>
<td><input type="text" name="input_zipcode" value="" placeholder="郵便番号を入力してください"></td>
</tr>
<tr>
<th>ラジオボタン</th>
<td>
<label><input type="radio" name="input_radio" value="ラジオボタン選択肢1" selected>ラジオボタン選択肢1</label>
<label><input type="radio" name="input_radio" value="ラジオボタン選択肢2">ラジオボタン選択肢2</label>
<label><input type="radio" name="input_radio" value="ラジオボタン選択肢3">ラジオボタン選択肢3</label>
</td>
</tr>
<tr>
<th>チェックボックス</th>
<td>
<label><input type="checkbox" name="input_checkbox[]" value="チェックボックス選択肢1">チェックボックス選択肢1</label>
<label><input type="checkbox" name="input_checkbox[]" value="チェックボックス選択肢2">チェックボックス選択肢2</label>
<label><input type="checkbox" name="input_checkbox[]" value="チェックボックス選択肢3">チェックボックス選択肢3</label>
</td>
</tr>
<tr>
<th>セレクトボックス</th>
<td>
<select name="input_selectbox">
<option value="" selected>選択してください</option>
<option value="セレクトボックス選択肢1">セレクトボックス選択肢1</option>
<option value="セレクトボックス選択肢2">セレクトボックス選択肢2</option>
<option value="セレクトボックス選択肢3">セレクトボックス選択肢3</option>
</select>
</td>
</tr>
<tr>
<th>複数行テキスト</th>
<td>
<textarea name="input_textarea" value="" placeholder="複数行のテキストを入力してください"></textarea>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2">
<input type="reset" value="リセット">
<input type="submit" value="確認画面へ">
</td>
</tr>
</tfoot>
</table>
</form>
まず、formタグのaction属性には送信先画面であるcheck.phpへのパスを指定します。method属性にはpostの値を指定します。そして、最初に行う処理ですが、CSRF対策として、ワンタイムトークンを発行し、hiddenのインプット要素でPOSTで送信します。合わせて$_SESSIONのグローバル変数にも同じものを入れておきます。この後、確認画面にて、きちんとフォーム経由でデータを送信しているかをトークンを照らし合わせることで確認します。
次に文字入力のinputについては、名前や件名など全角・半角文字が入力される部分には、type属性の値をtextに、電話番号はtelの値、メールアドレスはmailの値、URLにはurlの値をそれぞれ指定します。value属性の値は空にします。name属性はフォームの値を受け渡す際に固有の識別として使います。id属性はここでは必須ではないですが、バリデーションなどで項目の指定する際に使うので、まずはname属性と揃えておきます。
複数行の文字入力はtextareaタグで構成し、name属性を設定します。必要に応じてrows属性、cols属性もそれぞれ指定します。選択肢項目のinputである単一選択のラジオボタンにはtype属性にradioの値を、value属性に項目名を、name属性には任意の値を入れます。
単一選択でもプルダウン式のセレクトボックスにはselectタグとoptionタグで構成し、selectタグのname属性に任意の値を、optionタグのvalueに項目名を入れます。複数選択のinputであるチェックボックスはtype属性をcheckboxに、value属性に項目名を、name属性には任意の値入れた後に” [] ”を追加します。これは複数の項目を選択した際に情報を配列として扱う必要があるためです。ボタンはinputタグもしくはbuttonタグで構成し、それぞれtype属性で指定します。送信ボタンは値をsubmitに、リセットボタンは値をresetに設定します。
重要なのは、
- ・CSRF対策としてワンタイムのトークンを用意する
- ・inputやtextarea、buttonなどの各フォームで扱うパーツを揃える
- ・全てのフォーム部品にname属性を設定する
- ・選択肢項目にはvalueの値を設定する
- ・複数選択のチェックボックスのname属性には値へ” [] ”を追加する
categories
- WordPress(61)
- JavaScript(49)
- Vue.js(48)
- CSS(46)
- jQuery(34)
- Nuxt.js(22)
- Sass(21)
- Gulp(17)
- webpack(16)
- PHP(14)
- HTML(14)
- GSAP(11)
- React(10)
- Vite(9)
- Pug(9)
- Laravel(8)
- Cordova(8)
- Linux(7)
- Next.js(6)
- Apache(5)
- Shopify(4)
- REST API(4)
- Node.js(4)
- Smarty(3)
- Git(3)
- JSON(3)
- その他プログラミング(3)
- Google Apps API(3)
- Bootstrap(3)
- 環境構築・システム(3)
- TypeScript(2)
- EJS(2)
- RMS(2)
- Docker(2)
- Instagram API(2)
- Excel VBA(2)
- SVG(1)
- Dart(1)
- ECカートASP(1)
- Markdown(1)
- AMP(1)
- Nginx(1)
- XML(1)
- shellscript(1)
- Ruby(1)
- MySQL(1)