Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Текстовый счетчик
 
 автор: SS   (13.03.2005 в 03:28)   письмо автору
 
 

Здравствуйте! Пересмотрел кучу счетчиков, ничего подходящего найти не удалось, остается надеяться на вашу помощь. Помогите, пожалуйста, с такого плана счетчиком страниц (страниц всего сейчас ок. 5000):

Запись информации:
1. Полный URL страницы
2. Полный TITLE страницы
3. дата установки счетчика на данной странице (или дата первого срабатывания).
4. текущее значение счетчика +1.
- Не считать Refresh F5, остальное - хиты, хосты, вчера, сегодня, завтра - неважно

======

Код внизу страницы для отображения значения счетчика.

======

Вывод на экран статистики в виде:

<URL>TITLE</URL>, дата установки, значение.

Возможность сортировки по любому значению.

ПРИМЕР:

000120 -- Римское авгуральное право. (12.02.05)
и т.д.

======

Возможно ли также сделать сортировку по популярности страницы, а не по текущему значению? Т.е., количество посетителей поделить на количество дней, прошедшее со дня установки счетчика на странице.

ПРИМЕР:
120/((12.03.05)-(12.02.05))=4 - в среднем, 4 человека в день - и сортировать по этой цифре.

   
 
 автор: SS   (14.03.2005 в 00:09)   письмо автору
 
   для: SS   (13.03.2005 в 03:28)
 

Это так сложно или просто осталось без внимания?

   
 
 автор: cheops   (14.03.2005 в 01:58)   письмо автору
 
   для: SS   (14.03.2005 в 00:09)
 

Я почему-то подумал при первом просмотре темы что, вы готовый ищете. Постараюсь завтра отписаться по поводу такого счётчика, помоему где-то на форуме начало его валялось, поищу.

   
 
 автор: SS   (14.03.2005 в 03:03)   письмо автору
 
   для: cheops   (14.03.2005 в 01:58)
 

Это я формулировал, что меня от счетчика интересует. На самом деле не так важно, какой там браузер, какая ОС, какой IP, во сколько минут и секунд посещали последний раз страницу и т.п. - это все информационный мусор какой-то. Важно, что людей интересует больше, а что меньше, чтобы свое свободное время, тратящееся на сайт, соответственно и расходовать, по возможности, рациональнее - у каждого человека есть ограниченный лимит времени на творчество. Вот и все. :)

   
 
 автор: cheops   (14.03.2005 в 02:02)   письмо автору
 
   для: SS   (14.03.2005 в 00:09)
 

А база данных MySQL вам не доступна? Это бы здорово облегчило бы жизнь и повысило надёжность Web-приложения.

   
 
 автор: SS   (14.03.2005 в 02:57)   письмо автору
 
   для: cheops   (14.03.2005 в 02:02)
 

Да, доступна.

   
 
 автор: cheops   (14.03.2005 в 09:23)   письмо автору
 
   для: SS   (14.03.2005 в 02:57)
 

Т.е. в своей работе счётчик вполне может использовать таблицу MySQL?

   
 
 автор: SS   (14.03.2005 в 15:18)   письмо автору
 
   для: cheops   (14.03.2005 в 09:23)
 

Да.

   
 
 автор: cheops   (15.03.2005 в 11:30)   письмо автору
1.7 Кб
 
   для: SS   (13.03.2005 в 03:28)
 

Этот счётчик написан на PHP, т.е. страница должна интерпертироваться как PHP-страница. Потребуется таблица MySQL (counter)
CREATE TABLE counter (
  id_counter int(11) NOT NULL auto_increment,
  url text NOT NULL,
  title text NOT NULL,
  puttime datetime NOT NULL default '0000-00-00 00:00:00',
  total bigint(20) NOT NULL default '0',
  PRIMARY KEY  (id_counter)
) TYPE=MyISAM;

Сам счётчик представляет собой два файла config.php и count.php. Пример оформления страницы, участвующей в подсчёте приведён в index.php
<?php
  
// Название страницы необходимо поместить
  // в переменную $title
  
$title "Римское право";
  
// Подключаем счётчик
  
include "count.php";
?>
  Здесь расположено основное содержимое страницы<br>
<?php
  
// Выводим результат на страницу, значение $id_counter
  // определяется в файле count.php
  
$query "SELECT total, DATE_FORMAT(puttime,'%d.%m.%Y') AS puttime FROM counter WHERE id_counter = $id_counter";
  
