PHPを例にした画面更新処理の質問です。


簡単な例題ソースを下記に書いてあります。
フォーム1はテキストボックスと送信ボタンです
フォーム2はフォーム1の処理結果の表示です、時間をシリアルで表示してます

質問は、フォーム2の状態でもブラウザのリロードで時間が更新されてしまうのですが、送信ボタンの押した場合は処理が走り、リロードでは何もしない・・と動作を切り分ける方法はないでしょうか?

※例題では時間を出してますが本来はDB更新処理になりますのでリロードでDB更新処理を走らせたくないのです。

よろしくお願いします

<?php
echo "<html><body>";
if($_GET["send"]=="yes"){
$data = $_GET["data"];
$now = time();
echo <<< FORM2
<form>
FORM2<br>Submit Complete! data='$data' time='$now'
<input type=submit value=RETURN>
</form>
FORM2;
}
else{
echo <<< FORM1
<form>FORM1<br>
<input type=text name=data><input type=submit value=GO>
<input type=hidden value=yes name=send>
</form>
FORM1;
}
echo "</body></html>";
?>

回答の条件
  • 1人2回まで
  • 登録:2007/06/02 08:57:36
  • 終了:2007/06/02 11:48:29

回答(3件)

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222007/06/02 11:05:53

ポイント15pt

単純にPOSTデータに付加的なものを加えればよいのではないでしょうか?

具体的には、サブミットボタンにname属性を付けるか、hiddenを追加して、

// 表示部
<input type="submit" name="not_reload" value="GO"/>

または

<input type="hidden" name="not_reload" value="1"/>

などとしておき、

// PHPの処理
if (isset($_POST["submit_bt"])) {
  更新処理
}

とする感じです。

id:upride

ん?例題でも既にhiddenを設置して

hiddenの値を判断材料として分岐してますが・・

んん?

2007/06/02 11:35:41
id:studioes No.2

studioes回答回数522ベストアンサー獲得回数612007/06/02 11:21:32

ポイント50pt

<?php

session_start();

echo "<html><body>";

if($_GET["send"]=="yes" AND $_SESSION['stat']){

$_SESSION['stat'] = false;

$data = $_GET["data"];

$now = time();

echo <<< FORM2

<form>

FORM2<br>Submit Complete! data='$data' time='$now'

<input type=submit value=RETURN>

</form>

FORM2;

}

else{

$_SESSION['stat'] = true;

echo <<< FORM1

<form>FORM1<br>

<input type=text name=data><input type=submit value=GO>

<input type=hidden value=yes name=send>

</form>

FORM1;

}

echo "</body></html>";

?>

こんなのでどうでしょ? セッション変数で、前回表示画面を識別できるようにしています。 FORM2をリロードしようとするとセッション変数statが既にfalseの為、FORM1に戻ります。

  FORM1に戻るのが不要なら、if(~ AND $_SESSION['stat'])にせずに、DB処理部のみをif($_SESSION['stat'])でくくれば良いです。

 最初のページでユニークキーを発行して、それを引き継いで行って、DB処理が完了したらそのユニークキーでの処理を無効にする様なコードも良いかと思いますが、手間なのでこれで・・・

id:upride

セッションフラグ利用ですね。

このソースの動作でばっちりです。

すばらしい。ありがとうございます

2007/06/02 11:41:53
id:jack_sonic No.3

じゃっくそにっく回答回数123ベストアンサー獲得回数252007/06/02 11:28:44

ポイント50pt

こんにちは。

仕組み

単一のphpページで2画面だし、制御するという場合なので、

・phpが再呼び出しされても値を保持できるセッション変数

($_SESSION[])を用います。

・リロードによる処理の繰り返しを防止するには、

処理フラグを使います。

・入力されたフォーム送信をするFORM1では、処理フラグをONにし、

・FORM2では、処理フラグがONのときだけ処理を行い、

行った後に処理フラグをOFFにする。

というしくみで、リロードによる処理の繰り返しを抑制できます。

稼動サンプル

http://f29.aaa.livedoor.jp/~morg/wiki/sample/reloadTest.php

ソース

<?php
	// セッション開始
	session_start();
	echo "<html><body>";

	// GET変数による振り分け
	//  send==yesの場合
	if($_GET["send"]=="yes"){
		// 結果画面 ------------------------------
		// フラグ確認
		if(  $_SESSION['doFlg'] == true ){

			$data = $_GET["data"];
			$now = time();
			// 1度実行したらフラグオフ
			$_SESSION['myTime'] = $now;
			$_SESSION['doFlg']=false;


		}else{
			$data = $_GET["data"];
			$now = $_SESSION['myTime'];

		}
		// 出力
		echo <<< FORM2
		<form>
		FORM2<br>Submit Complete! data='$data' time='$now'
		<input type=submit value=RETURN>
		</form>
FORM2;


	}else{
	// send=yesでない場合

		// 入力フォーム画面 ----------------------------
		echo <<< FORM1
		<form>FORM1<br>
		<input type=text name=data><input type=submit value=GO>
		<input type=hidden value=yes name=send>
		</form>
FORM1;
		// フラグを立てる
		$_SESSION['doFlg']=true;

	}
	echo "</body></html>";
?>
id:upride

こちらもセッションフラグ利用ですね。

時間までセッションに入れてますね。

サンプルの動作もばっちりです。

すばらしい。ありがとうございます

2007/06/02 11:46:06
  • id:upride
    質問者です。書き忘れました。

    別画面に飛ばす方法は無しの方向でお願いします。
    この画面単独でお願いします

    また、javascriptでFORM2画面時にsubmitするという方法も画面更新が走るのでやりたくないのですが・・


  • id:upride
    短時間での回答ありがとうございます
    結局このソースの外にフラグを立てて判断するっていう
    仕組みが必要なんですね、勉強になりました
  • id:upride
    POSTデータ・GETデータ=受信したらその画面のリソースとなる。
    セッションデータその画面リソースの外に状態を保存できる。

    メモメモw

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません