Создание счётчика галереи изображений.

Pavl

Active Member
Регистрация
28.09.2016
Сообщения
43
Добрый день!
Существует счётчик и он работает. Только он работает таким образом, что он выводит кол-во уникальных посетителей (hosts) сразу всей галереи, а не отдельно по каждой картинке. Нужно, чтобы счётчик выводил на экран количество уникальных посетителей (hosts) отдельно по каждой картинке.
Возможно, ошибаюсь, но вероятно, нужно к этому счётчику привязать id картинки, но у меня не получается этого.
Код index.php (галерея):
PHP:
<?php
mysql_connect('localhost','root','');
$res = mysql_select_db('images');
//var_dump($res);
$res = mysql_query("SELECT * FROM img ORDER BY views DESC");
 
//var_dump($res);
while (false !== ($row = mysql_fetch_assoc($res))) {
    
    echo "<a href='page3.php?id=".$row[id]."'>$row[name]</a>";
    
    $show_img = base64_encode($row['samfile']);?>
<?php   
echo     "<p><a href='page3.php?id=".$row[id]."'>"?><img src="data:image/jpeg;base64, <?=$show_img ?>"alt="" width="200" hegiht="200" /></a></p>
<?php } ?>
Код page3.php, выводящий на экран количество уникальных посетителей (hosts) и просмотров (views):
PHP:
<?php
mysql_connect('localhost','root','');
$res = mysql_select_db('images');
 
//Получаем IP-адрес посетителя и сохраняем текущую дату
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$date = date('Y-m-d');
 
 
 
//Узнаём, были ли посещения за сегодня
$res = mysql_query("SELECT visit_id FROM visits") or die("Проблема при подключении к БД");
 
 
//Если сегодня ещё не было посещений
if (mysql_num_rows($res) == 0)
{
 //Очищаем таблицу ips
 mysql_query("DELETE FROM ips2");
 
 //Заносим в базу IP-адрес текущего посетителя
 mysql_query("INSERT INTO ips2(ip_address) VALUES ('$visitor_ip')");
 $res_count = 0;
 //Заносим в базу дату посещения и устанавливаем кол-во просмотров и уник. посещений в значение 1
 $res_count = mysql_query("INSERT INTO visits(hosts, views) VALUES (1, 1)");
}
 
//Если посещения сегодня уже были
else
{
 //Проверяем, есть ли уже в базе IP-адрес, с которого происходит обращение
 $current_ip = mysql_query("SELECT ip_id FROM ips2 WHERE ip_address = '$visitor_ip'");
 
 //Если такой IP-адрес уже сегодня был (т. е. это не уникальный посетитель)
 if (mysql_num_rows($current_ip) == 1)
 {
 //Добавляем для текущей даты +1 просмотр (хит)
 mysql_query("UPDATE visits SET views = views + 1");
 }
 
 //Если такого IP-адреса ещё не было (то есть это уникальный посетитель)
 else
 {
 //Заносим в базу IP-адрес этого посетителя
 mysql_query("INSERT INTO ips2(ip_address) VALUES('".$_SERVER['REMOTE_ADDR']."')");
 
 //Добавляем в базу +1 уникального посетителя (хост) и +1 просмотр (хит)
 mysql_query("UPDATE visits SET views = views + 1, hosts = hosts + 1");
 }
 }
 
 
$res = mysql_query("SELECT views, hosts FROM visits");
$row = mysql_fetch_assoc($res);
 
echo '<p>Уникальных посетителей: ' . $row['hosts'] . '';
echo 'Просмотров: ' . $row['views'] . '</p>';
  ?>
Просмотры (views) в коде необязательны. Их можно даже удалить из кода. Главное - hosts (уникальные посетители).
Есть база данных images c 3 таблицами:


Таблица img.JPG
Таблица ips2.JPG
Таблица visits.JPG
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 066
В img добавить ещё один столбик и туда писать. И, соответственно, от туда брать.
 

Pavl

