*

【PHP】メールフォーム 一度入力した内容が消えてしまう時 POST使って入力内容を保持 ~メールフォームパッケージダウンロードあり~

公開日: : 最終更新日:2013/06/24 how to, ウェブ・ネット・PC(パソコン), サーバ・プログラム

前に、

【PHP】スマホ対応 メールフォーム設置 PEARを使ってgmailのsmtpサーバで送信する(ダウンロード可能)

っちゅう、クソ長ったらしいやつ書きまして。。。

まあこれでメールフォーム(お問い合わせフォーム)はある程度良いのですが一つ問題が。。。

例えばこんな感じでフォーム入力します。

form01

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

form02

こんな感じでエラーが返されます。

「しょうがねえなあ、入れるか」と戻るボタンを押すと、

form03

叫びの壷 (ツボ つぼ)
なんでじゃーーーーー!

これまでに苦労して入力した内容が消えてしまうってことが起こってしまうのでした。

叫びの壷(叫びの壺)
叫びの壷(叫びの壺)

posted with amazlet at 13.06.21
ドリーム
売り上げランキング: 102,079

これは非常にもったいないです。

せっかく自分のサイトでお問い合わせまでしてくれているのに、

C777_senbeiwotabeteMBA

もういいや、メンドクサイ

ってなったら、超もったいないです。

で、対策を考えなければ!

なんですが、僕みたいに何も考えずにお問い合わせフォーム作っていて、、、

◆入力した内容の間違えに気づいたり
◆エラー(必須項目未入力とか)

で、戻った時にこれまで入力した内容が消える場合と消えない場合があるのですが、これはブラウザに依存する、それすわち

相手(の設定や環境)に依存する

というわけです。

サービスの提供者としては相手側の設定によって挙動が変わったりするのはやっぱり良くないです。

ウェブサイトのブラウザ対応についても

うちのサイトはChromeで見てね。それ以外はぐちゃぐちゃになるから

とかいうサイト嫌ですよね?

まあIE6のシェアは大分低くなってきて、その割に対応するのに労力が半端ないから予算次第では切り捨てるみたいなことはありますけど。。。

この俗に言う「フォーム内容消えちゃう糞ボケ問題」キャッシュのコントロールで制御することが多いです。

何も考えずにフォームを作ると、入力内容確認ページ(このパッケージの場合はConfirm.php)の「戻る」ボタンおよび「内容を修正する」ボタンは以下のソースです。

1<INPUT TYPE='BUTTON' VALUE = '戻る' onClick='history.back()' >

この「onClick=’history.back()’」は、ブラウザの戻るボタンと基本的には同じ動きをします。

ここでキャッシュが残っているかはさっき言ったブラウザによるよね?というわけで、すなわち相手次第です。

で、そのキャッシュを残す残さないを制御する方法があり

1session_start();
2session_regenerate_id(true);

の部分を

のみにするとか、いろいろ記事が出てきますが、これでも利かない事象があったりと、僕も詳しくないのでわかりませんが、やっぱり相手の設定や環境・ブラウザに依存しちゃうのかな?

って感じです。

というわけで、今回は前公開したPHPのメールフォームを少し改良して、タイトルの通り、入力した内容を戻ったり修正するまでもphpのpostっていうので、しっかり保持をしよう、というアプローチで作りました。

と、僕があみだしたみたいに言ってるけど、よくやる方法です。

そして、改良したのがこちら。

