当有人点击我网页上的按钮时,此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或其他东西。有时它会起作用,有时却不起作用。
答案 0 :(得分: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中的表现。
答案 1 :(得分:1)
始终有解决方案......
快速修复解决方案@
使您的AJAX调用同步。注意:这会使Generate按钮在执行期间看起来卡住了,我认为你不想这样(因为你保留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答案 2 :(得分: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
答案 3 :(得分:0)
在数据库中单独存储(使用日期时间),而不是更新字段。为此,需要更改count.php以将记录(单击一次)插入表中。
获得总数。点击次数,您可以使用表格的“count(1)”。由于您要插入点击的日期和时间,因此您可以从表中获得日/周/月/年明智的数据点击。
BTW,UPDATE会在更新时锁定记录/行。当多于1个请求尝试同时更新同一记录时(如果是并发请求),更新可能会因锁定问题而失败。
您的表格(点击次数 - 表格名称)如下所示
+-------------+---------------------+
| sourceip | click_date |
+-------------+---------------------+
| 10.32.12.45 | 2012-08-16 13:35:03 |
+-------------+---------------------+
而count.php中的查询应该是这样的
插入点击(sourceip,click_date)值('10 .32.12.45',now());
您可以使用php脚本获取源ip(客户端IP)。
以下查询会给你答案。每天/每月/每年的点击次数。
Day =&gt;选择date_format(click_date,'%Y-%m-%d')作为日期,按点数组点击(1)点击按date_format点击(click_date,'%Y-%m-%d');
月=&gt;选择date_format(click_date,'%Y-%m')作为日期,按点数组点击(1)点击按date_format点击(click_date,'%Y-%m');
年=&gt;选择date_format(click_date,'%Y')作为日期,按点数组点击(1)点击按date_format点击(click_date,'%Y');
答案 4 :(得分:-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');
}