PHP応用 コンタクトフォームの作成 入力チェックの追加
前回、作成したコンタクトフォームに入力チェックを追加しましょう。
入力チェックの追加
前回のままでは、名前、メールアドレス、内容どれも空のままでも送信できてしまいます。
なので各項目に以下のようなチェック内容を付加するようにします。
- 名前
1.入力必須
2.20文字以内 - メールアドレス
1.入力必須
2.メールアドレスとして正しいこと - 内容
1.入力必須
上記内容を前回のプログラムに機能追加します。
「confirm.php」を以下のように修正しました。
ソース:confirm.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
<?php $contactname = $_POST["contactname"]; $contactmail = $_POST["contactmail"]; $contents = $_POST["contents"]; //入力チェック $errormsg = array(); //名前 if ($contactname == null) { $errormsg[] = "名前を入力してください。"; } if (mb_strlen($contactname) > 20) { $errormsg[] = "名前は20文字以内で入力して下さい。"; } //メール if ($contactmail == null) { $errormsg[] = "メールを入力してください。"; } $ret = preg_match("/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/", $contactmail); if (!$ret) { $errormsg[] = "メールを正しい形式で入力して下さい。"; } //内容 if ($contents == null) { $errormsg[] = "内容を入力して下さい。"; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>コンタクトフォーム</title> <style TYPE="text/css"> <!-- H1 { color: red; font-size: 18pt; } #contact-form th { background-color: #9bdbea; padding: 10px 20px; } #contact-form td { background-color: #f7f7ef; padding: 10px 20px; } #contact-form td input { width: 400px; } #contact-form td textarea { width: 400px; } form { display: inline; } #errmsg { background-color:#E7D3D6; border:3px solid #A55952; color:#944121; font-size:12px; margin:10px; padding:10px; text-align:left; width:400px; } --> </style> </head> <body> <h1>コンタクトフォーム</h1> <?php if (count($errormsg) > 0): ?> <div id="errmsg"> <?php foreach ($errormsg as $msg): ?> ・<?=$msg?><br /> <?php endforeach; ?> </div> <form action="./confirm.php" method="post"> <table id="contact-form" border="1" cellpadding="0" cellspacing="0"> <tr> <th> 名前 </th> <td> <input type="text" name="contactname" value="<?= $contactname ?>" /> </td> </tr> <tr> <th> メールアドレス </th> <td> <input type="text" name="contactmail" value="<?= $contactmail ?>" /> </td> </tr> <tr> <th> 内容 </th> <td> <textarea name="contents" rows="10"><?= $contents ?></textarea> </td> </tr> <tr> <th colspan="2"> <input type="submit" value="入力"> </th> </tr> </table> </form> <?php else: ?> <table id="contact-form" border="1" cellpadding="0" cellspacing="0"> <tr> <th> 名前 </th> <td> <?= $contactname ?> </td> </tr> <tr> <th> メールアドレス </th> <td> <?= $contactmail ?> </td> </tr> <tr> <th> 内容 </th> <td> <?= $contents ?> </td> </tr> <tr> <th colspan="2"> <form action="./end.php" method="post"> <input type="hidden" name="contactname" value="<?= $contactname ?>"> <input type="hidden" name="contactmail" value="<?= $contactmail ?>"> <input type="hidden" name="contents" value="<?= $contents ?>"> <input type="submit" value="送信" /> </form> <form action="./input.php" method="post"> <input type="hidden" name="contactname" value="<?= $contactname ?>"> <input type="hidden" name="contactmail" value="<?= $contactmail ?>"> <input type="hidden" name="contents" value="<?= $contents ?>"> <input type="submit" value="内容修正" /> </form> </th> </tr> </table> <?php endif; ?> </body> </html> |
これで、入力チェックを行うことができます。
不正な入力値を除いて、正しく入力されている場合のみ最後の送信まで行えます。
例えば、未入力で入力ボタンを押下すると
このように、入力エラーとなり先に進むことができなくなります。
変更した後のデモは「こちら」から確認できます。
今回で入力チェックを行うことができました。
プログラムの考察
ここまでで、コンタクトフォームとしての機能は満たしました。
ですが、プログラムとしてはどうでしょうか?
- 「input.php」
- 「confirm.php」
- 「end.php」
何か無駄な点とプログラムとしてわかりづらい点があります。
- input.phpとconfirm.phpの中に同じHTMLの記述がある
- confirm.phpの中に入力チェックである業務ロジックと画面表示部分であるHTMLのロジックが混在していてプログラムがメンテナンスしづらい
- end.phpの中にメール送信部分と、送信完了画面のHTMLのロジックが混在していてプログラムのメンテナンスしづらい
簡単にプログラムのまずい部分をあげただけでも3つもでてきました。
これくらいの小さなプログラムだったらこれでもいいかもしれませんが、もっと大規模プログラムだったらどうでしょうか?
メンテナンス出来ないとんでもないプログラムが出来上がると思います。
では、どうすればよいでしょうか?
最低、画面表示部分と業務ロジック部分は最低限分ける必要があると思います。
では、その業務ロジックと画面表示部分を分離させる設計方法はどのようにしたら便利になり、ソースコードのメンテナンス性が向上するでしょうか?
ここでソフトウェアの設計手法の一つでMVCモデルというものを紹介したいと思います。
どのようなものかというと
処理の中核を担う「Model」、表示・出力を司る「View」、入力を受け取ってその内容に応じてViewとModelを制御する「Controller」の3要素の組み合わせでシステムを実装する方式
です。
入力はまず、全ての処理を制御するContorollerに処理を委譲します。
Controllerが入力の内容から、適したModelを呼び出し、その結果に応じて必要なViewを表示するように実装します。
今回ならControllerが入力チェックを行うModelを呼び出しその結果に応じて、確認画面を表示するViewを呼び出すかまたは、入力画面のViewを呼び出すように実装されます。
そのような処理を書きますが、毎回、毎回、同様の処理を記述するのはばからしいのでフレームワークというものが先人の知恵で作られています。
フレームワークとは、開発する際に頻繁に必要とされる汎用的な機能をまとめてあるアプリケーションのことです。
次回は、PHPでのMVCフレームワークで私がよく使用しているCodeIgniterというフレームワークについて勉強していきたいと思います。
コメント:2件
トラックバック:1件
メールフォームを使わせてもらいました。
ありがとうございます。
サーバ、さくらを使っています。
メールボックスの受診箱に入っている文面が文字化けしています。。
なぜおきるのか?回避方法など思い当たる節がありましたら、ご教授いただけましたら助かります。
宜しくお願いいたします。
サクラのレンタルサーバではPHPが使用する文字コードがEUCになっています。
なので、プログラムの文字コードをEUCで作成しないと日本語が文字化けしてし
まいます。
プログラムファイルの文字コードをEUCにするとなおると思います。