Active Member
Регистрация
28.09.2016
Сообщения
43
Добрый день!
В общем, изрядно изменил код и таблицы в БД, но, что удивительно, ключевая проблема всё также, не пропала.
Одна из идей кода заключается в том, чтобы при двух условиях происходила запись в базу данных. А именно нужно, чтобы в промежуточную таблицу ip_id_address заносилось кол-во уникальных посетителей (hosts + 1) и выводилось потом на экран, для каждой картинки по отдельности с условием, что это новый пользователь (ip_address).
Есть файл index.php, в котором находится галерея с картинками. С index.php идёт переход в файл page3.php, в котором происходит запись в БД, выборка из Бд и вывод на экран кол-ва уникальных посетителей.
Файл page3.php:
PHP:
<?php
// Работа с адресной строкой
$id = intval($_GET['id']);
if (!$id) {
    die('Хьюстон, у ас проблемы');
}
// Кофигурация подключения к СУБД
define("DB_SERVER", "localhost");
//define("DB_PORT", "3306");
define("DB_USERNAME", "root");
define("DB_PASSWORD", "");
define("DB_BASE", "images");
define("DB_CHARSET", "utf-8");
// Подключение к БД
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_BASE);
mysqli_set_charset($link, DB_CHARSET);
if (!$link) {
    die('Хьюстон, у ас проблемы');
}
// Работаем с данными полученными от пользователя
// Проверяем есть ли такой IP в таблице, можно просто повесить уникальный индекс на колонку :)
$host = $_SERVER['REMOTE_ADDR'];
$result = mysqli_query($link, "SELECT ip_address FROM id_ip_address WHERE ip_address = '" . $host . "'");
if (!mysqli_num_rows($result)) {
    $result = mysqli_query($link, "INSERT INTO id_ip_address SET ip_address = '" . $host . "' ");
}
$user = mysqli_query($link, "SELECT COUNT(ip_address) FROM id_ip_address WHERE ip_address = '" . $host . "' ");

// Автоинкремент статистики просмотров
$statistic = mysqli_query($link, "SELECT hosts FROM img WHERE id = " . $id);
if (!mysqli_num_rows($statistic)) {
    $statistic = mysqli_query($link, "INSERT INTO id_ip_address SET hosts = 1");
} else {
    $statistic = mysqli_query($link, "UPDATE id_ip_address SET hosts = hosts + 1");
}
$count = mysqli_query($link, "SELECT SUM(hosts) FROM id_ip_address");
// Необходимо позаботится о безопасности и сделать обработку ошибок :)
$sum = mysqli_fetch_row($count);
echo "Уникальных посетителей: " . mysqli_num_rows($user);
echo "<br />";
echo "Просмотров: " . $sum[0];
mysqli_close($link);
?>
Я пробую связать два условия в одно (id картинки + ip_address ), например в строку
PHP:
 $user = mysqli_query($link, "SELECT COUNT(ip_address) FROM id_ip_address WHERE ip_address = '" . $host . "' ");
добавить AND id = '$id', но ничего не получается.

То есть, если я, например, вручную меняю ip_address в таблице (то есть, их становится 2), то и выводится на экран уникальных посетителей должно 2, а этого не происходит. Выводится, по-прежнему Уникальных посетителей: 1.
Как связать эти два условия?
Есть 3 таблицы в БД:
 

Вложения

miketomlin

Well-Known Member
Регистрация
12.11.2013
Сообщения
101
Мать честная. Выучите сначала (му)скул: INSERT IGNORE, INSERT... ON DUPLICATE KEY UPDATE...

В сабж особо не вникал, сорри, но хочу спросить: вы в курсе, что картинки активно кэшируются браузерами?
 

miketomlin

Well-Known Member
Регистрация
12.11.2013
Сообщения
101
Или у вас «текстовый» счетчик интегрирован прямо в текст страницы? Сделайте групповой первичный/уникальный ключ page_id/ip(_id) (ip можно преобразовывать в 32-bit unsigned int и не мучаться с отдельной таблицей) и используйте второй показанный мной запрос.

P.S. Куча ботов будет. Если хотите отслеживать именно живчиков, счетчик нужно делать с привлечением JS.
 

Pavl

Active Member
Регистрация
28.09.2016
Сообщения
43
Мать честная. Выучите сначала (му)скул: INSERT IGNORE, INSERT... ON DUPLICATE KEY UPDATE...
Ok
В сабж особо не вникал, сорри, но хочу спросить: вы в курсе, что картинки активно кэшируются браузерами?
Не в курсе, но на данный момент суть урока в создании счётчика. Всё остальное второстепенно, но я учту это.
 

Pavl

Active Member
Регистрация
28.09.2016
Сообщения
43
Или у вас «текстовый» счетчик интегрирован прямо в текст страницы?
Да, в текст страницы. Существует только два файла (index.php и page3.php), которые я в теме написал.
Сделайте групповой первичный/уникальный ключ page_id/ip(_id) (ip можно преобразовывать в 32-bit unsigned int и не мучаться с отдельной таблицей) и используйте второй показанный мной запрос.
Ок
 
Верх Низ