簡単な例題ソースを下記に書いてあります。
フォーム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>";
?>
単純に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"])) { 更新処理 }
とする感じです。
<?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処理が完了したらそのユニークキーでの処理を無効にする様なコードも良いかと思いますが、手間なのでこれで・・・
セッションフラグ利用ですね。
このソースの動作でばっちりです。
すばらしい。ありがとうございます
こんにちは。
単一の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>"; ?>
こちらもセッションフラグ利用ですね。
時間までセッションに入れてますね。
サンプルの動作もばっちりです。
すばらしい。ありがとうございます
ん?例題でも既にhiddenを設置して
hiddenの値を判断材料として分岐してますが・・
んん?