3

このメソッドを使用して、前のページから渡された変数に基づいてさまざまなコンテンツを表示しています。

    <?php
    if (isset($_GET['click'])) {
        if($_GET['click'] == 'person'){
          file_put_contents('person.txt', ((int) file_get_contents('person.txt')) + 1);
          include 'resultperson.php';
        } elseif ($_GET['click'] == 'text'){
          file_put_contents('text.txt', ((int) file_get_contents('text.txt')) + 1);
          include 'resulttext.php';
        } elseif ($_GET['click'] == 'online'){
          file_put_contents('online.txt', ((int) file_get_contents('online.txt')) + 1);
          include 'resultonline.php';
        }
    } else {
        include 'resulttext.php';
    } 
    ?>  

問題は、更新を押すと、file_put_contents()関数が再度実行されることです。これは、ユーザーがそのボタンをクリックした回数を追跡するために使用する方法にすぎません。

ページを更新するときに整数の増分が注入されないようにするにはどうすればよいですか?

または、これをすべて行うより簡単な方法がある場合はどうなりますか?

4

6 に答える 6

1

ユーザーがブラウザを閉じてページに再度アクセスしたときにトリガーされることを気にしない限り、セッションを使用するのがおそらく最善の策です。

// This will be set to true if the user has the session variable set
$clicked = isset($_SESSION['clicked']);

// Check if get variable 'click' is set, and that $clicked is false. 
// If 'click is set and $clicked if false, the variable $click is set to the 
// value of $_GET['click'] (for example 'person'). Other wise it will be set to false.
$click = (isset($_GET['click']) && !$clicked) ? $_GET['click'] : false;   

// Set the session variable 'clicked' if it isn't set so that the next time 
// the user visits, we'll know
if (!$clicked) {
    $_SESSION['clicked'] = 1;
}

if($click == 'person'){
    file_put_contents('person.txt', ((int) file_get_contents('person.txt')) + 1);
    include 'resultperson.php';
} elseif ($click == 'text'){
    file_put_contents('text.txt', ((int) file_get_contents('text.txt')) + 1);
    include 'resulttext.php';
} elseif ($click == 'online'){
    file_put_contents('online.txt', ((int) file_get_contents('online.txt')) + 1);
    include 'resultonline.php';
} else {
    include 'resulttext.php';
}
于 2012-09-15T15:09:21.760 に答える
0

ユーザーが前のページからページにアクセスしたときを区別するには、更新を押すのではなく、$_SERVER["HTTP_REFERER"]変数を確認します。その変数には、ユーザーがアクセスしたときの前のページのURLが含まれますが、更新の場合、ユーザーはどのページからもアクセスしていないため、その変数は存在しません(リンクをクリックしてアクセスしなかったため)。あなたのページ)代わりに、リクエストを送信したブラウザでした

この件で前のページの名前が「mypage.php」の場合は、次の行を置き換えます。

if (isset($_GET['click'])) {

これのために:

if (isset($_GET['click']) && isset($_SERVER["HTTP_REFERER"]) && strpos($_SERVER["HTTP_REFERER"],'mypage.php')) {

それはあなたが望むことをするはずです。

更新

上記の解決策は、ブラウザで[更新]をクリックしたときにページが同じリファラー値を維持するため、機能しません。

于 2012-09-15T15:08:23.867 に答える
0
  1. ajax-callを使用して、その操作をトリガーできます。このようにして、コンテンツをリロードせずにURLが「舞台裏」と呼ばれます。このオプションをお勧めします。JQuery ajaxを使用すると、のようなonClick関数を記述してからhtmlfunction clicked(){$.ajax("yourClickCounter.php");}に追加するのと同じくらい簡単にできます 。<button ... onClick="clicked()">...</button>もちろん、その後、別のPHPファイルでclickCountingを実行する必要がありますが、ボタンがクリックされるたびにすべてのコンテンツが再ロードされないという利点があります。

  2. のようなセッション変数を使用できます$_SESSION['has_clicked']。これには、最初にセッションを開始する必要があります。session_start()

于 2012-09-15T15:08:54.270 に答える
0

ユーザーがどこから来たのかを追跡したい場合は、httpヘッダーのリファラーフィールドを使用できます。

それが不可能な場合は、クリックを登録するphpページへのクリックリンクを設定してheader("Location: x.php");から、コンテンツを表示するページにアクセスすることができます。

于 2012-09-15T15:09:30.890 に答える
0

実際のコードでは、ページの更新時に整数が増加するのを防ぐことはできません。

問題は、それは重要ですか?トラッカーをどれだけ重要かつ正確にしたいと思いますか?

ボタンクリックに増分を付加する方法があります。これはAJAXを使用することです。ボタンクリックイベントにハンドラーをアタッチして、PHPスクリプトへの適切なAJAX呼び出しを行うことができます。

これは単純ではありませんが、単純です。

このソリューションと実際のソリューションの両方で、悪意のあるユーザーがPHPスクリプトを呼び出すHTTPリクエストを作成し、カウンターを自由にインクリメントすることを防ぐことはできません...

于 2012-09-15T15:10:21.933 に答える
0

これは機能するはずであり、より単純で、より簡単に拡張できます。

<?php
if (isset($_GET['click']) && isset($_SERVER["HTTP_REFERER"])) {
    $click = $_GET['click'];
    if (in_array($click, array('person', 'text', 'online')) {
      file_put_contents($click . '.txt', ((int) file_get_contents($click . '.txt')) + 1);
      include 'result' . $click . '.php';
    }
} else {
    include 'resulttext.php';
} 
?>
于 2012-09-15T15:14:27.343 に答える