こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

自身をSubmitを、UPDATEした際、古い結果が表示される。

自身をSubmitを、UPDATEした際、古い結果が表示される。

お世話になっております。

PHPでメンバーのプロフィール編集の画面を作成しております。
テキストボックスの内容には、SELECTで取得してきた現在のデータが入っていまして、
テキストボックスの中身を変更して「更新」ボタンを押すと、
更新ボタンを押した時点でのテキストボックスの内容でUPDATE文を実行します。
更新ボタンがクリックされた際には、JavaScript内でUPDATE_FLG=1を立てて自身にPOSTしています。

この時、UPDATE自体は上手くいくのですが、表示される(取得してくる)のは、
更新前の古いデータのままなのです。(テーブルは更新されています。)
テキストボックスには当然古いデータが表示される為、このまま再度「更新」ボタンを押すと
元に戻ってしまいます。

どうすればUPDATE実行後の最新の結果を表示できるでしょうか?
それとも別のページ(UPDATE処理のみを実行するPHP)を作成し、
その新しいページから戻るようにするのがベターなのでしょうか?
出来る事なら「ボタンを押したら即反映されたのがユーザーに見える」のを実現したいのです。


2000文字制限の為かなりはしょって書きますが、
ソース上から、こんな感じで書いております。
(日本語部分は「そんな事をしようとしてコードが書いてある」と思ってください)

【self.php】

<?php
 セッション開始

更新フラグを確認
更新フラグ格納用文字列を準備
$tempHtml .= "<input type='hidden' id='update_flg' name='update_flg' value=0>";
 IF開始(
 更新フラグが1ならば、テキストボックスの値をPOST
$update_para1 = $_POST['nick_name'];
$update_para2 = $_POST['address'];
 UPDATE実行
 更新フラグを0に初期化
 IF閉じる)

//-------------------------------------------

 セレクト実行
結果行数を取得(エラー判定の為)
 取得データを表示の為の各変数にセット
?>

<html><body>
<?php
  if開始(セレクト結果が0行)(パスワード&IDで対象者なし)
   エラー文
   echo "</body></html>";
   exit;
  if終了
?>

<form action="self.php" name="update_mst" method="post">
<!-- 更新フラグ渡し用 -->
<input type='hidden' id='update_flg' name='update_flg' value=0>

<!-- POST用 -->

<input type= "text" id='nick_name' name='nick_name' value="<?php $nickname ?>">
<input type= "text" id='address name='address' value="<?php $address ?>">
<IMG id="btnupdate" onclick="clickupd();" name="btnupdate">
</form>
</body></html>

【self.js】
function clickupd()
{
document.update_mstedit.submit();
}

投稿日時 - 2010-03-18 01:13:10

QNo.5760496

すぐに回答ほしいです

質問者が選んだベストアンサー

古いデータが表示されるのは、ブラウザがキャッシュを保存し、それを表示している為と考えられます。
キャッシュしないようにするには、すべての出力の前に以下のようなヘッダ内容を事前に出力する事がセオリーとなっています。

header('Last-Modified: '.gmdate( 'D, d M Y H:i:s').' GMT');
header('pragma: no-cache');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 過去の日付

一部の行儀の悪いブラウザは(IE5~6あたりの一部のバージョン)、これを無視してキャッシュする事もあるため完全ではないです。
あくまで、キャッシュしないでね、とお願いしているだけですので。
それでも、上記だけで(最近のブラウザでは)OKでしょう。

他に気になることと言えば、一般的にはJavaScriptと連動させて更新作業をするという事は行われません。
JavaScriptはOffにできるからという理由です。
JavaScriptがOffの環境でも、更新ができるようにするために、すべてHTMLの基本機能(送信等)とPHPだけで作成します。
そのうえで、入力必須項目がすべて入力されているか否かなど、ユーザーにとっての便利機能をJavaScriptで埋め込む事はやります。
※仮にJavaScriptがOffの場合でも便利機能が使えないだけで、すべてのシステム機能はJavaScriptがなくても動作するため。

入力値チェック(必須項目の抜けがないか等)がないかを確認するため、自分自身に投げて確認する事は一般的に行われます。
項目の抜けや、メールアドレスの形式、電話番号の形式が合っているかなどを確認して、ダメならエラーを表示して再入力を求めるというのが楽だからです。
チェックが通れば、別画面に飛ばして『更新しますよろしいですか?』と表示して、OKで更新処理をする画面を付ける事が多いですが。

ちなみに、一般的にはデータベースの更新系のインターフェイスは。
メンバーデータの一覧ページ。表形式で何人ものデータが一覧できる(名前と代表的な情報のみ)。人数が多ければ『次の20人』のリンクが表示されるなど。
メンバーデータの表示ページ。一覧ページから、メンバーの名前をクリックして表示されるページ、メンバーのすべての情報が一覧されている。表示のみ。
メンバーデータ編集ページ-更新確認ページ(よろしいですか?) 質問で言われているページ(メンバーデータの新規入力を兼用する事もある)

わざわざ、一般的なものを紹介するのは、編集-更新が終わった後に飛ぶページは、一般的には編集ページではなく表示ページだとの説明の為です。
更新ページを表示と兼ねるのは、間違ってデータをさわってしまい、しかも更新してしまう可能性を考えてよろしくないと思いましたので、念のために長々と書きました。

一般的かどうかを中心に書いていますので、別に一般的であろうがなかろうが気にしないというスタンスもありですが。

投稿日時 - 2010-03-18 02:21:20

お礼

BellBellさん、お世話になっております。
前回の質問に続き、ありがとうございます。

最新の表示自体は、キャッシュの件のみでクリアできそうですが、
入力画面と表示画面を分けるという一般例とその理由が非常に参考になりました。
確かにその通りですね。。

加えてJavaScriptに記載するか、PHPに記述するかの基準も参考になりました。
これまで、「ボタン動作はJavaScriptに記載してしうものだ」としか考えていませんでしたが
(むしろ考える余裕がなかった)ユーザーの意思でON/OFFできるものに
その書き方は適切ではない事、むしろ基本を無視している事だと知りました。

おそらくは実際の開発では基本的な事なのだと思いますが、
JavaScriptやHtml、PHPの本を読んでいては気付けない事を教えていただき、
ありがとうございます。

投稿日時 - 2010-03-18 02:56:13

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問