代码之家  ›  专栏  ›  技术社区  ›  JD Isaacks

每天无法跟踪独特的产品视图

  •  1
  • JD Isaacks  · 技术社区  · 15 年前

    daily_product_stats . 它应该只计算每个产品每个会话的视图一次。因此,要想知道今天435产品被浏览了多少次,我们可以很容易地做到这一点,也可以很容易地看到今天哪个产品被浏览得最多。

    但我开始注意到奇怪的结果,比如产品2324在上午9点之前被最多看了36次。我怀疑有些东西不对,因为那不是一个很受欢迎的产品。

    所以我决定用一个ip来跟踪每个视图,以确保每个视图都是唯一的。所以每次我更新 我要在 product_ip_tracking 有了IP。

    首先,这是执行跟踪的页面上的代码:

    include_once("php/packages/pdomanager/PDOManager.php");
    
    $pdo = PDOManager::getConnection();
    
    
    $product_stat_qry = '
        INSERT INTO daily_product_stats
        SET product_stat = 1, product_id = :pid, first_entry = :date
        ON DUPLICATE KEY UPDATE product_stat = product_stat+1
    ';
    
    // Update temp stat table
    $product_ip_tracking_qry = '
        INSERT INTO product_ip_tracking
        SET product_id = :pid, date = :date, user_ip = :ip
    ';
    
    $stat_data = array(
        "pid" => $_GET['pid'],
        "date" => date('Ymd')
    );
    
    $track_data = $stat_data;
    $track_data["ip"] = $_SERVER['REMOTE_ADDR'];
    
    $stat_sth = $pdo->prepare($product_stat_qry);
    $track_sth = $pdo->prepare($product_ip_tracking_qry);
    
    if(!isset($_SESSION['daily_product_stats'][$_GET['pid']]))
    { // only update once per person per session
        $stat_sth->execute($stat_data);
        $track_sth->execute($track_data);
        $_SESSION['daily_product_stats'][$_GET['pid']] = 1;
    }
    

    查看一起执行的两个不同的查询,您应该能够假设无论product_stat是针对daily_product_stats表上的product_id,product_ip_tracking表上的相同product_id都应该有许多行。

    所以我让它运行几分钟,然后在数据库上运行这个查询:

    SELECT product_id, COUNT( user_ip ) AS times, user_ip, DATE
    FROM  `product_ip_tracking` 
    GROUP BY user_ip
    ORDER BY times DESC , product_id
    

    我发现今天在同一个IP地址上查看了84次产品 66.249.65.123 . 我认为我的代码应该防止同一IP每天被跟踪一次以上。我做了一些关于IP的研究,看起来它很可能是一个谷歌机器人,所以我想也许会话不能设置机器人,所以这就是为什么它被跟踪多次。。。

    所以我想调查一下 产品编号8151及其产品编号84的表格。不是,只有两个。我觉得这很奇怪,因为我不明白这是怎么可能的。我一点也不知道这里发生了什么。

    有人有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Brian Driscoll    15 年前

    您的select查询看起来有点古怪,所以这可能解释了您的古怪结果。直观地说,您不仅仅是在IP上分组,而且还在产品和日期上分组,所以您应该将产品id和日期添加到GROUP BY子句中。因此,您的查询应该更像这样:

    SELECT product_id, COUNT(user_ip) as times, user_ip, date
    FROM `product_ip_tracking`
    GROUP BY product_id, user_ip, date
    ORDER BY times DESC, product_id
    

    我会听从一个更了解PDO MySQL库的人的建议,帮助您解决应用程序逻辑问题。