PHPのフォームで前のページに戻っても入力した内容が消えないようにする
先のPHPから送信したメールがスパム判定されたサーバーで、このメール送信に使うフォームで入力ページ→確認ページと進み、内容を変更するために入力ページに戻ると、入力ページで入力した内容が全て消えてしまうので消えないようにしたいってことで、今度はこの方法を探すことになりました。
このフォームにはテキストボックスの他にセレクトボックスとテキストエリアが設置してあります。
ネットで探したところ、php.iniで「session_cache_limiter = public」にすれば消えなくなるってあったんだけど、これはちょっと他への影響がコワいんでパス。
次にPHPファイルのヘッダー部に以下の6行を追記すれば消えなくなるって記述があったんで早速各ページに貼り付けてテストしてみました。
<?php
header(“Content-Type: text/html; charset=Shift_JIS”);
header(“Expires: Thu, 01 Dec 1994 16:00:00 GMT”);
header(“Last-Modified: “. gmdate(“D, d M Y H:i:s”). ” GMT”);
header(“Cache-Control: no-cache, must-revalidate”);
header(“Cache-Control: post-check=0, pre-check=0”, false);
header(“Pragma: no-cache”);
?>
これでfirefoxとchromeではテキストボックス、セレクトボックス、テキストエアリアともに入力内容が表示されるようになりました。
ところが、IEではセレクトボックスとテキストエリアはやはり空白のままです。ブラウザの良し悪しはともかくとして、世界で一番使われているのはIEですのでIEで表示されなければあんまり意味がないような。。
そこでいろいろ試したところ、、
テキストエリアは当初
<textarea cols=”00″ rows=”00″ name=”message” value=”<?=$test[‘message’] ?>”></textarea>
となっていたのを
<textarea cols=”00″ rows=”00″ name=”message” value=””><?=$test[‘message’] ?></textarea>
にしただけで表示されるようになりました。
テキストボックスなら上のパターンでも表示されるんですが、テキストエリアの場合は確認ページから戻ってきたときに$test[]に入ってるデータを直接表示させないとダメってことみたいです。
それならセレクトボックスも考え方は同じだろうってことで、当初は
<select name=”sports” value=”<?=$test[‘sports’] ?>”>
<option></option>
<option value=”サッカー”>サッカー</option>
<option value=”野球”>野球</option>
<option value=”ラグビー”>ラグビー</option>
<option value=”その他”>その他</option>
</select>
となっていたのを
<select name=”sports” value=””>
<option><?=$test[‘sports’] ?></option>
<option value=”サッカー”>サッカー</option>
<option value=”野球”>野球</option>
<option value=”ラグビー”>ラグビー</option>
<option value=”その他”>その他</option>
</select>
にしてみたら予想通りIEでも表示されました。
が、、セレクトメニューからどれかを選択して確認ページに行ってから戻ると、今度は空白が選択出来ません。
…そりゃ当然ですよね。$test[]にデータが入っちゃったらもう空白行がないんだから。。w
これだと一度何かを選択しちゃうと、後で「やっぱりここは空白のまま送信しよう」って思っても空白は選択出来ません。これはちょっとマズい。。
そこで
<select name=”sports” value=””>
<option><?=$test[‘sports’] ?></option>
<option></option>
<option value=”サッカー”>サッカー</option>
<option value=”野球”>野球</option>
<option value=”ラグビー”>ラグビー</option>
<option value=”その他”>その他</option>
</select>
にしたら、今度は空白行が2行になってしまいます。
…これもまたカッコ悪いっすねぇ。。
それなら、、ってことで
<select name=”sports” value=””>
<?php
if ($test[‘sports’] <> “”) {
echo “<option>”.$test[‘sports’].”</option>”;
}
?>
<option></option>
<option value=”サッカー”>サッカー</option>
<option value=”野球”>野球</option>
<option value=”ラグビー”>ラグビー</option>
<option value=”その他”>その他</option>
</select>
と、$test[sports]にデータがあるときだけ表示させるようにしてみました。
これなら空白行も1行だし、一度選択して進んでから戻ると一番上に選択したデータが表示され、プルダウンに空白行付の選択メニューが表示されるようになり、一度どれかを選択した後に空白を選択し直すことも出来ます。
これならとりあえず文句ねぇべ、、ってことでセレクトボックスの問題も解決。
セッション使ってるフォームなんで他にチャンとしたやり方があるかとは思うけどセッションとかよく分からんし。。
まぁ表示はされるようになったし、フォームは問題なく動作してるから良しってことにしよう。。w
※後からPHPのヘッダー部のsession_start();の前に下の1行を追記すれば消えなくなるって記述を見つけたんで各ページに貼り付けてテストしてみました。
<?php
session_cache_limiter(‘none’);
session_start();
?>
これが大正解だったようです。
セレクトボックスもテキストエリアも上のような技を使うまでもなくIEでも表示されました。
これを一番最初に見つけてればなぁ。。w
こちらの記事で、ハマっていたselectのページ間遷移での情報保持の問題が解決しました。
ありがとうございます。
ajaxを絡めたシステムだったんですが、F5などで更新するとselectのoption情報のみがリセットされていました。
session_cache_limiter(‘none’);
上記がキーポイントでした!!
ザクロさん初めまして。
僕もあちこちでよくハマるんでw ほとんど自分用の備忘録としてこの記事を書いたんですが、お役に立てたようで光栄です。
テキストエリアの表示が消えてしまって困っていたのですが、こちらのおかげで解決できました~TT
ありがとうございます