$ctn mysql_query($query);
  if(
$ctn)
  {
    
$total mysql_fetch_array($ctn);
    echo 
sprintf("%06d",$total['total'])." - $title (".$total['puttime'].")";
  }
?>

В первом блоке указывается путь к count.php, который при первом обращении вносит запись для страницы в таблицу counter, а при последующих увеличивает значение счётчика на единицу.
Во втором блоке происходит вывод числа посещений на странице.

   
 
 автор: SS   (15.03.2005 в 17:03)   письмо автору
 
   для: cheops   (15.03.2005 в 11:30)
 

Спасибо огромное, все работает!
Как теперь вывести список страниц на отдельной странице в виде:

значение <URL>TITLE</URL>, дата установки

с возможностью сортировки (хотя бы по значению и по названию страницы)?

   
 
 автор: cheops   (16.03.2005 в 12:40)   письмо автору
 
   для: SS   (15.03.2005 в 17:03)
 

Это можно осуществить при помощи следующего кода
<?php
  
// Устанавливаем соединение с базой данных
  
inlude "config.php";
  
// Выводим страницы с сортировкой по названию страниц
  
$query "SELECT url,
                   title,
                   total,
                   DATE_FORMAT(puttime,'%d.%m.%Y') AS puttime 
            FROM counter
            ORDER BY title"
;
  
$ctn mysql_query($query);
  if(!
$ctn) exit(mysql_error());
  
// В цикле выводим результаты
  
while($total mysql_fetch_array($ctn))
  {
    echo 
"<a href=http://".$_SERVER['SERVER_NAME'].$total['url'].">".$total['title']."</a> дата установки - ".$total['puttime']." (".sprintf("%06d",$total['total']).")<br>";
  }

  
// Выводим страницы с сортировкой по числу счётчика
  
$query "SELECT url,
                   title,
                   total,
                   DATE_FORMAT(puttime,'%d.%m.%Y') AS puttime 
            FROM counter
            ORDER BY total"
;
  
// Выводим страницы с сортировкой по дате установки и названию страницы
  
$query "SELECT url,
                   title,
                   total,
                   DATE_FORMAT(puttime,'%d.%m.%Y') AS puttime 
            FROM counter
            ORDER BY puttime, title"
;
?>

В конце приведены ещё два возможных запроса с различными вариантами сортировки - для их задействования следует подставить их вместо первого запроса $query. Следует обратить внимание на то, что config.php в данном случае отличается от того, что использовался в предыдущем счётчике, он прилагается в архиве.

   
 
 автор: SS   (15.03.2005 в 18:37)   письмо автору
 
   для: cheops   (15.03.2005 в 11:30)
 

Да, есть еще одно пожелание:
допустим, есть 10 разделов (напр., 01, 02, 03 и т.д.), статистика по которым интересует, разумеется, поотдельности. Сейчас этого реализовать нельзя, насколько я понимаю?

   
 
 автор: cheops   (16.03.2005 в 12:48)   письмо автору
 
   для: SS   (15.03.2005 в 18:37)
 

Здесь есть два пути
- добавить ещё одно поле под номер раздела в таблице count с исправлением всего того, что сейчас есть. Так же придётся задавать явно номер раздела на странице счётчика или вычислять его исходя из URL страницы. Этот самый быстрый вариант, так как потом будет очень просто и быстро запросить все записи, чей номер раздела равен запрашиваемому
- второй вариант не предполгает изменения существующего кода и основан на вычислении номера раздела по полю URL, так как URL будут различаться - можно будет найти записи чей URL соответсвует запрашиваемому разделу. Этот медленнее, так как работа с числовыми полями протекает во много раз быстрее, чем с текстовыми.

   
 
 автор: SS   (16.03.2005 в 14:29)   письмо автору
 
   для: cheops   (16.03.2005 в 12:48)
 

Да, конечно, лучше первый вариант.

   
 
 автор: cheops   (16.03.2005 в 14:41)   письмо автору
 
   для: SS   (16.03.2005 в 14:29)
 

А вы бы не могли бы тогда эти разделы перечислить и указать так же чем отличаются URL этих разделов друг от друга?

   
 
 автор: SS   (16.03.2005 в 19:29)   письмо автору
 
   для: cheops   (16.03.2005 в 14:41)
 

