0

ユーザーが選択できるオプションと、クリックするとPHPスクリプトを実行し、最初のPHPスクリプトの最後に作成されたセッション変数を使用する別のPHPファイルでdivを更新するボタンがあるページがあります。さまざまなオプションを選択した状態でユーザーがボタンをもう一度押すと、新しく置き換えられたセッション変数を使用してdivが更新されます。問題は、場合によっては、おそらく10回に1回程度、古いセッション変数データが​​ロードされることです。2番目のPHPファイルは、更新される前に変数をキャッチするのが早すぎると思われますが、運が悪かったので、さまざまな時点でセッション変数の設定を解除しようとしました。

最初のPHPファイル:

session_start();
$needle = array();
foreach($_POST['checkboxes'] as $key => $value){
$needle[] = "$value";
}
// code that processes the values from needle and outputs $data
unset($_SESSION['data']);
$_SESSION['data']=$data;

2番目のPHPファイル:

session_start();
echo $_SESSION['data'];

Javascript:

$(".userdata").click(function() {
   $.post("first.php", $("form#checkboxes").serialize());
});
$(function() {
   $("#button").click(function() {
   $("#div").load('second.php')
   })
})
4

2 に答える 2

0

問題は、2 番目の PHP スクリプトをロードするボタンをクリックする前に、最初の PHP スクリプトの実行が完了していない場合があることです (前にコメントで暗示したように)。これが発生するという事実は、Web サーバーによってスクリプトがスケジュールされる方法に関連しています (これはまったく別の主題です)。

したがって、2 番目のスクリプトを実行するボタンをクリックしたときに、最初のスクリプトの実行が完全に終了していることを確認する必要があります。

私の知る限りでは、javascript は (Java のように) 変数のブロック/シグナリングを許可しないため、ビジー待機と呼ばれるより「汚い」手法を使用する必要があります。

これを行う最善の方法は、使用している JavaScript に追加の変数を含めることです。

var wait = false;
function reloadSecond (){
  if (wait){
    setTimeout('reloadSecond()',200);
  } else {
    $("#div").load('second.php');
  }  
}

$(".userdata").click(function() {
   wait = true;
   $.post("first.php", $("form#checkboxes").serialize(), function(){
     wait = false;
   });

});
$(function() {
   $("#button").click(reloadSecond);
})

「ビジー待機」は一般的に最も洗練されたソリューションとは見なされませんが、この場合、他に多くのオプションはないと思います (はるかに複雑なサーバー側のプッシュを除いて)。さらに、余分な 200 ミリ秒 (またはそれ以下、もちろんこの値を変更できます) の待機時間が 1 回か 2 回発生するだけです。

(補足: ここでは JavaScript はシングル スレッドであると想定していますが、これはほぼすべての場合に当てはまります: Is JavaScript はシングル スレッドであることが保証されていますか? )。

于 2012-06-25T04:30:31.217 に答える
0

ブラウザまたはプロキシ サーバーが html データをキャッシュしている可能性はありますか? キャッシュしないようにヘッダーを設定してみてください。設定するヘッダーについては、 http://php.net/manual/en/function.header.phpの例を参照してください。

于 2012-06-25T04:32:47.160 に答える