Счётчик, для сайта - это на любителя. Для самоутверждения, так сказать. Счётчиков, в сети - много. Желающих лезть, в чьи-то, загребущие лапки - гораздо меньше.
Эта страничка - для последних.
О чём базар?
Сразу скажу - за прототип взята сетевая идея рабочего счётчика, на PHP+SQL. В доводке кода принимали участие Apach 2.4.33, mySQL 8.0.11, PHP 7.2.5, phpMyAdmi 4.8.0.1, а так-же - форумы. Куда-же, без них.
Особая благодарность -
voral.
Существует (непроверенное) мнение, что скрипт будет работать только на mySQL. Есть, такое, мнение, да.
Начало
Всё начинается с подключения, к базе, которая - уже в наличии и вы, с нею - мило общаетесь:
connect_db.php
<?php
try {
$pdo = new PDO (
'mysql:host=localhost; dbname=name', // name - получите на сервере, после регистрации
'name',
'password',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
}
catch (PDOException $e) {
echo '<font color="#ff0000">Не удалось подключиться к mySQL:</font>';
}
?>
После удачного подключения, необходимо создать, на базе, пару таблиц:
create.php
<?php
// Необходим, только, для первичного запуска: http://ваш_сайт/каталог/create.php -> inter
require_once('connect_db.php');
try {
$pdo->exec('create table if not exists caunt (usip char(30) null, cookie char(10) null, date date null)');
echo '<font color="#00ff00">Таблица caunt создана</font>';
}
catch(PDOException $e) {echo '<font color="#ff0000">Ошибка при создании таблицы count:</font> ' . $e->getMessage();}
try {
$pdo->exec('create table if not exists countall (tall char(255) null)');
echo '<font color="#00ff00">Таблица countall создана</font>';
}
catch(PDOException $e) {echo '<font color="#ff0000">Ошибка при создании таблицы countall:</font> ' . $e->getMessage();}
?>
Что-то, такое:
1-я:
caunt - три колонки - usip, cookie и date - фиксируется ip-посетителя, cookie и дата посещения
usip | cookie | date |
127.11.8.1 | 3 | 2025-05-28 |
63.56.31.27 | 1 | 2025-05-29 |
... | ... | ... |
2-я:
countall - одна колонка - tall - содержит число, обновляющееся при
каждом заходе/обновлении на страничку/странички
По правде говоря, создавать таблицы - лучше "вручную", на сервере. Так - надёжнее.
В скрипте - нет мелочей
Цель скрипта - нанесение текста, в виде цифр, на готовое png-изображение:

Использование '& ~E_NOTICE' - избавляет от многих проблем. Нежелательность ' ~ ' предупреждений/замечаний - обеспечит исходное изображение и текст, в виде цифр, на нём, пусть и неправильный.
Организуем вывод ошибок & замечаний, обеспечиваем подключение к
серверу:
error_reporting (E_ALL & ~E_NOTICE);
require_once('connect_db.php');
Проверяем наличие графического модуля. Вещь - необязательная, для красоты:
if (!extension_loaded('GD')) {
echo '<font color="#ff0000">Не загружен модуль GD</font>';
exit;
}
Работаем с посетителем:
$usip = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : false;
$date = date('Y-m-d');
$cookie = addslashes($today_hosts);
Переменных можно добавить, если думаете завести админ-страничку.
На страничку, где установлен JS-скрипт счётчика (о нём - дальше, по тексту), заходит посетитель. Страничка - загружается и запускает файл
index.php, который мы создаём.
Обрабатываем полученные данные.
Добавление:
$res = $pdo->prepare('insert into caunt (usip, cookie, date) values (:usip, :cookie, :date)');
$res->execute(['usip' => $usip, 'cookie' => $cookie, 'date' => $date]);
Обновление:
$res2 = $pdo->query('update countall set tall = tall + 1');
Здесь используется query (не prepare) - перменных нет, лучше - упростить.
На первый взгляд - несложная операция но, только, на первый
взгляд. Дело в том, что перед активацией счётчика, в колонку tall необходимо добавить "0", цифра такая. Можно - через insert, а можно -
"ручками". Хотя - можете добавить любую цифру, так сказать - стартовую. Её можно поменять, в любое время. Для чего-ж, таблицу, делали? Можно, было - скриптом обойтись, ага.
Считываем общее количество (обновлённых, см.выше) просмотров:
$res3 = $pdo->query('select tall from countall');
while ($row = $res3->fetch()) {
$all_hits = $row['tall'];
}
Это - постоянно растущая цифра, помещённая в единственную ячейку таблицы, для плучения которой - необходим цикл. Скрипто-юмор, такой,
ага. Эта таблица - того стоит.
Количество просмотров, за сегодня:
$res4 = $pdo->prepare('select * from caunt where date = ?');
$res4->execute([$date]);
$today_hits = $res4->rowCount();
Это число - обнуляется, в полночь, поскольку - привязано к date.
Наши посетители:
$res5 = $pdo->prepare('select distinct usip from caunt where date = ?');
$res5->execute([$date]);
$today_hosts = $res5->rowCount(['usip']);
Это число, то-же, обнуляется, в полночь, поскольку - и оно привязано к date.
Делаем контроль счётчика:
if (strlen($all_hits) > 10 || !isset($all_hits)) {$all_hits = '?';}
if (strlen($today_hits) > 10 || !isset($today_hits)) {$today_hits = '?';}
if (strlen($today_hosts) > 10 || !isset($today_hosts)) {$today_hosts = '?';}
Здесь - без комментариев (10-ти значное число просмотров?! Это, даже, не смешно).
Графика
Продолжаем скрипт. Наносим цифры на png-изображение.
Запрещаем кэширование, что-бы картинка не сохранялась в кэше браузера, а обновлялась при каждой загрузке:
header('Expires: Mon, 23 Jun 2025 20:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
Очень похоже на содержимое тега head, прямо - от-туда слизано.
Объясняем, php-интерпретатору, формат картинки и её место-нахождение:
header('Content-type: image/png');
$image = imagecreatefrompng('./counter.png');
В нашем случае - цифры, это строка ("..."):
$str = "$all_hits";
$str2 = "$today_hits";
$str3 = "$today_hosts";
Не забываем про двойные кавычки.
Выбираем цвета, для цифр:
$color = imagecolorallocate($image, 255, 255, 0);
$color2 = imagecolorallocate($image, 0, 0, 255);
$color3 = imagecolorallocate($image, 0, 0, 0);
Цвета - на своё усмотрение.
Добавляем цифры на png-изображение:
imagestring($image, 3, 2, 2, $str, $color);
imagestring($image, 3, 2, 21, $str2, $color2);
imagestring($image, 3, 2, 40, $str3, $color3);
По первой, например, строчке - добавляем изображение, 3-им шрифтом (1...5, встроенные), левый-верхний X, Y, цифры-текст, цвет.
Создаём картинку и очищаем память - цифры-строчки - меняются:
imagepng($image);
imagedestroy($image);
Всё, мы создали файл
index.php.
Это - вероятная картинка:

Не забыть JS-скрипт
Ранее, мы говорили о JS-скрипте, фиксирующем положение счётчика, на странице:
<br>
<script>
cookie_detect='';
document.cookie='kamsoft=1;path=/';
cookie_detect+='c='+(document.cookie?'Yes':'No');
document.write('<img src="index.php"'+cookie_detect+Math.random()+'alt="counter" border="0" width="88" height="57"/>');
</script>
<noscript><img src="counter.png"><font color="#ff0000">JS - не поддерживается</font></noscript>
<br>
Функция Math.random(), применяется здесь, для генерации, при каждой загрузке страницы, нового случайного числа, в адресе счетчика. Делается это для того, что-бы браузер обращался, каждый раз, к серверу, а не брал данные из кэша. В этом скрипте - минимум,
необходимый для работы счётчика. Можете добавить, туда - всё, что угодно. Положитесь на фантазию.
P.S.
Для изображения, можно взять любой счётчик и использовать шрифт, которым располагает ваша страничка. Просто - изменится фунция создания
текста и добавится переменная шрифта:
$font = 'path/to/fonts/file.ttf';
$str = "$all_hits";
...
imagettftext($image, 8, 0, 16, 12, $color, $font, $str);
...
...назад