2012-02-07 33 views
0

讓我們假設我們有這個名爲visits的表,它有兩個字段id用於頁面ID和ip用於用戶的IP地址。頁面查看計數器,提供代碼,是最好的方法嗎?

我寫了這段代碼,我想知道這是否是最好的方法?

$ip=$_SERVER['REMOTE_ADDR']; 
    $id=$_GET['id']; 

    $query = "SELECT 
    (SELECT COUNT(ip) FROM visits WHERE id = '{$id}' AND WHERE ip ='{$ip}') as visited, 
    (SELECT COUNT(ip) FROM visits WHERE id = '{$id}') as pageHits"; 

    $result=mysql_query($query, $connection); 
    $row=mysql_fetch_array($result); 

    $pageHits=$row['pageHits']; 
    $visited=$row['visited']; //it's either 0 or 1; 

    if($visited==0){ 
     $query ="INSERT INTO visits (ip , id) VALUES ('{$ip}', {$id})" 
     $result=mysql_query($query, $connection); 
     $pageHits++; 
    } 

    echo $pageHits; 
+0

一旦用戶訪問任何頁面,它會將已訪問標記爲1,那麼計數器將不會跟蹤未來的任何其他頁面。因爲所有頁面的IP地址相同 – 2012-02-07 06:51:25

+0

你可能會更好地在'(ip,id)'上添加一個'UNIQUE'約束 - 否則你會遇到競爭狀態。 – Amber 2012-02-07 06:52:11

+0

確保您清理GET參數。它是目前代碼中的一個開放式漏洞 – xbonez 2012-02-07 06:57:29

回答

0

我甚至不會檢查數據庫中的現有條目。

添加UNIQUE重點對ipid(組合),只是運行INSERT IGNORE

$ip=$_SERVER['REMOTE_ADDR']; 
$id=$_GET['id']; 

$query = 'INSERT IGNORE INTO visits (ip, id) VALUES ('.$ip.', '.intval($id).')'; 
mysql_query($query, $connection); 

// and now select the visits: 
$query = 'SELECT COUNT(ip) as pageHits FROM visits WHERE id = '.intval($id); 
$result = mysql_query($query, $connection); 
list($pageHits) = mysql_fetch_array($result); 
echo $pageHits; 
0

很大程度上取決於您的使用情況。對於內部網絡中的微不足道的計數器來說,這可能就足夠了。

雖然我不太清楚「pageHits」究竟是什麼。似乎是我不會稱爲「pageHits」的唯一訪問者的數量。

對於每個人都可見的網站,這種方法存在問題。一個明顯的問題是通過「id」參數進行SQL注入的漏洞。

當然有很多可用的庫可以進行不同程度的複雜度計算。沒有進一步的細節和實際用例,你很難判斷你是否需要編寫更復雜的代碼。