Перейти к содержимому



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

#1 Pavl
Pavl
  • Пользователь
  • 8 сообщений
  • Репутация: 0
0

Обновлено 03 мая 2020 - 19:39  Отправлено 02 мая 2020 - 18:27

Добрый день!

Существует счётчик для галереи изображений, но он не совсем правильно работает.

Есть два файла: index.php (в нём находится галерея, выводимая из БД) и page3.php (в нём срабатывает счётчик).

В index.php есть такая строка:

echo "<a href='page3.php?id=".$row['id']."'>$row[name]</a>";

при клике на которую происходит переход на page3.php и срабатывает счётчик.

 

Проблема в том, что, почему-то, в поле hosts таблицы img кол-во кликов записывается (следственно потом и выводится на экран), только значение одной картинки, а нужно, чтобы выводились значения кол-ва уникальных посетителей всех картинок, несмотря на то, что я прописываю в коде WHERE id = '".$_GET["id"]."', чтобы в поле hosts записывались значения для каждой картинке при клике на неё.

Вот полный код файла page3.php:

<?php
mysql_connect('localhost','root','');
$res = mysql_select_db('images');
//Получаем IP-адрес посетителя и сохраняем текущую дату
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$date = date('Y-m-d');
$id = $_GET['id'];
echo $id;
$current_ip = mysql_query("SELECT ip_id FROM ips2 WHERE ip_address = '$visitor_ip'");
$hosts = $a['hosts'];
if(mysql_num_rows($current_ip) != 1) {
	//Заносим в базу IP-адрес текущего посетителя
	mysql_query("INSERT INTO ips2(ip_address) VALUES('$visitor_ip')");
	//Добавляем в базу +1 уникального посетителя (хост)
	mysql_query("UPDATE img SET hosts = hosts + 1 WHERE id = '".$_GET["id"]."'");	
}
$res = mysql_query("SELECT * FROM img");
$row = mysql_fetch_assoc($res);
echo '<p>Уникальных посетителей: ' . $row['hosts'] . '<br />';
 ?>

Так выглядят две таблицы базы данных images:

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

 

Помогите разобраться, в чём здесь проблема?


 

 

Сообщение отредактировал Pavl: 02 мая 2020 - 18:28

  • 0

#2 MattCutts
MattCutts
  • Пользователь
  • 463 сообщений
  • Репутация: 37

Отправлено 02 мая 2020 - 21:44

ты серьезно, еще кто-то пользуется mysql?

какая у тебя версия пыха?

в твоем случае надо использовать либо COUNT либо SUM


"SELECT COUNT(1) FROM img"

при условии, что img у тебя уникальный,тогда данные у тебя будут корректные


а так твои запросы дырявые sql-injection прям из учебника можно провести, жанные надо экранировать, перед записью в базу


Сообщение отредактировал MattCutts: 02 мая 2020 - 21:35

  • 0

#3 miketomlin
miketomlin
  • Пользователь
  • 561 сообщений
  • Репутация: 118

Отправлено 03 мая 2020 - 11:30

ты серьезно, еще кто-то пользуется mysql?
Вы бы поточнее выражались. Могут не так понять ;)
  • 0


#4 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 8 сообщений
  • Репутация: 0

Отправлено 03 мая 2020 - 14:59

@MattCutts

Использую версию php - 5.5. Есть возможность включить версию 7.0 и выше, но я сейчас изучаю php по видеоурокам, в которых рекомендуется  версия 5.5 - поэтому её и использую.

Прописал строку "SELECT COUNT(1) FROM img" - данные совсем не выводятся.

Прописал экранирование строки $id = mysql_real_escape_string($id); - ничего не изменилось.

Не понимаю, почему счётчик заносит значение в поле hosts, только один раз. Срабатывает один раз, несмотря на то, что я пишу WHERE id = '".$_GET["id"]."'");    При каждом клике по ссылке должно срабатывать, ведь так?


  • 0

#5 MattCutts
MattCutts
  • Пользователь
  • 463 сообщений
  • Репутация: 37

Отправлено 03 мая 2020 - 15:31

@Pavl, выкинь эти курсы, они устарели оооочень давно, пятая версия уже года два как не поддерживается, если брать библиотеку, то хотя бы mysqli

при клике ничего не должно срабатывать.

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

или просто при переходе на страницу, тогда да, можно обновить запись.

а твоя проблема в этом условии

if(mysql_num_rows($current_ip) != 1) {

обновление происходит в нем, а следовательно он не попадает в условие и повторное обновление не происходит

 

а если с одного IP зайдут два пользователя?  ) у тебя немного некорректно составлена логика

 

вынеси из условия

mysql_query("UPDATE img SET hosts = hosts + 1 WHERE id = '".$_GET["id"]."'");	

Сообщение отредактировал MattCutts: 03 мая 2020 - 15:41

  • 0

#6 MattCutts
MattCutts
  • Пользователь
  • 463 сообщений
  • Репутация: 37

Отправлено 03 мая 2020 - 15:48

и тебе нужно не $row = mysql_fetch_assoc($res); а mysql_num_rows($res)

открой документацию или на курсе не учат ее читать?

mysql_num_rowsВозвращает количество рядов результата запроса

mysql_fetch_assocВозвращает ряд результата запроса в качестве ассоциативного массива

 

разницу видишь?

 

https://www.php.net/...u/ref.mysql.php


Сообщение отредактировал MattCutts: 03 мая 2020 - 15:51

  • 0

#7 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 8 сообщений
  • Репутация: 0

Отправлено 03 мая 2020 - 15:52

@MattCutts

Если изменить код на:

if(mysql_num_rows($current_ip) === 1) {

то в базу данных вообще ничего не записывается. В ячейках таблицы одни нули.

Тоже самое, если убрать:

mysql_query("UPDATE img SET hosts = hosts + 1 WHERE id = '".$_GET["id"]."'");     

тоже - одни нули в таблицах.

 

То, что Вы пишите об устаревших курсах - это спасибо, я учту.

 

а если с одного IP зайдут два пользователя?  )
 

А как с одного ip могут зайти два разных пользователя?  :huh:  С двух разных ip  - один пользователь может зайти, а двое с одного как?

Это, наверное уже другая тема? (нужно будет куки и сессии подключать, насколько понимаю).


  • 0

#8 MattCutts
MattCutts
  • Пользователь
  • 463 сообщений
  • Репутация: 37

Отправлено 03 мая 2020 - 15:55

А как с одного ip могут зайти два разных пользователя? :huh: С двух разных ip - один пользователь может зайти, а двое с одного как?

наверное они находятся в одной подсети, например у предприятия может быть один статичный IP адрес и 100 сотрудников выходя в сеть будут светить им, для тебя это будет один пользователь, а сессия ненадежна, закрыл браузер и все. нужна более уникальная связка данных, поищи в интернете.

 

сейчас найду пятый пых )


Сообщение отредактировал MattCutts: 03 мая 2020 - 16:01

  • 0

#9 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 8 сообщений
  • Репутация: 0

Отправлено 03 мая 2020 - 16:02

наверное они находятся в одной подсети, например у предприятия может быть один статичный IP адрес и 100 сотрудников выходя в сеть будут светить им.  
 

Вообще-то, да. Например, в какой-либо организации есть wi-fi, который идёт от одного компьютера (с одного ip-адреса) на разные компьютеры. Но это, как раз следующая тема. Куки, сессии я дальше буду изучать.


  • 0

#10 MattCutts
MattCutts
  • Пользователь
  • 463 сообщений
  • Репутация: 37

Отправлено 03 мая 2020 - 16:03

бросай ты этот курс лучше сразу, учись правильным вещам изначально, уже 20-й год на  дворе


  • 0

#11 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 8 сообщений
  • Репутация: 0

Отправлено 03 мая 2020 - 16:05

бросай ты этот курс лучше сразу, учись правильным вещам изначально, уже 20-й год на  дворе
 

Хорошо, только этот счётчик доделаю и брошу.  :)


  • 0

#12 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 8 сообщений
  • Репутация: 0

Отправлено 03 мая 2020 - 16:23

Заменил 

$row = mysql_fetch_assoc($res);
 

на

mysql_num_rows($res)
 

Теперь, ничего не выводится. Только пустота в выводе количества уникальных посетителей.


  • 0

#13 MattCutts
MattCutts
  • Пользователь
  • 463 сообщений
  • Репутация: 37

Отправлено 03 мая 2020 - 17:30

с использованием mysqli

в принципе синтаксис тот же, разберешься, но это не точно:

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

2020-05-03_17-29-48.png

 

как давно это было, лет 10 наверное
 


  • 0

#14 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 8 сообщений
  • Репутация: 0

Отправлено 03 мая 2020 - 18:36

@MattCutts

Код работает почти, как необходимо, но не совсем.

Ведь идея в том, чтобы у каждой картинки учитывались уникальные посетители. А если я захожу в таблицу и меняю там ip-адрес с 127.0.0.1 на 127.0.0.6 (например), то уникальных посетителей должно получаться уже 2, а не 1, но этого не происходит. Так, по-прежнему, и выводится Уникальных посетителей: 1. Ещё бы, как это решить, но пока не получается.


  • 0

#15 MattCutts
MattCutts
  • Пользователь
  • 463 сообщений
  • Репутация: 37

Отправлено 03 мая 2020 - 19:03

@Pavl, так блин сразу опиши задачу нормально, а не по кусочкам выдавай инфу, мне больше нечего делать, чтобы с тобой возиться целый день

я сказал, что у тебя кривая логика

расширь таблицы, сделай связь между ними, материала у тебя достаточно, чтобы доработать до того, что тебе нужно.

в твоем случае нужна промежуточная таблица, через не и твори всю магию, тугда получается много ко многим, поэтому это единственное решение.


Сообщение отредактировал MattCutts: 03 мая 2020 - 19:03

  • 0

#16 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 8 сообщений
  • Репутация: 0

Отправлено 03 мая 2020 - 19:39

@MattCutts

Ладно, спасибо большое. Дальше я сам (не каждый же символ в коде, в самом деле, Вы мне будете диктовать).  :)

:smile-thumb-up:


  • 0

robot
robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
albedo albedo 1-й за Май
Очков активности: 198 5 тем, 29 сообщений, 3 балла репутации
Сайт: online24news.ru
ТОП самых активных за этот месяц
  • Фотография maks200
    #1

    maks200
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография NewBlade
    #2

    NewBlade
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография Movut
    #3

    Movut (seo-aspirant.ru)
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография 1head
    #4

    1head
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография magnet
    #5

    magnet (rbfxdirect.com)
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография Zevss
    #6

    Zevss (domles43.ru)
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография Nik_2266999
    #7

    Nik_2266999
    Очков активности: 3 0 тем, 2 сообщения, 1 балл репутации

  • Фотография narolskay
    #8

    narolskay (ortopedicheskaja-podushka.ru)
    Очков активности: 3 0 тем, 2 сообщения, 1 балл репутации

  • Фотография wp01
    #9

    wp01
    Очков активности: 3 0 тем, 2 сообщения, 1 балл репутации

  • Фотография getsend
    #10

    getsend
    Очков активности: 3 0 тем, 2 сообщения, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

Оформление форума – IPBSkins.ru