Ну, наверное, лучше оставить 01, 02, 03, а там уже конкретно этот раздел вызывать на html-страницу, соответственно оформленную: название раздела, формат и т.д.
Тем не менее, например:
Раздел ПУБЛИКАЦИИ (http://ancientrome.ru/publik/)
Раздел АНТИЧНАЯ ЛИТЕРАТУРА (http://ancientrome.ru/antlitr/)
Раздел НОВОСТИ АРХЕОЛОГИИ (http://ancientrome.ru/archaeol/)
Раздел КАРТЫ (http://ancientrome.ru/map/)
и т.д., все не перечисляю.
Или, например, раздел и в нем подразделы:
Раздел АНТИЧНАЯ СКУЛЬПТУРА (http://ancientrome.ru/art/artwork/sculp/)
подраздел РИМСКИЕ ИМПЕРАТОРЫ (http://ancientrome.ru/art/artwork/sculp/rom/imp)
подраздел ГРЕЧЕСКАЯ МИФОЛОГИЯ (http://ancientrome.ru/art/artwork/sculp/mythology/gr/)
и т.д.
Т.е., понятно, - чтобы не мешалась мифология с императорами, новости археологии с античной литературой, и т.д., - поскольку разные совершенно вещи.
Но подраздел можно оформить и как самостоятельный раздел, главное вытащить по нему отдельную статистику.

   
 
 автор: cheops   (16.03.2005 в 19:47)   письмо автору
1.7 Кб
 
   для: SS   (16.03.2005 в 19:29)
 

Хорошо... просто номер раздела удобно вычислять автоматически из URL страницы, при подключении счётчика к 5000 страницам могут быть ошибки, если его вручную прописывать на каждой странице... Таблица counter теперь будет содержать дополнительное целочисленное поле под раздел - part
CREATE TABLE counter (
  id_counter int(11) NOT NULL auto_increment,
  url text NOT NULL,
  title text NOT NULL,
  puttime datetime NOT NULL default '0000-00-00 00:00:00',
  total bigint(20) NOT NULL default '0',
  part int(11) NOT NULL default '0',
  PRIMARY KEY  (id_counter),
  KEY part (part)
) TYPE=MyISAM;

В аттаче исправленный вариант счётчика, выборка с сортировкой остаётся неизменной. Для выборки статистики определённого раздела в инструкцию WHERE SQL-запроса выборки необходи добавить дополнительное условие
AND part=1

где 1 - номер выбираемого раздела.

   
 
 автор: SS   (16.03.2005 в 21:11)   письмо автору
 
   для: cheops   (16.03.2005 в 19:47)
 

1.
>Для выборки статистики
>определённого раздела в инструкцию WHERE SQL-запроса выборки
>необходи добавить дополнительное условие
>
AND part=1

>где 1 - номер выбираемого раздела.

Извиняюсь, но не совсем понял, где это должно быть.

2. Как показания счетчика сортировать по убыванию?

3. Не сортирует по названию страницы. Правда, чтобы не прописывать все названия вручную, вместо


$title = "Римское право";


было прописано


$title=$_SERVER['PHP_SELF'];
$handle = fopen($_SERVER['SCRIPT_FILENAME'], "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    preg_match("/<title>(.*)<\/title>/i",$buffer,$find);
    if ( $find[1] != "" ) {
        $title=$find[1];
        break;
    }
}
fclose($handle);


, с чем, видимо и связана проблема. Как сортировать в данном случае?

   
 
 автор: cheops   (17.03.2005 в 00:46)   письмо автору
 
   для: SS   (16.03.2005 в 21:11)
 

1) Извиняюсь, мне показалось что конструкция WHERE у нас уже имеется, запрос следует модифицировать следующим образом
<?php
  $query 
"SELECT url, 
                   title, 
                   total, 
                   DATE_FORMAT(puttime,'%d.%m.%Y') AS puttime 
            FROM counter 
            WHERE part = 1
            ORDER BY title"
;
?>

где 1 - номер раздела.

2) За сортировку значений несёт ответственность конструкция ORDER BY, для сортировки в обратном направлении следует добавить ключевое слово DESC
<?php
  $query 
"SELECT url, 
                   title, 
                   total, 
                   DATE_FORMAT(puttime,'%d.%m.%Y') AS puttime 
            FROM counter 
            WHERE part = 1
            ORDER BY title DESC"
;
?>


3) Посмотрите в таблице правильно ли добавляются значения в поле title, для этого необходимо воспользоваться панелью администрирования MySQL - phpMyAdmin, которая с высокой долей вероятности доступна у вас на хостинге.

   
 
 автор: SS   (17.03.2005 в 15:56)   письмо автору
 
   для: cheops   (17.03.2005 в 00:46)
 

Отлично, все работает. Спасибо!
С сортировкой - проблема была в кодировке KOI8-R.

   
 
 автор: SS   (17.03.2005 в 18:56)   письмо автору
 
   для: cheops   (17.03.2005 в 00:46)
 

Еще небольшой нюанс:
www.adres.ru
и
adres.ru/index.htm
и
adres.ru/
для него разные вещи и считает он их раздельно. Весь смысл счетчика убивается. Как быть?

   
 
 автор: cheops   (17.03.2005 в 23:16)   письмо автору
 
   для: SS   (17.03.2005 в 18:56)
 

Хм... вообще говоря строка
<?php
$title
=$_SERVER['PHP_SELF'];
?>

Возвращает только часть URL, которая следует за доменом, т.е. в базе данных строки www.adres.ru и adres.ru не должны появляться, а появляться должны только /index.htm и /, тогда задача состоит в том, что если
<?php
  
if($_SERVER['PHP_SELF'] == "/"$_SERVER['PHP_SELF'] .= "index.html";
?>

Но я в полне допускаю, что у вас на сервере это не так и $_SERVER['PHP_SELF'] возвращает полный URL, тогда следует либо при помощи функции phpinfo() поискать аналог, либо отрезать доменную часть...

   
 
 автор: SS   (18.03.2005 в 15:16)   письмо автору
 
   для: cheops   (17.03.2005 в 23:16)
 

А что прописать в случае, если код прежний (где-то удобнее ставить его, где-то - тот, что выше)?
<?php
$part =1;
$title="Римское право";
include ('count.php');
?>

   
 
 автор: cheops   (18.03.2005 в 19:35)   письмо автору
 
   для: SS   (18.03.2005 в 15:16)
 

Я если честно, не очень понял вопрос... :(((

   
 
 автор: SS   (19.03.2005 в 01:28)   письмо автору
 
   для: cheops   (18.03.2005 в 19:35)
 

Это, наверное, я не совсем понял - где должен быть код?

<?php 
  
if($_SERVER['PHP_SELF'] == "/"$_SERVER['PHP_SELF'] .= "index.html"
?>

   
 
 автор: cheops   (19.03.2005 в 11:08)   письмо автору
 
   для: SS   (19.03.2005 в 01:28)
 

А у нас же $_SERVER['REQUEST_URI'], а не $_SERVER['PHP_SELF']... данный код должен быть размещён в файле count.php. Но я перестраховался и использовал $_SERVER['REQUEST_URI']... В этом случае следует применить другой подход - подумаю и отпишусь позже.

   
 
 автор: SS   (20.03.2005 в 20:46)   письмо автору
 
   для: cheops   (19.03.2005 в 11:08)
 

Не забудьте про меня :)

   
 
 автор: cheops   (20.03.2005 в 21:42)   письмо автору
 
   для: SS   (20.03.2005 в 20:46)
 

Спасибо, что напомнили :))) Попробуйте заменить count.php на файл прикреплённый в архиве, попробуем составить строку с адресом файла самостоятельно
<?php
  $url 
$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
?>

Мне кажется, что подстраховка
<?php
  
if(substr($_SERVER['PHP_SELF'],strlen($_SERVER['PHP_SELF'])-1) == "/"$_SERVER['PHP_SELF'] .= "index.html";
?>

теперь уже лишняя, но я не совсем в этом уверен, так как значения серверных переменных отличаются на различных серверах.

   
 
 автор: SS   (22.03.2005 в 01:20)   письмо автору
 
   для: cheops   (20.03.2005 в 21:42)
 

Отлично! Спасибо! Только убрал вопросительный знак:

<?php 
  $url 
$_SERVER['PHP_SELF']."".$_SERVER['QUERY_STRING']; 
?> 

   
 
 автор: cheops   (22.03.2005 в 09:39)   письмо автору
 
   для: SS   (22.03.2005 в 01:20)
 

В принципе можно и убрать и записать ещё проще
<?php 
  $url 
$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']; 
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования