2012-02-07 2 views
0

このテーブルはvisitsとし、ページIDはid、ユーザのIPアドレスはipの2つのフィールドがあるとします。ページビューカウンタ、コードが提供されています、それは最善の方法ですか?

私はこのコードを書いており、それが最良の方法であるかどうか疑問に思っていますか?

$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アドレスはすべてのページで同じになるので –

+0

'(ip、id)'に 'UNIQUE'制約を追加する方が良いでしょう。そうでなければ競合状態になります。 – Amber

+0

GETパラメータのサニタイズを確認してください。現在のようにコードにオープンな脆弱性 – xbonez

答えて

0

私はデータベースの既存のエントリをチェックしません。

(組み合わせ)ipidUNIQUEキーを追加し、ちょうど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"と呼ぶことのないユニークな訪問者の数と思われます。

誰もが見ることができるウェブサイトについては、アプローチは問題があります。明らかな問題の1つは、 "id"パラメータによるSQLインジェクションに対する脆弱性です。

もちろん、さまざまな程度の複雑さでこのようなカウントを行うライブラリが多数用意されています。詳細や実際のユースケースがなければ、より複雑なものをコード化する必要があるかどうかを判断するのは難しいです。

関連する問題