ご自由にダウンロードして頂いて、自分のサイトに実装してみてね(^^ゞ

button_download_orange

パッケージ内容ですが、

new_kaiso

前回から変わったのが、

◆Confirm.phpを修正
→戻ったり、内容を修正するときも、入力したデータを保持するようにした。

◆index2.phpを追加
→Confirm.phpから保持されたデータを受け取れる用にhtmlじゃなくてphpファイルを用意

てな感じです。

全体のフローとしては、

phpflow

てな感じです。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部分のみね。

1<?php
2 
3//メールアドレスが変じゃないかチェック
4//全角だったり@が無かったり
5    error_reporting(E_ERROR & ~E_NOTICE & ~E_PARSE);
6    function filter($str) {
7    $rtn = false;
8    if ( ereg("^[^@]+@[^.]+\..+", $str) ) {
9        $rtn = true;
10    }
11    return $rtn;
12    }
13 
14 
15//特殊文字があったら変換
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"]);
23                 
24//半角カタカナと全角数字を変換
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");
32 
33//magic_quotes_gpc=onのときにのみエスケープを解除
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);
42        }
43 
44//必須項目が未入力の時エラー出す
45    $f = true;
46    if($namesei == null) {
47        $f = false;
48            print("<br><br>・お名前(姓)が入力されていません。<br> ");
49                }
50 
51    if ($namemei == null) {
52        $f = false;
53            print("<br><br>・お名前(名)が入力されていません。<br> ");
54                }
55 
56    if ($mailzz == null) {
57        $f = false;
58            print("<br><br>・メールアドレスが入力されていません。<br> ");
59                }else if(!filter($mailzz)) {
60        $f = false;
61            print("<br><br>・メールアドレスが正しく入力されておりません。全角半角をご確認下さい。<br> ");
62                }
63 
64    if ($telzz == null) {
65        $f = false;
66            print("<br><br>・電話番号が入力されていません。<br> ");
67                }
68 
69    if ($numberzz == null) {
70        $f = false;
71            print("<br><br>・人数が指定されていません。<br> ");
72                }
73 
74    if($textzz == null) {
75        $f = false;
76            print("<br><br>・内容が入力されていません。<br> ");
77                }
78 
79//全部ちゃんと入力されたので、入力内容を表示
80    if ($f== true) {
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>
90</table><br><br><br>
91                ");
92                     
93//入力されたものをSend.phpもしくは修正用のindex2.phpに入れる
94print ("<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>
103        </form>
104        <br><br>
105 
106         
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>
116        </form>
117                     
118        ");
119 
120}else{
121 
122//エラーで戻る場合も修正用のindex2.phpに入れる
123print  ("<br><br><br>
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>
133        </form>
134                    ");
135            }
136 
137     
138?>

ポイントは最後のフォームを「送信する」「戻って修正する」のところで、改良前は

1<INPUT TYPE='BUTTON' VALUE = '戻る' onClick='history.back()' >

のところが

1<form  method='post' action='index2.php'>
2
3
4(中略)
5
6
7<center><INPUT TYPE='SUBMIT' VALUE='戻る' ></center>

って言う風にhistory.backじゃなくてpostのSUBMIT使って、情報を受渡してるところですね!

続いて

index2.php

これは一応全部ね。htmlとphp混在してるから。

1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
4<title>フォーム入力画面</title>
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" />
7</head>
8 
9<body>
10<h1>フォーム入力画面</h1>
11 
12<?php
13 
14//値を最初にクリアしとく
15$groupzz = '';
16$namesei = '';
17$namemei = '';
18$mailzz = '';
19$telzz = '';
20$numberzz = '';
21$textzz = '';
22 
23//各項目前ページから内容があれば入れる
24if ($_POST) {
25    $groupzz = $_POST["groupzz"];
26}
27if ($_POST) {
28    $namesei = $_POST["namesei"];
29}
30if ($_POST) {
31    $namemei = $_POST["namemei"];
32}
33if ($_POST) {
34    $mailzz = $_POST["mailzz"];
35}
36if ($_POST) {
37    $telzz = $_POST["telzz"];
38}
39if ($_POST) {
40    $numberzz = $_POST["numberzz"];
41}
42if ($_POST) {
43    $textzz = $_POST["textzz"];
44}
45     
46?>
47 
48<form name="form1" method="post" action="Confirm.php">
49<p><font color="#ff0000">*</font>は必須項目です</p>
50▼団体名(任意)<br>
51<input name="groupzz" type="text" value="<?= htmlspecialchars($groupzz, ENT_QUOTES, 'Shift_JIS'); ?>">
52▼お名前<font color="#ff0000">*</font><br>
53
54<input type="text" name="namesei" value="<?= htmlspecialchars($namesei, ENT_QUOTES, 'Shift_JIS'); ?>">
55<br>名
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>
69</select>
70▼内容<font color="#ff0000">*</font><br>
71<textarea name="textzz" ><?= htmlspecialchars($textzz, ENT_QUOTES, 'Shift_JIS'); ?>"</textarea>
72<p>
73<input type="submit" value="確認画面に進む">
74</p>
75</form>
76</body>
77</html>

こっちのポイントはフォームの中でvalueの中に受け取ったこれまでに入力された内容を入れてるところです。

1<input name="groupzz" type="text" value="<?= htmlspecialchars($groupzz, ENT_QUOTES, 'Shift_JIS'); ?>">

これによって、自分で入力したデータがフォームの中に入るよね!ってことです。

めでたしめでたし!!

即戦力になるための PHPシステム開発の教科書
マッキーソフト株式会社
技術評論社
売り上げランキング: 68,078
PHPによるWebアプリケーションスーパーサンプル 第2版
西沢 直木
ソフトバンククリエイティブ
売り上げランキング: 16,761

関連記事

【googleガジェット】自分のサイトのアクセスのページとかに自宅からの交通費とかを簡単に調べられるやつを設置 2/2~具体的なhowto~

これの続きです。 で、具体的な方法。 説明したgoogleガジェットに、goog

記事を読む

「いま、IS01を想う。」に想う。。。おっさんくさい話。

川脇議員に貴重なお時間を割いていただき、インタビューをさせて頂いたのですが。 知多市議会議員「

記事を読む

【CentOS,vsftp,Linux(UNIX)】FTPユーザーアカウントの作成とディレクトリのアクセス制限覚書

外注先にサイトの作成やシステムの構築などを依頼する場合に、特定のディレクトリ(フォルダ)以外にアクセ

記事を読む

【PHP】〓WordPressとかで便利〓Internet Explorerの古いバージョンの場合は違うページにリダイレクトさせる 概要編 1/2

IE6作った奴は世界中のwebデザイナーに土下座しろよ— dtsuka (@dtsuka

記事を読む

【WordPress】静的htmlサイトをフルCMS化するときにURLを変えないためのパーマリンク自由自在プラグイン「Custom Permalinks」

静的htmlサイトをCMS化(WordPress化)するメリット 一家にひとつは古い静

記事を読む

お金がなくて、時給が低いことの楽しさ

こんなサイトをたまたま見つけました。 はじめての自作PCで自宅サーバーをはじめた PCケ

記事を読む

【PHP】曜日と時間を検出して、いつまでに対応するかを表示する

営業時間中であれば、お問合わせいただいてから何分以内に対応しますよという文句を自動で表示したい。

記事を読む

lightbox(ライトボックス)のバージョン2.51からPrototypeじゃなくてjQueryになったから設置の時注意

lightbox(ライトボックス)について前記事を書きました。 lightboxって何?って感

記事を読む

追尾メニューのAdSense削除の件

このサイトへのお問い合わせで、以下のような内容のご指摘を頂きました。 サイドメニューの追尾広告

記事を読む

【simフリー端末】asus「ZenFone 5 (A500KL)」をキャンペーンで無料GETしたけど。。。auのiPhone simでは使えず(;O;)

どうも、ラッキーマンよろしくのとてつもないツキを持った男ことボクです。 とっても! ラッキーマ

記事を読む

Comment

  1. 伊藤広樹 より:

    参考にさせていただきました!
    ありがとうございます!

    function h($s)
    {
    return htmlspecialchars($s, ENT_QUOTES, “UTF-8”);
    }

    関数を一度設定すると、何度も長いコードを書かなくて(ペースト)する必要がなくなると思います!

    お互いがんばりましょう!

Message

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  • 高橋拓郎39歳)
    愛知県知多市生まれ。
    大学在学中に個人で始めた事業を、大学院中退後法人化(法人化のために中退が正しいかも)。
    簡単にコンタクトとれるのでt@takuro.infoまで何か御用があればなんなりと。
    ブログの感想やご意見も大歓迎です!
no image
確定申告がなかなかできないやつは甘え~僕みたいな貧乏人は1分1秒でも早くやるんだわ~

確定申告の時期ですね。 で、決まってこの時期になると、 確

人生はサウナ理論~結婚するあなたへ~

人生はサウナ理論。 というのを、敬愛するさんちゃんの名言「生きて

e-taxでの確定申告のもにょもにょ(noteからの転載)

この記事は2016年にnoteに投稿した記事の転載です。 ちょう

【感想】Netflixオリジナルドラマ『Jimmy〜アホみたいなホンマの話〜』 オクレさんもはや本人でしょ??

Netflixオリジナルドラマ『Jimmy〜アホみたいなホンマの話〜』

【javaScript】2017年版 法人税実効税率 シミュレーション 自動計算機(コードも置いとくね)

今日は4/3だからこれは嘘じゃないよ!! 法人税実効税率

→もっと見る

S