【PHP】メールフォーム 一度入力した内容が消えてしまう時 POST使って入力内容を保持 ~メールフォームパッケージダウンロードあり~
公開日:
:
最終更新日:2013/06/24
how to, ウェブ・ネット・PC(パソコン), サーバ・プログラム
前に、
【PHP】スマホ対応 メールフォーム設置 PEARを使ってgmailのsmtpサーバで送信する(ダウンロード可能)
っちゅう、クソ長ったらしいやつ書きまして。。。
まあこれでメールフォーム(お問い合わせフォーム)はある程度良いのですが一つ問題が。。。
例えばこんな感じでフォーム入力します。

「電話番号は営業の電話とかうっとおしいから入れたくないな」なんて感じで必須項目だったけど入力しなかった場合、

こんな感じでエラーが返されます。
「しょうがねえなあ、入れるか」と戻るボタンを押すと、


なんでじゃーーーーー!
これまでに苦労して入力した内容が消えてしまうってことが起こってしまうのでした。
これは非常にもったいないです。
せっかく自分のサイトでお問い合わせまでしてくれているのに、

もういいや、メンドクサイ
ってなったら、超もったいないです。
で、対策を考えなければ!
なんですが、僕みたいに何も考えずにお問い合わせフォーム作っていて、、、
◆入力した内容の間違えに気づいたり
◆エラー(必須項目未入力とか)
で、戻った時にこれまで入力した内容が消える場合と消えない場合があるのですが、これはブラウザに依存する、それすわち
相手(の設定や環境)に依存する
というわけです。
サービスの提供者としては相手側の設定によって挙動が変わったりするのはやっぱり良くないです。
ウェブサイトのブラウザ対応についても
うちのサイトはChromeで見てね。それ以外はぐちゃぐちゃになるから
とかいうサイト嫌ですよね?
まあIE6のシェアは大分低くなってきて、その割に対応するのに労力が半端ないから予算次第では切り捨てるみたいなことはありますけど。。。
この俗に言う「フォーム内容消えちゃう糞ボケ問題」キャッシュのコントロールで制御することが多いです。
何も考えずにフォームを作ると、入力内容確認ページ(このパッケージの場合はConfirm.php)の「戻る」ボタンおよび「内容を修正する」ボタンは以下のソースです。
1 | < INPUT TYPE = 'BUTTON' VALUE = '戻る' onClick = 'history.back()' > |
この「onClick=’history.back()’」は、ブラウザの戻るボタンと基本的には同じ動きをします。
ここでキャッシュが残っているかはさっき言ったブラウザによるよね?というわけで、すなわち相手次第です。
で、そのキャッシュを残す残さないを制御する方法があり
2 | session_regenerate_id(true); |
の部分を
のみにするとか、いろいろ記事が出てきますが、これでも利かない事象があったりと、僕も詳しくないのでわかりませんが、やっぱり相手の設定や環境・ブラウザに依存しちゃうのかな?
って感じです。
というわけで、今回は前公開したPHPのメールフォームを少し改良して、タイトルの通り、入力した内容を戻ったり修正するまでもphpのpostっていうので、しっかり保持をしよう、というアプローチで作りました。
と、僕があみだしたみたいに言ってるけど、よくやる方法です。
そして、改良したのがこちら。
ご自由にダウンロードして頂いて、自分のサイトに実装してみてね(^^ゞ

パッケージ内容ですが、

前回から変わったのが、
◆Confirm.phpを修正
→戻ったり、内容を修正するときも、入力したデータを保持するようにした。
◆index2.phpを追加
→Confirm.phpから保持されたデータを受け取れる用にhtmlじゃなくてphpファイルを用意
てな感じです。
全体のフローとしては、

てな感じです。2点、補足として
なんでindex2.phpなんて作ったの?
index.htmlをPHPにすりゃいいじゃん!
もちろんそれでも問題無いですし、むしろそのほうがシンプルでファイルも少なくスッキリしますが。。。
「稼働中のサイトでフォームのところはhtmlで作っちゃってるよ(>_<)」
ってひとは、「お問い合わせはこちら」のリンク先が変わると、かなり面倒くさいよね?
なのでフォームが書いてあるhtmlは生かしで、新たにphpファイルをこさえたです。
というわけなので、index2.phpはindex.htmlとhtml部分は全く同じで、phpが追加されてるだけです。
それはいいけどさぁ、
index2.phpじゃなくてindex.phpのがよくない?
てか「2」ってなに、ダサっ!
これはhtaccessやhttpd.confとかでURLの正規化してたりしている人のためです。
index.htmlやindex.phpとかはURLに表示させないってやつね。
そうするとindex.htmとやindex.php両方混在するとなんか問題起きそうじゃね?ってことでindex2.phpっていう風にしてるです。
で、一応改変した「Confirm.php」と、追加でこさえた「index2.php」のソースもこちらに載せときますね。
Confirm.php
PHP部分のみね。
5 | error_reporting (E_ERROR & ~E_NOTICE & ~E_PARSE); |
6 | function filter( $str ) { |
8 | if ( ereg ( "^[^@]+@[^.]+\..+" , $str ) ) { |
16 | $groupzz = htmlspecialchars( $_POST [ "groupzz" ]); |
17 | $namesei = htmlspecialchars( $_POST [ "namesei" ]); |
18 | $namemei = htmlspecialchars( $_POST [ "namemei" ]); |
19 | $mailzz = htmlspecialchars( $_POST [ "mailzz" ]); |
20 | $telzz = htmlspecialchars( $_POST [ "telzz" ]); |
21 | $numberzz = htmlspecialchars( $_POST [ "numberzz" ]); |
22 | $textzz = htmlspecialchars( $_POST [ "textzz" ]); |
25 | $groupzz = mb_convert_kana( $groupzz , "KVa" , "Shift_JIS" ); |
26 | $namesei = mb_convert_kana( $namesei , "KVa" , "Shift_JIS" ); |
27 | $namemei = mb_convert_kana( $namemei , "KVa" , "Shift_JIS" ); |
28 | $mailzz = mb_convert_kana( $mailzz , "KVa" , "Shift_JIS" ); |
29 | $telzz = mb_convert_kana( $telzz , "KVa" , "Shift_JIS" ); |
30 | $numberzz = mb_convert_kana( $numberzz , "KVa" , "Shift_JIS" ); |
31 | $textzz = mb_convert_kana( $textzz , "KVa" , "Shift_JIS" ); |
34 | if (get_magic_quotes_gpc()){ |
35 | $groupzz = stripslashes ( $groupzz ); |
36 | $namesei = stripslashes ( $namesei ); |
37 | $namemei = stripslashes ( $namemei ); |
38 | $mailzz = stripslashes ( $mailzz ); |
39 | $telzz = stripslashes ( $telzz ); |
40 | $numberzz = stripslashes ( $numberzz ); |
41 | $textzz = stripslashes ( $textzz ); |
46 | if ( $namesei == null) { |
48 | print ( "<br><br>・お名前(姓)が入力されていません。<br> " ); |
51 | if ( $namemei == null) { |
53 | print ( "<br><br>・お名前(名)が入力されていません。<br> " ); |
56 | if ( $mailzz == null) { |
58 | print ( "<br><br>・メールアドレスが入力されていません。<br> " ); |
59 | } else if (!filter( $mailzz )) { |
61 | print ( "<br><br>・メールアドレスが正しく入力されておりません。全角半角をご確認下さい。<br> " ); |
66 | print ( "<br><br>・電話番号が入力されていません。<br> " ); |
69 | if ( $numberzz == null) { |
71 | print ( "<br><br>・人数が指定されていません。<br> " ); |
76 | print ( "<br><br>・内容が入力されていません。<br> " ); |
81 | print ("<p>以下の内容でお申込みしてもよろしいでしょうか?</p> |
82 | <table class =\"table-01\" border=\"1\" width=\"100%\"> |
83 | <tr><th>項目</th><th>入力事項</th></tr> |
84 | <tr><td>団体名</td><td> $groupzz </td></tr> |
85 | <tr><td>お名前</td><td> $namesei $namemei </td></tr> |
86 | <tr><td>メールアドレス</td><td> $mailzz </td></tr> |
87 | <tr><td>電話番号</td><td> $telzz </td></tr> |
88 | <tr><td>人数</td><td> $numberzz </td></tr> |
89 | <tr><td>内容</td><td> $textzz </td></tr> |
94 | print ("<form method= 'post' action= 'Send.php' > |
95 | <INPUT TYPE= 'HIDDEN' NAME= 'groupzz' VALUE= '$groupzz' > |
96 | <INPUT TYPE= 'HIDDEN' NAME= 'namesei' VALUE= '$namesei' > |
97 | <INPUT TYPE= 'HIDDEN' NAME= 'namemei' VALUE= '$namemei' > |
98 | <INPUT TYPE= 'HIDDEN' NAME= 'mailzz' VALUE= '$mailzz' > |
99 | <INPUT TYPE= 'HIDDEN' NAME= 'telzz' VALUE= '$telzz' > |
100 | <INPUT TYPE= 'HIDDEN' NAME= 'numberzz' VALUE= '$numberzz' > |
101 | <INPUT TYPE= 'HIDDEN' NAME= 'textzz' VALUE= '$textzz' > |
102 | <INPUT TYPE= 'SUBMIT' VALUE= 'この内容で送信する' ><br> |
107 | <form method= 'post' action= 'index2.php' > |
108 | <INPUT TYPE= 'HIDDEN' NAME= 'groupzz' VALUE= '$groupzz' > |
109 | <INPUT TYPE= 'HIDDEN' NAME= 'namesei' VALUE= '$namesei' > |
110 | <INPUT TYPE= 'HIDDEN' NAME= 'namemei' VALUE= '$namemei' > |
111 | <INPUT TYPE= 'HIDDEN' NAME= 'mailzz' VALUE= '$mailzz' > |
112 | <INPUT TYPE= 'HIDDEN' NAME= 'telzz' VALUE= '$telzz' > |
113 | <INPUT TYPE= 'HIDDEN' NAME= 'numberzz' VALUE= '$numberzz' > |
114 | <INPUT TYPE= 'HIDDEN' NAME= 'textzz' VALUE= '$textzz' > |
115 | <center><INPUT TYPE= 'SUBMIT' VALUE= '内容を修正する' ></center> |
124 | <form method= 'post' action= 'index2.php' > |
125 | <INPUT TYPE= 'HIDDEN' NAME= 'groupzz' VALUE= '$groupzz' > |
126 | <INPUT TYPE= 'HIDDEN' NAME= 'namesei' VALUE= '$namesei' > |
127 | <INPUT TYPE= 'HIDDEN' NAME= 'namemei' VALUE= '$namemei' > |
128 | <INPUT TYPE= 'HIDDEN' NAME= 'mailzz' VALUE= '$mailzz' > |
129 | <INPUT TYPE= 'HIDDEN' NAME= 'telzz' VALUE= '$telzz' > |
130 | <INPUT TYPE= 'HIDDEN' NAME= 'numberzz' VALUE= '$numberzz' > |
131 | <INPUT TYPE= 'HIDDEN' NAME= 'textzz' VALUE= '$textzz' > |
132 | <center><INPUT TYPE= 'SUBMIT' VALUE= '戻る' ></center> |
ポイントは最後のフォームを「送信する」「戻って修正する」のところで、改良前は
1 | < INPUT TYPE = 'BUTTON' VALUE = '戻る' onClick = 'history.back()' > |
のところが
1 | < form method = 'post' action = 'index2.php' > |
7 | < center >< INPUT TYPE = 'SUBMIT' VALUE = '戻る' ></ center > |
って言う風にhistory.backじゃなくてpostのSUBMIT使って、情報を受渡してるところですね!
続いて
index2.php
これは一応全部ね。htmlとphp混在してるから。
3 | <meta http-equiv= "Content-Type" content= "text/html; charset=shift_jis" > |
5 | <meta name= "viewport" content= "width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> |
6 | <link rel= "stylesheet" href= "css/style.css" /> |
25 | $groupzz = $_POST [ "groupzz" ]; |
28 | $namesei = $_POST [ "namesei" ]; |
31 | $namemei = $_POST [ "namemei" ]; |
34 | $mailzz = $_POST [ "mailzz" ]; |
37 | $telzz = $_POST [ "telzz" ]; |
40 | $numberzz = $_POST [ "numberzz" ]; |
43 | $textzz = $_POST [ "textzz" ]; |
48 | <form name= "form1" method= "post" action= "Confirm.php" > |
49 | <p><font color= "#ff0000" >*</font>は必須項目です</p> |
51 | <input name= "groupzz" type= "text" value= "<?= htmlspecialchars($groupzz, ENT_QUOTES, 'Shift_JIS'); ?>" > |
52 | ▼お名前<font color= "#ff0000" >*</font><br> |
54 | <input type= "text" name= "namesei" value= "<?= htmlspecialchars($namesei, ENT_QUOTES, 'Shift_JIS'); ?>" > |
56 | <input type= "text" name= "namemei" value= "<?= htmlspecialchars($namemei, ENT_QUOTES, 'Shift_JIS'); ?>" > |
57 | ▼メールアドレス<font color= "#ff0000" >*</font><br> |
58 | <input type= "text" name= "mailzz" value= "<?= htmlspecialchars($mailzz, ENT_QUOTES, 'Shift_JIS'); ?>" > |
59 | ▼電話番号<font color= "#ff0000" >*</font><br> |
60 | <input type= "text" name= "telzz" value= "<?= htmlspecialchars($telzz, ENT_QUOTES, 'Shift_JIS'); ?>" > |
61 | ▼人数<font color= "#ff0000" >*</font><br> |
62 | <select name= "numberzz" > |
63 | <option value= "" >---</option> |
64 | <option value= "1名" >1名</option> |
65 | <option value= "2名" >2名</option> |
66 | <option value= "3名" >3名</option> |
67 | <option value= "4名" >4名</option> |
68 | <option value= "5名" >5名</option> |
70 | ▼内容<font color= "#ff0000" >*</font><br> |
71 | <textarea name= "textzz" ><?= htmlspecialchars( $textzz , ENT_QUOTES, 'Shift_JIS' ); ?>"</textarea> |
73 | <input type= "submit" value= "確認画面に進む" > |
こっちのポイントはフォームの中でvalueの中に受け取ったこれまでに入力された内容を入れてるところです。
1 | < input name = "groupzz" type = "text" value="<?= htmlspecialchars($groupzz, ENT_QUOTES, 'Shift_JIS'); ?>"> |
これによって、自分で入力したデータがフォームの中に入るよね!ってことです。
めでたしめでたし!!
マッキーソフト株式会社
技術評論社
売り上げランキング: 68,078
西沢 直木
ソフトバンククリエイティブ
売り上げランキング: 16,761
Comment
参考にさせていただきました!
ありがとうございます!
function h($s)
{
return htmlspecialchars($s, ENT_QUOTES, “UTF-8”);
}
関数を一度設定すると、何度も長いコードを書かなくて(ペースト)する必要がなくなると思います!
お互いがんばりましょう!
コメントありがとうございます。
ご指摘確かにですね(笑)
すいません。日々勉強です(^_^;)