人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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>";
?>

●質問者: upride
●カテゴリ:インターネット ウェブ制作
✍キーワード:dB ECHO PHP Time yes
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● t_shiono
●15ポイント

単純に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"])) {
 更新処理
}

とする感じです。

◎質問者からの返答

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

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

んん?


2 ● studioes
●50ポイント

<?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処理が完了したらそのユニークキーでの処理を無効にする様なコードも良いかと思いますが、手間なのでこれで・・・

◎質問者からの返答

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

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

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


3 ● じゃっくそにっく
●50ポイント

こんにちは。

仕組み

単一の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>";
?>
◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