0

当有人单击我网页上的按钮时,此 JavaScript 代码将运行:

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

然后,这个 PHP 脚本被执行:(一个常见的)

<?php

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

?>

问题可能会有所不同。假设我点击了十次,它只注册了 8 次或其他东西。有时它有效,有时则无效。

4

5 回答 5

3

您希望在 Ajax 请求完成并返回成功消息之前禁用单击按钮。例如,查看 StackOverflow 上的评论机制。您不能按两次,因为第一次后它会被禁用。

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);
}

更改您的 PHP 以从 Request.QueryString 获取 countForPHP 并相应地更新 SQL

注意:当网站关闭且 60 秒批次未提交到服务器时,计数将丢失。为了解决这个问题,您可能需要在 window.onbeforeunload 上调用 submitCount

于 2012-08-16T18:42:32.720 回答
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 回答
0

将单个点击(带有日期时间)存储在数据库中,而不是更新字段。为此,需要更改您的 count.php 以将记录(单击一次)插入表中。

得到总数。点击次数,您可以使用表格的“count(1)”。由于您要插入点击的日期和时间,因此您可以从表格中获取按日/周/月/年进行的数据点击。

顺便说一句,UPDATE 将在更新记录/行时锁定它。当超过 1 个请求同时尝试更新同一条记录时(在并发请求的情况下),更新可能会因为锁定问题而失败。

您的表格(点击次数 - 表格名称)可以如下所示。
+-------------+---------------------+
| 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());

您可以使用 php 脚本获取源 ip(客户端 ip)。

下面的查询给你没有。每天/每月/每年的点击次数。Day => 选择 date_format(click_date, '%Y-%m-%d') 作为日期,按 date_format(click_date, '%Y-%m-%d') 从点击组中计数 (1) 次点击;
月 => 选择 date_format(click_date, '%Y-%m') 作为日期,按 date_format(click_date, '%Y-%m') 从点击组中计数 (1) 次点击;
年 => 选择 date_format(click_date, '%Y') 作为日期,按 date_format(click_date, '%Y') 从点击组中计数 (1) 次点击;

于 2012-08-14T13:06:38.747 回答
-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 回答