0

誰かが私の Web ページのボタンをクリックすると、次の JavaScript コードが実行されます。

function count() {
    var xmlHttp = getXMLHttp(); // XMLHttpRequest object
    xmlHttp.open("GET", "count.php", true);
    xmlHttp.send(null);
}

次に、この PHP スクリプトが実行されます: (a common)

<?php

mysql_connect("host","username","password"); 
mysql_select_db('database');
mysql_query('UPDATE table SET field = field + 1'); 

?>

問題は異なる場合があります。10回クリックすると、8回か何かしか登録されません。うまくいくこともあれば、うまくいかないこともあります。

4

5 に答える 5

3

Ajax リクエストが完了し、成功メッセージが返されるまで、ボタンのクリックを無効にします。たとえば、StackOverflow のコメント メカニズムを確認してください。一度押すと無効になるため、2 回押すことはできません。

try {
    $pdo = new PDO("mysql:host=localhost;dbname=tests", "user", "pass");
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    //Have PDO throw exceptions on errors. That way you don't miss 'em.
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "UPDATE `table` SET `field` = `field`+1";

    $stmt = $pdo->prepare($sql);
    $stmt->execute();
}
catch (PDOException $e) {
    //In case an error has occurred, it will be caught and handled here.
    die("There was an error with the database! " . $e->getMessage());
}

それが私がPDOでやった方法です。

于 2012-08-10T20:57:53.903 に答える
1

解決策は必ずあります...

クイックフィックスソリューション@

AJAX 呼び出しを同期させます。注:これにより、実行中に生成ボタンが動かなくなったように見えますが、それは望ましくないと思います(読み込みを高速化するためにすべての名前をJS配列に保持しているため...はい、リンクにアクセスしました...ありがとう投稿するため)

function count() {
    var xmlHttp = getXMLHttp();
    var async = false;
    xmlHttp.open("GET", "count.php?" + Math.random, async);
    xmlHttp.send();
}

より良い解決策

//call submit count every 60 secs, play with it to get a interval that suits you best
window.setTimeout("submitCount();",60000);
var globalCounter = 0;
function count() 
{
    globalCounter++;
}

function submitCount(){
    if (globalCounter > 0)
    {
        var xmlHttp = getXMLHttp();
        var async = false;
        var countForPHP = globalCounter;
        globalCounter = 0;
        xmlHttp.open("GET", "count.php?r=" + Math.random + "&count=" + countForPHP, async);
        xmlHttp.send();
    }
    window.setTimeout("submitCount();",60000);
}

Request.QueryString から countForPHP を取得するように PHP を変更し、それに応じて SQL を更新します。

注: Web サイトが閉じられ、その 60 秒のロットがサーバーにコミットされていない場合、カウントは失われます。これを処理するには、window.onbeforeunload で submitCount を呼び出します。

于 2012-08-16T18:42:32.720 に答える
0

フィールドを更新する代わりに、個々のクリックを (datetime とともに) データベースに保存します。そのためには、(ワンクリックで) レコードをテーブルに挿入するように count.php を変更する必要があります。

合計番号を取得するには。クリック数は、テーブルの「count(1)」を使用できます。クリックの日付と時刻を挿入しているため、テーブルから日/週/月/年のデータのクリックを取得できます。

ところで、UPDATE は更新中にレコード/行をロックします。複数のリクエストが同時に同じレコードを更新しようとすると (同時リクエストの場合)、ロックの問題のために更新が失敗することがあります。

あなたのテーブル(クリック数 - テーブル名)は以下のようになります。
+-------------+---------------------+
| sourceip | click_date |
+-------------+---------------------+
| 10.32.12.45 | 2012-08-16 13:35:03 |
+-------------+---------------------+
count.php のクエリは、insert into clicks(sourceip, click_date) values('10.32.12.45', now()); のようになります。

ソース ip (クライアント ip) は、php スクリプトを使用して取得できます。

そして、以下のクエリはあなたにノーを与えます。日/月/年あたりのクリック数。日 => 日付として date_format(click_date, '%Y-%m-%d') を選択し、date_format(click_date, '%Y-%m-%d') によるクリック グループから count(1) クリック;
月 => 日付として date_format(click_date, '%Y-%m') を選択し、date_format(click_date, '%Y-%m') によるクリック グループから count(1) クリック;
年 => 日付として date_format(click_date, '%Y') を選択し、date_format(click_date, '%Y') によるクリック グループから count(1) クリックをカウントします。

于 2012-08-14T13:06:38.747 に答える
0

問題は、ブラウザがキャッシュから結果をロードしているようです。count.php で応答するときにヘッダーを送信してページのキャッシュを無効にするコードを追加します (php.net ヘッダーの例から):

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
于 2012-08-10T21:42:22.757 に答える
-1

これを試してください:

$con = mysql_connect("host","username","password"); 
mysql_select_db('database', $con);

$result = mysql_query("select * from table");

$numrows = mysql_num_rows($result);
if ($numrows!=0){
    while ($row = mysql_fetch_assoc ($result)){
        $Field = $row['field'];
    }
$FieldTwo = $Field+1;
$result = mysql_query('UPDATE table SET field='$FieldTwo'); 

}
于 2012-08-10T21:04:19.953 に答える