Простой счётчик нажатий на кнопку (PHP)…
Ex.clusive | 21.10.2010Не так давно начал серию постов “Для новичка” и написал первый пост этой серии “Вывод информации о сервере посредством PHP“. В продолжение открытой темы даю новый меленький урок. Пост написан по просьбе пользователя Gala-Ko. В нём я постараюсь в очень очень кратком виде, но на живом примере описать основной принцип создания счетчика нажатий на кнопку типа “submit” или “button”, написанного на PHP и хранящего данные в простом текстовом файле *.txt. и позволяющего выводить его текущее значения рядом с вышеупомянутой кнопкой.
Надо сказать, что счётчик кликов, наравне со счётчиком посещений, можно считать одним из самых простых php-сценариев, между тем, отлично показывающим возможности и синтаксис языка. Именно с написания подобных вещей рекомендуется начинать изучение.
Итак, приступим. Предположим, что у нас имеется первоначальный код html-страницы с формой и кнопкой, при нажатии на которую запускается печать текущей страницы. Выглядит он следующим образом:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>ExclusiveBlog.ru</title> </head> <body> <form name="add" method="post"> <input type="submit" name="print" value="Распечатать" onclick="javascript:window.print()"> </form> </body> </html>
И так, для начала, мы имеем страницу (index.html) с формой, которая содержит кнопку, например “Распечатать”. Рядом с кнопкой нам надо вывести счетчик нажатий на данную кнопку (данное значения будет выводиться силами PHP и храниться в текстовом файле, допустим, counter.txt). Алгоритм прост – пользователь нажимает на кнопку, выполняется небольшой php-сценарий, который забирает из файла counter.txt текущее значение счетчика, прибавляет к нему единицу и переписывает содержимое файла, вставив в него новое значение (старое, при этом, заранее удаляется из файла).
PHP-сценарий у нас будет располагаться на самой странице с формой (так проще, но его в любой момент можно перенести в отдельный файл), следовательно её надо предварительно переименовать из “index.html” в “index.php”. Плюс, необходимо заранее создать файл “counter.txt”, в котором, собственно, и будет храниться текущее значение счетчика, и записать в него первоначально значение, а именно “0″. В будущем, можно добавить в сценарий пару строк и он сам будет создавать этот файл при его отсутствии.
Далее, после кнопки внутри формы вставляем первый PHP-фрагмент. В нём мы указываем путь к файлу, в котором хранится текущее значение, открываем файл на чтение, забираем значение, закрываем файл, выводим значение.
<?php $fn = "counter.txt"; \\ путь к файлу со значением счетчика $file = fopen($fn,"r"); \\открываем файл на чтение $c = fread($file, filesize($fn)); \\записываем текущее значение fclose($file); \\закрываем файл echo "Распечатано ".$c." раз(a)"; \\выводим значение ?>
Далее, снимаем с кнопки вызов js-сценария на распечатку, а после закрывающего тега формы </form> вставляем еще один PHP-фрагмент, который проверяет, была ли нажата кнопка. Если кнопка нажата то выполняется следующая последовательность действий: открывается на запись файл со значением; значение увеличивается на один и записывается в файл, предварительно удалив из него данные; файл закрывается. После этого выполняется простейший js-сценарий, запускающий распечатку текущей страницы.
<?php if (isset($_POST['print'])) // проверяем нажатие кнопки { $file = fopen($fn,"w"); // открываем файл на запись $c++; // увеличиваем значение на 1 fputs($file,$c); // записываем значение fclose($file); // закрываем файл ?> <script language="JavaScript1.1" type="text/javascript"> window.print(); // вызываем печать текущего документа </script> <?php } ?>
На этом, собственно, вся работа по модернизации страницы завершена. Ничего сложного, вроде бы, мы не сделали, но теперь всё именно так, как нам и хотелось. В итоге мы получили счётчик нажатий на кнопку в выводом его текущего значения на странице. Полный листинг страницы будет выглядеть, примерно, следующим образом:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>ExclusiveBlog.ru</title> </head> <body> <form name="add" method="post"> <input type="submit" name="print" value="Распечатать" /> <?php $fn = "counter.txt"; // путь к файлу со значением счетчика $file = fopen($fn,"r"); // открываем файл на чтение $c = fread($file, filesize($fn)); // записываем текущее значение fclose($file); // закрываем файл echo "Распечатано ".$c." раз(a)"; // выводим значение ?> </form> <?php if (isset($_POST['print'])) // проверяем нажатие кнопки { $file = fopen($fn,"w"); // открываем файл на запись $c++; // увеличиваем значение на 1 fputs($file,$c); // записываем значение fclose($file); // закрываем файл ?> <script language="JavaScript1.1" type="text/javascript"> window.print(); // вызываем печать текущего документа </script> <?php } ?> </body> </html>
Думается, пример получился не самый простой, но, зато он “живой” и умеет делать действительно что-то полезное. Тем более, что писался он по просьбе человека, перед которым стояла определённая задача – её мы, собственно, и решили. В дальнейшем, путём нехитрых манипуляций при минимальных знаниях PHP данный скрипт можно значительно расширить и доработать.
С радостью отвечу на возникшие вопросы и выслушаю Ваши предложения…
P.S. Всем, кому интересен веб-дизайн и блоггинг советую ознакомиться с конкурсом BestMasterиZация. Остальным, дабы оставаться в курсе всех современных “примочек”, рекомендую прочитать Обзор технических новинок.
Имхо, задача решена в корне неверно. Так как нам незачем перегружать страницу. Счётчик целесообразней сделать на AJAX, что намного сложнее. Или же просто напросто использовать Google Analitics.
Принцип прост:
1. на нажатие кнопки навешиваем ещё одну функцию – с помощью jQuery стучим в скрипт добавления значения счётчика
2. обновляем значение счётчика на экране, если нужно, опять с помощью jQuery
3 . всё
К тому же, используете устаревшие конструкции PHP.
Намного проще использовать 2 функции: file_get_contents и file_put_contents. Вместо fopen, fread, fputs, fclose…
Спасибо, попробую, хотя уже и так работает с html форума помогли.
jQuery и Ajax это уже из другой оперы. Я писал что-то вроде мини-урока по PHP с решением конкретной задачи. Никто и не обещал оптимального решения _) С JS, ясное дело, всё выглядело бы куда логичней и понятней, а вот использование серсисов гугла – ну это актуально когда нужно 1-2 ссылки так чекать, если это надо вписать в систему и для каждой кнопки\ссылки из каталога? Проще 1 раз написать и потом использовать.
На счёт устаревших конструкций – это да, погорячился, учитывая что мы получаем всего 1 строчку, которая, собственно, и является содержимым всего файла…
[...] “Для новичка”. Ранее я уже писал о создании “Счетчика кликов на PHP” и “Выводе информации о сервере посредством [...]
Это не то что я хотел и слава богу, реализация слишком запарная.
Я ж сразу сказал, что это далеко не оптимальный вариант, а лишь пример создания подобного сценария на основе самых простейших функций, с которых начинат изучение php.
Спасибо за разъяснение, как описывать процедуру после нажатия кнопки! Я сейчас об этом говорю:
if (isset($_POST['print'])) // проверяем нажатие кнопки
{
…
действие после нажатия
…
}
Привет! начинаю изучать php,уже сам написал простейший счётчик,без js и формы. теперь смотрю как другие люди реализуют) в принципе,всё понятно,как и то,что надо использовать более современные api вместо вызова нескольких устаревших функций. но одно меня постоянно напрягает,а именно фигурные скобки,обособляющие код. я привык что должно быть так: ,а у вас,к примеру:
10 ?>
11 code
12
почему скобка } как бы “врезается” между тегами ,а не закрывает код внутри части скрипта?
блин, парсер режет теги.короче вот это имел ввиду:
(php
}
?)
т.е. блок кода,который обрамляется {},почему-то разрезается непосредственно открывающим php-тегом “?”
Надо попробывать. Спасибо автору.
Здравствуйте. Как можно реализовать подсчет кликов по ссылке не переходя по самой ссылке (в ссылке есть событие onclick, в котором прописано “return false”). Ссылка выглядит так:
File 1
Добавление к предыдущему моему посту:
Ссылка выглядит так:
File 2
Извините, показать как выглядит ссылка не удалось. Смысл в том, что есть ссылка с событием, например, onClick=”download(‘file_1′);return false;”, в этой ссылке есть адрес href=”http://site.com/download/file_1.zip”, по которому происходит переход если в браузере отключен JS, или же человек открыл ссылку в новой вкладке. Мне нужно сделать так чтобы при нажатии на ссылку исполнялось событие “onclick” и в тоже время происходила запись клика, чтобы потом эти клики можна было вывисти на страницу. Прошу помочь решить проблему. Спасибо.
Отлично, спасибо!
Материал конечно же интересен, а вот вопрос о счётчике нажатия на ссылку остался открытым :(