我进行了设置,以便每次查看产品时,都会在数据库表daily_product_stats
中更新值。它应该只计算每个产品每个会话一次的视图。因此,要查看今天看到产品435的次数,我们可以很容易地做到这一点,并且很容易看到哪种产品在今天看得最多。
但是我开始注意到奇怪的结果,就像产品2324在上午9点被观察到最多36次。我怀疑是不对的,因为那不是一个非常受欢迎的产品。
所以我决定用ip跟踪每个视图,以确保每个视图都是唯一的。因此,每当我更新daily_product_stats
时,我都会使用IP在product_ip_tracking
中插入新行。
所以我这样做了几分钟,结果变得陌生。
首先,这是正在进行跟踪的页面上的代码:
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地址66.249.65.123
查看了product_id 8151 84次。我认为我的代码应该阻止每天多次跟踪相同的IP。我做了一些关于IP的研究,它看起来很可能是谷歌机器人,所以我想也许SESSIONS不能用机器人设置,所以这就是为什么它被多次跟踪......
因此,我希望查看daily_product_stats
表中的product_id 8151及其product_stat为84.它不是,它只有2.我觉得这很奇怪,因为我看不出那是怎么回事可能。我完全不确定这里发生了什么。
有没有人有任何想法?
答案 0 :(得分:2)
您的选择查询看起来有点时髦,所以这可能解释了您的时髦结果。直观地说,您不仅要对IP进行分组,还要对产品和日期进行分组,因此您应该将product_id和date添加到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库更了解的人来帮助你解决你的app逻辑。