mysql查询if语句

时间:2009-12-20 16:58:43

标签: php sql mysql counter

为了保持这个简单,假设我在php中创建一个基本的网页浏览计数器,用于存储mysql表中每个页面的计数。该表有2个列: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会话有任何已知问题吗?我应该使用cookies吗?

第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查询中编写它,同时保持我的“重复KEY”语句?

我理解这句话不是100%准确但是直到我能弄清楚为什么会话事情似乎不起作用,这才有效。我的网站流量很低,我很少在5分钟的时间内在同一页面上获得超过1位访问者。

由于

4 个答案:

答案 0 :(得分:2)

我建议您尝试查看是否可以修复PHP,但忽略它。您可以存储unixtimestamp除以300(IE,每隔5分钟)

$ query =“INSERT INTO OtherTable VALUES('$ page_id','$ IP_ADDRESS',(UNIX_TIMESTAMP(NOW())/ 300))”;

如果更新的记录为0,则无需更新页数。

答案 1 :(得分:1)

1。什么可能导致重复?

  

有些页面的观看次数过多,我怀疑是重复的,所以我开始记录IP和用户代理。事实证明,在大约10%的案例中,IP会在几分钟内触发同一页面的计数器2-3次。

无法知道请求页面的主机是否位于NAT路由器后面 - 对您而言,请求将具有相同的IP,但实际上是不同的主机。 cookie或会话可以帮助您在每个工作站的基础上进行隔离,但我想知道您何时将信息写入数据库。

2。如何在mysql查询中编写它,同时保持“ON duplicate KEY”语句?

我认为不需要COUNT = COUNT + 1,因为SQL有一个COUNT函数:

  SELECT page_id,
         COUNT(*) 'num_hits'
    FROM ZZZ_NETWORK
   WHERE page_id = ?
GROUP BY page_id

如果您对ZZZ_NETWORK使用了以下结构:

  • page_id,主键
  • ip_address,主键
  • 时间戳,主键

...您不必担心重复键处理,它可以让您知道在特定日期,星期,月/等中获得的点击次数。 包括时间戳将确保永远不会有重复

  

一个月之后,如果我每页查看一行,我的表中会有数千行。

驱动器空间非常便宜,并且有时间戳,因此您可以使用datamine对报告非常有用。但是您不必保留所有数据 - 您可以通过将数据转储到文件来存档它,以便在必要时可以检索它。

  

我不明白如何确保我永远不会重复。

时间戳包括日期(12月25日)和时间(07:00:00 AM)。一些日期时间数据类型可以达到几分之一秒。这使得几乎不可能拥有相同的日期和时间。具有给定IP地址的给定page_id的时间 - 即使我想,也无法足够快地单击刷新按钮。所以记录永远不会重复,因为三列中的最后一列每次都会有不同的值(没有双关语)。

答案 2 :(得分:0)

您要找的是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;

它们也可用于UPDATEINSERT

我怀疑你想看看IE的东西,而不是。我过去遇到过类似的问题,最后我不得不使用javascript取消点击次数。我不确定是IE浏览器的用户是双击还是IE浏览器很奇怪。

答案 3 :(得分:0)

我想我可能找到了解决会话问题的方法。实际上,我从会话切换到了cookie。

很多网页都是通过iframe获取视图的。 iframe导致IE浏览器出现问题。除非我添加了一个p3p标头,否则IE无法从iframe中读取cookie数据。

我添加了p3p标头,现在它似乎正常工作。我对微软和他们的安全理念感到厌倦。我也不知道p3p是什么,但这就是它在php中的样子。

header ( "p3p:CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");