1

私は PHP にはかなり慣れていませんが、ユーザーがボタンをクリックするたびにボタンがクリックされた回数を単純に表示するスクリプトを設定することができました。
PHPは次のとおりです。

<?php
$f = fopen('counter.txt', 'r+');
flock($f, LOCK_EX);
$total = (int) fread($f, max(1, filesize('counter.txt')));
if (isset($_POST['submit'])) {
rewind($f);
fwrite($f, ++$total);
}
fclose($f);
?>

HTMLは次のとおりです。

<form action='' method="post">
<input type="submit" name="submit" value="click" />
</form>
This button has been clicked <?php echo $total; ?> times.

カウンターは機能しますが、3 つの問題があります。

  1. ページがリロードされるたびにカウンターが増加します。ボタンがクリックされたときにのみカウンターが増加するようにします。これを修正する方法はありますか?

  2. ページを更新するたびに、Firefox は、ページを再読み込みするかどうかを確認するように求めてきます。これを防ぐためのオプションがブラウザの設定にあることは知っていますが、このメッセージがユーザーにも表示されないように PHP を調整する方法があるかどうか疑問に思っていました。

  3. ボタンを数回クリックしてから [戻る] ボタンを使用しようとすると、前のクリックのそれぞれに移動します。繰り返しますが、これを行わずに前のページに移動するようにコードを修正する方法はありますか?

ありがとうございます!

4

4 に答える 4

1

そこで何をするか見てみましょう。php を含むページと、実際にはページをリロードするだけの自己送信フォームがあります。ページがリロードされると、$total カウンターがインクリメントされるため、「フォーム経由」またはブラウザ経由でページをリロードしても効果は同じです。Firefox のアラート動作は、html ページ内にフォームが存在するために発生します。更新時にすべての入力データが失われるため、ブラウザーは確認を求めます。前述したように、各クリックはページのリロードであるため、戻ると複数回の更新をブラウズするだけです。

これらの問題をすべて解決するには、AJAX で javascript/jQuery を使用することを検討する必要があります。

  • $total カウンター処理を counter.php のような別のページに配置します

  • フォームなしでボタンを設定してラップし、一意の ID を付けてから、jQuery を使用してクリック イベントにバインドします。

  • クリック イベントで、counter.php ページへの AJAX get 呼び出しを実行し、要求応答を警告します (または、jQuery を介して応答を表示する一意の ID を持つスパンを準備します)。

于 2012-05-10T06:54:53.623 に答える
1

順番に:

  1. POST 要求が行われると、カウンターが増加します。問題は、POST が処理された後にスクリプトがリダイレクトを行わないことです。単純なheader()リダイレクトだけで十分です。これにより、次のリクエストが GET になり、出来上がりです!

  2. 繰り返しますが、ボタンをクリックするとページが更新され、フォームが投稿されます。スクリプトはリダイレクトされないため、ページをリロードすると、Firefox (および他のブラウザーも) が確認を求めます。

  3. 戻るボタンの動作を実際に変更することはできませんが、ブラウザーがページをキャッシュしないようにすることはできます (「ブラウザー キャッシュ php を無効にする」を検索して、指定する必要があるヘッダーを確認してください)。


$f = fopen('counter.txt', 'r+');
flock($f, LOCK_EX);
$total = (int) fread($f, max(1, filesize('counter.txt')));
if (isset($_POST['submit'])) {
    rewind($f);
    fwrite($f, ++$total);
    // when we're done increasing the counter
    // you will lose the POST data once the page refreshes
    // so remember to do whatever else you need to do here
    header('Location: ' . $_SERVER['REQUEST_URI']);
    exit;
}
fclose($f);
于 2012-05-10T06:56:46.493 に答える
0

はい、

ボタンがクリックされたか、ページが更新されたかにチェックを入れる必要があります。

コードをこの条件の下に置きます

<?php

if(isset($_POST['submit']){
   $f = fopen('counter.txt', 'r+');
   flock($f, LOCK_EX);
   $total = (int) fread($f, max(1, filesize('counter.txt')));
   if (isset($_POST['submit'])) {
      rewind($f);
      fwrite($f, ++$total);
   }
   fclose($f);
}
?>

また、送信ボタンに別の名前を使用してみてください。name="submit"試してみる代わりに、 name="doPost".. JavaScript 経由で要素にアクセスするときに役立ちます

乾杯。

于 2012-05-10T06:55:58.273 に答える
0

おそらく、jQuery を使用して、AJAX ベースのソリューションを調べたいと思うでしょう。これがどのように機能するかの大まかなスケッチを次に示します (テストされていません)。これを HTML ヘッダーに追加します。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
function call_form() { 
  $.ajax({
    type: 'GET',
    url: PATH TO YOUR PHP SCRIPT,
    success: update_text
  });
};

function update_text(data) { 
   $('#counter').html(data);
};
</script>

そして、これをドキュメント本文に入れます:

//Put some PHP code here to fetch the count at page load and put that in $initial_count
<div>
<button type="button" value="Increment counter" id="counter" onClick="call_form();" /> 
</div>

<div>
This button has been clicked 
<span id="counter"><?php echo $initial_count; ?></span> 
times.
</div>

あとは、新しいクリックを格納する PHP スクリプトを更新し (これは別のファイルにあるはずです)、更新されたカウントをエコー バックするようにするだけです。

于 2012-05-10T07:05:55.893 に答える