На ряде сайтов можно увидеть ссылку, а рядом надпись "То-то скачено столько-то раз". Или свою кнопку "Нравится" со счётчиком. Или пару "Нравится/Не нравится". Реализуются они подобным образом:

  1. Число нажатий хранится в базе данных (или отдельном файле). При загрузке браузером HTML-страницы оно подставляется в указанное в шаблоне место.
  2. Когда посетитель нажимает на кнопку на HTML-странице, JavaScript передаёт в PHP с какой страницы произошёл клик по кнопке.
  3. PHP меняет значение, записанное в базе данных. И передаёт число, увеличенное на единицу, в JavaScript.
  4. JavaScript меняет число на счётчике без перезагрузки HTML-страницы.

Ниже представлен упрощённый вариант (без подключения БД).

условия кнопка ссылка не засчитывать повторное нажатие если после нажатия текущая страница закрывается (например, при переходе по ссылке)

Файл 1.html

<button type="button" id="like">Нравится: <a href="#" id="like">Файл [скачено <output id="statlike">0</output></button> раз]</a> <script> document.getElementById('like').addEventListener('click', function(e){ if (window.XMLHttpRequest && localStorage.getItem('like') != location.pathname) { e.preventDefault(); var http = new XMLHttpRequest(), href = this.href; http.open('POST', 'stat.php'); http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); http.addEventListener('readystatechange', function() { if (this.readyState == 4 && this.status == 200) { document.getElementById('statlike').innerHTML = this.responseText; } }); http.timeout = 10000; http.addEventListener('loadend', function() { location = href }); http.send('url=' + location.pathname); localStorage.setItem('like', location.pathname); } }); </script>

Файл stat.php

<?php if (isset ($_POST['url'])) { $fn = $_SERVER['DOCUMENT_ROOT'] . $_POST['url']; if (file_exists($fn)) { $f = fopen($fn, "r+"); if (flock($f, LOCK_EX)) { $fr = fread($f, filesize($fn)); $pattern = '/(<output id="statlike">)(\d+)(<\/output>)/i'; $line_ok = preg_match($pattern, $fr, $matches); if($line_ok == 1) { $m = $matches[2] + 1; $fr = preg_replace($pattern, ''.$m.'', $fr, 1); rewind($f); ftruncate($f, 0); fwrite($f, $fr); } echo $m; flock($f, LOCK_UN); } fclose($f); } } ?>

Внимание: пример демонстрирует работу JS. PHP всё же должен менять базу данных, так как при использовании предложенного варианта могут возникнуть сложности при одновременном доступе к файлу (см. про flock).


Источник: http://shpargalkablog.ru/2015/10/counter-php.html



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Счетчик кликов по кнопке (с сохранением количества) - PHP для начинающих Всё для девочки 10 лет причёски

Как сделать счетчик кликов Как сделать счетчик кликов Как сделать счетчик кликов Как сделать счетчик кликов Как сделать счетчик кликов Как сделать счетчик кликов Как сделать счетчик кликов