Php 计数器未能注册计数的数目

Php 计数器未能注册计数的数目,php,javascript,mysql,Php,Javascript,Mysql,当有人单击我的网页上的按钮时,此JavaScript代码将运行: function count() { var xmlHttp = getXMLHttp(); // XMLHttpRequest object xmlHttp.open("GET", "count.php", true); xmlHttp.send(null); } 然后,执行这个PHP脚本:(一个公共脚本) 问题可能会有所不同。假设我点击十次,它只注册了8次左右。有时有效,有时无效。您希望禁用单击按

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

function count() {
    var xmlHttp = getXMLHttp(); // XMLHttpRequest object
    xmlHttp.open("GET", "count.php", true);
    xmlHttp.send(null);
}
然后,执行这个PHP脚本:(一个公共脚本)



问题可能会有所不同。假设我点击十次,它只注册了8次左右。有时有效,有时无效。

您希望禁用单击按钮,直到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中应该如何做的。

您希望禁用单击按钮,直到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中的做法。

试试这个:

$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'); 

}
试试这个:

$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'); 

}

问题似乎是浏览器从缓存加载结果。添加代码以发送标题,在count.php中响应时禁用页面缓存(来自php.net标题示例):


问题似乎是浏览器从缓存加载结果。添加代码以发送标题,在count.php中响应时禁用页面缓存(来自php.net标题示例):

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

要获得总的点击次数,可以使用表的“计数(1)”。由于要插入单击的日期和时间,因此可以从表中获取按天/周/月/年显示的数据单击

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

您的表格(单击-表格名称)可以如下所示。
+--------------+--------------+

| sourceip |单击|日期|

+--------------+--------------+

| 10.32.12.45 | 2012-08-16 13:35:03 |

+--------------+--------------+

php中的查询应该是 在点击次数(sourceip,click_date)值('10.32.12.45',now())中插入

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

下面的查询为您提供了每天/每月/年的点击次数。 Day=>选择日期格式(单击日期,%Y-%m-%d')作为日期,按日期从单击分组中计数(1)次单击(单击日期,%Y-%m-%d')
月=>选择日期格式(单击日期,%Y-%m')作为日期,按日期从单击分组中计数(1)次单击(单击日期,%Y-%m')
年份=>选择日期格式(单击日期,'%Y')作为日期,按日期从单击分组中计数(1)次单击(单击日期,'%Y')

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

要获得总的点击次数,可以使用表的“计数(1)”。由于要插入单击的日期和时间,因此可以从表中获取按天/周/月/年显示的数据单击

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

您的表格(单击-表格名称)可以如下所示。
+--------------+--------------+

| sourceip |单击|日期|

+--------------+--------------+

| 10.32.12.45 | 2012-08-16 13:35:03 |

+--------------+--------------+

php中的查询应该是 在点击次数(sourceip,click_date)值('10.32.12.45',now())中插入

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

下面的查询为您提供了每天/每月/年的点击次数。 Day=>选择日期格式(单击日期,%Y-%m-%d')作为日期,按日期从单击分组中计数(1)次单击(单击日期,%Y-%m-%d')
月=>选择日期格式(单击日期,%Y-%m')作为日期,按日期从单击分组中计数(1)次单击(单击日期,%Y-%m')

年份=>选择日期格式(单击日期,'%Y')作为日期,按日期从单击分组中计数(1)次单击(单击日期,'%Y')

总有一个解决方案……

快速解决方案@

使AJAX调用同步。注意:这会使Generate按钮在执行期间看起来卡住,我想你不希望这样(因为你将所有名称保留在JS数组中以加快加载速度…是的,我访问了你的链接…谢谢你发布)

更好的解决方案

//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。

始终有一个解决方案…

快速解决方案@

使AJAX调用同步。注意:这会使Generate按钮在执行期间看起来卡住,我想你不希望这样(因为你将所有名称保留在JS数组中以加快加载速度…是的,我访问了你的链接…谢谢你发布)

更好的解决方案

//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.on上调用submitCount。在卸载之前,请不要使用
mysql.*