счетчик просмотров страниц, код предоставляется, это лучший способ? - PullRequest
0 голосов
/ 07 февраля 2012

давайте предположим, что у нас есть эта таблица с именем visits, и в ней есть два поля 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;

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

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

Добавьте ключ 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 голосов
/ 07 февраля 2012

В значительной степени зависит от варианта использования, который у вас есть. Для тривиального счетчика во внутренней сети этого может быть достаточно.

Хотя мне не совсем понятно, что на самом деле считается "pageHits". Кажется, это число уникальных посетителей, которых я бы не назвал "pageHits".

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

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

...