Код магнитолы

JS и не только

Java - это...интересно

Hello, Android!

Assembler...м-м-э

Создаём сайт

Любимые сериалы

Гостевая

Что по чём?

Astrometa:TVR-player


Счётчик, для сайта - это на любителя. Для самоутверждения, так сказать. Счётчиков, в сети - много. Желающих лезть, в чьи-то, загребущие лапки - гораздо меньше.
Эта страничка - для последних.

О чём базар?

Сразу скажу - за прототип взята сетевая идея рабочего счётчика, на 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 и дата посещения

usipcookiedate
  127.11.8.1  3  2025-05-28
  63.56.31.27  1  2025-05-29
  ...  ...      ...

2-я: countall - одна колонка - tall - содержит число, обновляющееся при каждом заходе/обновлении на страничку/странички

tall
27

По правде говоря, создавать таблицы - лучше "вручную", на сервере. Так - надёжнее.

В скрипте - нет мелочей

Цель скрипта - нанесение текста, в виде цифр, на готовое 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);
...


...назад