2010-11-04 44 views
1

我對其進行了設置,以便每次查看產品時都會在數據庫表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; 
} 

望着那得到執行一起的2個不同的查詢,你應該能夠假設,無論product_stat是一個PRODUCT_ID在daily_product_stats表上,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 

,我發現的product_id 8151被視爲當今84倍來自同一IP地址66.249.65.123。我認爲我的代碼應該防止同一個IP被每天跟蹤超過一次。我做了一些關於IP的研究,它看起來最有可能是一個谷歌機器人,所以我想也許SESSIONS不能設置機器人,所以這就是爲什麼它被越來越多的跟蹤...

因此,我期望查看product_id 8151的daily_product_stats表,並將其product_stat設爲84.不是,它僅爲2.我覺得這非常奇怪,因爲我不明白這是如何可能的。我不確定這裏發生了什麼。

有沒有人有任何想法?

+0

您是否正確設置了robots.txt文件以防止漫遊器? – 2010-11-04 17:40:55

+0

@McWafflestix,我想要索引頁面,我只是不想將它們作爲訪問進行跟蹤。我想我只需要弄清楚用戶是否是機器人,如果是的話就不跟蹤它的訪問。 – 2010-11-04 18:03:03

回答

2

你的選擇查詢看起來有點時髦,所以這可能解釋你的時髦結果。直觀地說,您不僅僅是在IP上進行分組,而且在產品和日期上進行分組,因此您應該將product_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庫更有知識,以幫助您與您的應用程序邏輯。

+0

我看到,所有的日期都是一樣的,所以不應該影響它,但是IP不僅僅是看84次的產品,它在不同的產品上總共看到了84次。從那以後。像你說的那樣分組,解決了這個問題。 – 2010-11-04 18:01:41

+0

請記住,如果您在一系列日期而不是一天中查找結果,則需要按日期進行分組。 – 2010-11-04 18:07:53