为了保持这个简单,假设我在php中制作了一个基本的页面查看计数器,它将每个页面的计数存储在mysql表中。该表有两列: PAGE_ID和COUNT。
我在每一页中添加了以下代码:
$query = "INSERT INTO table VALUES ('$page_id', '1')
ON duplicate KEY UPDATE COUNT=COUNT+1";
$result = mysqli_query($cxn, $query);为了确保每个查看页面的人只在我添加PHP会话后触发计数器。基本上,如果您查看一个页面,则page_id存储在会话中,计数器php代码在触发计数器之前检查该会话。在我自己的测试中做得很好。
有些页面获得了太多的视图,我怀疑是重复的,所以我开始记录IP和用户代理。在大约10%的情况下,IP会在几分钟内触发同一页的计数器2-3次。
第一个问题,,是什么导致了重复?这个问题似乎主要发生在IE8和Safari上,但我至少有一个IE7和IE6的例子。php会话是否存在已知问题?我应该用饼干代替吗?
第2部分:我修改了我的表,使它现在存储触发计数器的最后一个unix时间戳和最后一个IP。
我想修改我的查询,以便它在运行"COUNT=COUNT+1“之前检查以下内容:
If the current IP is the same as the last stored IP for this page {
check that it's been at least 5 minutes before doing COUNT=COUNT+1
} else { COUNT=COUNT+1; }第二个问题,我如何在mysql查询中写入它,同时保留“在重复键上”语句?
我知道这句话不会100%准确,但在我弄明白为什么会话似乎不起作用之前,这是可行的。我的网站流量很低,在5分钟的时间内,我很少能在同一个页面上获得超过1000名访问者。
谢谢
发布于 2009-12-20 18:36:53
我建议您试着看看是否可以修复PHP,但忽略这一点。您可以存储unixtime戳除以300 (IE,每隔5分钟)。
$query =“插入到OtherTable值中(‘$OtherTable_id’,'$IP_ADDRESS',(UNIX_TIMESTAMP(NOW()/300))”;
如果更新的记录为0,则不需要更新页面计数。
发布于 2009-12-20 17:16:00
1.造成重复的原因是什么?
有些页面获得太多的视图,我怀疑是重复的,所以我开始记录IP和用户代理。在大约10%的情况下,IP会在几分钟内触发同一页的计数器2-3次。
无法知道请求页面的主机是否位于NAT路由器后面--对您来说,请求具有相同的IP,但实际上是另一台主机。cookie或会话将帮助您在每个工作站的基础上进行隔离,不过我想知道何时将信息写入数据库。
2.如何在mysql查询中写入该语句,同时保留“在重复键上”语句?
我不认为需要COUNT = COUNT + 1,因为SQL有一个计数函数:
SELECT page_id,
COUNT(*) 'num_hits'
FROM ZZZ_NETWORK
WHERE page_id = ?
GROUP BY page_id如果您在ZZZ_NETWORK中使用以下结构
主key
...you不必担心重复的密钥处理,它可以让您知道在特定的一天、一周、几个月/等等有多少次点击。包括时间戳在内的将确保永远不会有重复的。
一个月后,如果每页视图使用一行,我的表中就会有数千行。
驱动器空间非常便宜,有一个时间戳,这样你就可以得到数据,这对于报告来说是非常宝贵的。但是,您也不必保存所有的数据--您可以通过将数据转储到文件中来将其存档,以便在必要时可以检索数据。
,我不明白它如何保证我永远不会得到复制。
时间戳包括日期(2009年12月25日)和时间(上午7:00)。一些datetime数据类型会下降到每秒的几个部分。这使得使用给定IP地址的给定page_id几乎不可能有相同的日期和时间--即使我想单击刷新按钮,也不能足够快。因此,记录永远不可能重复,因为三列中的最后一列每次都有不同的值(没有双关意)。
发布于 2009-12-20 17:08:34
您要寻找的是一个CASE语句:http://dev.mysql.com/doc/refman/5.0/en/case-statement.html
一个示例CASE语句:
SELECT name,
(CASE WHEN is_happy THEN "Happy!"
ELSE "sad." END) as happiness
FROM user_state;它们也可以用于UPDATE和INSERT。
我怀疑你想看IE的东西,而不是。我过去也遇到过类似的问题,最后不得不使用javascript来减少点击次数。我不确定是IE用户双击东西,还是IE很奇怪。
https://stackoverflow.com/questions/1936339
复制相似问题