2012-02-07 3 views
0

позволяет предположить, что у нас есть эта таблица с именем visits и она имеет два поля id для идентификатора страницы и ip для IP-адреса пользователя.page view counter, код предоставляется, это лучший способ?

Я написал этот код, и мне интересно, если это лучший способ?

$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

Возможно, вам лучше просто добавить ограничение 'UNIQUE' на' (ip, id) '- иначе вы закончите условие гонки. – Amber

+0

Убедитесь, что вы дезинфицируете параметр GET. Его открытая уязвимость в вашем коде, как он сейчас стоит – xbonez

ответ

0

Я бы даже не проверил наличие существующей записи в базе данных.

Добавить UNIQUE ключ на ip и id (комбинированные) и просто запустить 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».

Для веб-сайта, видимого всеми, подход проблематичен. Одной из очевидных проблем является уязвимость SQL-инъекции через параметр «id».

Есть, конечно, множество доступных библиотек, которые делают такой подсчет с различной степенью сложности. Без дальнейших подробностей и фактического варианта использования у вас есть трудно сказать, нужно ли вам кодировать что-то более сложное или нет.

Смежные вопросы