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

Форум PHP

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

 

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

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

тема: счётчик нажатия на линк
 
 автор: cccp   (20.11.2005 в 01:56)   письмо автору
 
 

Есть ли у кого нибудь пример простого скрипта, без базы данных, для нажатия на линк?

   
 
 автор: Shorr Kan   (20.11.2005 в 03:02)   письмо автору
 
   для: cccp   (20.11.2005 в 01:56)
 

Линк должен вести на промежуточную страничку. Скажем, если вы хотите попасть на www.aaa.com , а ваша страничка с линком - www.bbb.com/page.php , то на нее ставите href="count.php?url=<?print urlencode("www.aaa.com");?>

А на count.php - запись, куда надо, а потом: header("Location: ".urldecode($_GET['url']));

   
 
 автор: cccp   (20.11.2005 в 12:32)   письмо автору
 
   для: Shorr Kan   (20.11.2005 в 03:02)
 

а как выгледит "запись" на count.php ?

   
 
 автор: Akira   (20.11.2005 в 13:07)   письмо автору
 
   для: cccp   (20.11.2005 в 12:32)
 


<?
@preg_match("/^(http:\/\/)?([^\/]+)/i"$_GET['url'], $matches); // www 
@$host $matches[2]; // адрес
$fopen fopen ($host.'.log',"a+"); // открываем или создаем файл с именем ссылки
$data '';
    
$data .= date("Y-m-d h:i:s"); // Время перехода
    
$data .= "\t";
    
$data .= $_SERVER['HTTP_REFERER']; // Откуда пользователь переходит
    
$data .= "\t";
    
$data .= $_SERVER['HTTP_USER_AGENT']; // Браузер пользователя
    
$data .= "\n";
fwrite($fopen,$data); // Пишем
fclose($fopen); .. Закрываем
header
('Location: '.$_GET['url']); // Переходим по ссылке
?>

   
 
 автор: cccp   (20.11.2005 в 15:21)   письмо автору
 
   для: Akira   (20.11.2005 в 13:07)
 

ок, я попоробовал. Всё получаестя.
Я кое-какие ваши ошибки исправил. Вы видемо торопились.
Только это не совсем то что я хотел.
Мне нужно было просто что бы скрипт считал типа 1, 2 и т.д. , раза нажато на линк.

   
 
 автор: goddamn   (20.11.2005 в 16:04)   письмо автору
 
   для: cccp   (20.11.2005 в 15:21)
 

так считал и куда-то записывал ? или просто выводил инф-ю о количестве кликов для определенного пользователя ?
скрипт зависит от конечного результата, который тебе нужен.

   
 
 автор: cccp   (20.11.2005 в 16:11)   письмо автору
 
   для: goddamn   (20.11.2005 в 16:04)
 

считал и куда-то записывал.
А вивести информацию, это просто, это я знаю как сделать (с помощью "<?php include("..."); ?>")

   
 
 автор: Akira   (20.11.2005 в 16:49)   письмо автору
 
   для: cccp   (20.11.2005 в 16:11)
 

Как сосчитать?

<?
$files
glob ("*.log"); // Все log файлы ссылок
foreach ($files as $host) {
    echo 
$host.": ".count(file($host));
    echo 
"<br>";
}

?>

   
 
 автор: cccp   (20.11.2005 в 17:25)   письмо автору
 
   для: Akira   (20.11.2005 в 16:49)
 

А как совместить эти два скрипта?

Я пробовал, но запутался.

   
 
 автор: Akira   (20.11.2005 в 18:05)   письмо автору
 
   для: cccp   (20.11.2005 в 17:25)
 

Последний скрипт, запускаеться как отдельный файл, в той же папке где и лог файлы.

   
 
 автор: goddamn   (20.11.2005 в 17:20)   письмо автору
 
   для: cccp   (20.11.2005 в 16:11)
 

!

   
 
 автор: goddamn   (20.11.2005 в 17:25)   письмо автору
 
   для: cccp   (20.11.2005 в 16:11)
 

>Только это не совсем то что я хотел.
>Мне нужно было просто что бы скрипт считал типа 1, 2 и т.д. , раза нажато на линк.
т.е. формат записи в файле должен быть типа такого link cont
тогда ссылки, которые хочешь считать д.б. вида <a href="count.php?url=<?print urlencode("www.aaa.com");?>
см. пост Akira - все правильно, но если нужно только количество кликов, то

<? 
$encodedurl 
urlencode($url); // переводим в нормальный вид
$logfilename "clicks.log";
$logfile fopen($logfilename,"r+"); // открываем файл-базу
$log file($logfilename); //считываем все в массив $log
$linenum 0;
foreach(
$log as $data// проверяем сходство $url и значение линка в каждой строке
    
{
    
$link explode("\t",$data);
    if (
strcasecmp($link[0],$encodedurl) == 0// если совпадает, то ...
        
{
        
$log[$linenum] = $link[0]."\t".($link[1]+1)."\r\n"// обновляем данне
        
$found true// создаем флаг, что этот линк есть в списке
        
break 1;
        }
    
$linenum++;
    }

if (!
$found// если линка в списке не было, то добавляем новый со значением счетчика = 1
    
{
    
$log[] = $encodedurl."\t1\r\n";
    }

foreach(
$log as $data// делаем новый список с учетом обновлений
    
{
    
$newdata .= $data;
    }

fwrite($logfile,$newdata); // пишем новый список в файл
fclose($log); // закрываем

header('Location: '.$_GET['url']); // Переходим по ссылке 
?>

типа того
формат файла links.log link[tab]count
[tab] - таб

   
 
 автор: cccp   (21.11.2005 в 12:19)   письмо автору
 
   для: goddamn   (20.11.2005 в 17:25)
 

Спасибо ещё раз.
А можно в писать в последний скрипт строчку даты посещения "Y-m-d h:i:s"?
Что бы получился резултат типо:

Посетили: 12 (раз)
Последнее посещение: 21-11-2005 в 22:00


так сделать можно?

На этой строчке:

 $newdata .= $data; 


поставить так:


$newdata .= $data("Y-m-d h:i"); 


Правильно?

   
 
 автор: cccp   (21.11.2005 в 20:12)   письмо автору
 
   для: cccp   (21.11.2005 в 12:19)
 

Что-то какая-то путаница получилась....

В файле .log у меня идёт запись такого типа:

galeries%2Fgalerie_%2Findex.php3 3

А после нажатия на линк,
каторый такго типа:

<a href="count.php?url=<?print urlencode("galeries/galerie_2/index.php3");?>"

у меня такая ошибка:

Warning: fclose(): supplied argument is not a valid stream resource in click.php on line 30

Warning: Cannot modify header information - headers already sent by (output started at /var/www/63/p/g/o/ikara.com/count.php:30) in count.php on line 32

   
 
 автор: goddamn   (21.11.2005 в 20:20)   письмо автору
 
   для: cccp   (21.11.2005 в 12:19)
 

по обоим вопросам сразу
<? 
$encodedurl 
urldecode($url); // переводим в нормальный вид
$logfilename "clicks.log"
$log file($logfilename); //считываем все в массив $log
$logfile fopen($logfilename,"w"); // открываем файл-базу для записи
$linenum 0;
foreach(
$log as $data// проверяем сходство $url и значение линка в каждой строке 
    
{
    
$link explode("\t",$data);
    if (
strcasecmp($link[0],$encodedurl) == 0// если совпадает, то ... 
        
{
        
$log[$linenum] = $link[0]."\t".($link[1]+1)."\t".date('Y-m-d H:i')."\r\n"// обновляем данне 
        
$found true// создаем флаг, что этот линк есть в списке 
        
break 1
        } 
    
$linenum++; 
    } 

if (!
$found// если линка в списке не было, то добавляем новый со значением счетчика = 1 
    

    
$log[] = $encodedurl."\t1\t".date('Y-m-d H:i')."\r\n"
    }

foreach(
$log as $data// делаем новый список с учетом обновлений 
    

    
$newdata .= $data
    } 

fwrite($logfile,$newdata); // пишем новый список в файл
fclose($log); // закрываем 

header('Location: '.$_GET['url']); // Переходим по ссылке 
?>

скрипт проверил, работает.

ссылки пиши так :
<a href="counter.php?url=<?print urlencode("./index1.html");?>">1</a>
<a href="counter.php?url=<?print urlencode("./index2.html");?>">2</a>
<a href="counter.php?url=<?print urlencode("./index3.html");?>">3</a>


запись в clicks.log будет такая :
./index1.html 2 2005-11-21 20:45
./index3.html 1 2005-11-21 20:45
./index2.html 5 2005-11-21 20:45


вот. если что - пиши.

   
 
 автор: cccp   (21.11.2005 в 22:10)   письмо автору
 
   для: goddamn   (21.11.2005 в 20:20)
 

Спасибо.
Только у меня таже ошибка при нажатии на линк с этим Warning: fclose():
И вообще-то запись в log юрл ./index1.html мне не нужна.
Только так 2 2005-11-21 20:45 уже хорошо !
;)

   
 
 автор: goddamn   (21.11.2005 в 22:23)   письмо автору
 
   для: cccp   (21.11.2005 в 22:10)
 

ссылки были для примера и теста :) вместо ./html1 у тебя будут свои линки, на которые ты поставишь ссылки.
по поводу ошибки - а файл clicks.log вобще создается/изменяется ? если нет, то пропиши в $logfilename путь к файлу от / , т.е. /path/to/file/clicks.log
и посмотри логи! там об ошибках дожно протоколироваться :)

   
 
 автор: cccp   (21.11.2005 в 22:38)   письмо автору
 
   для: goddamn   (21.11.2005 в 22:23)
 

Я понял что линки мне надо свои ставить.
Я так и делал, просто для примера оставил ваши.
файл .log создаётся и изменяется....
Но ошибка всё ранво такая-же. даже если путь к файлу в виде "/path/to/file/clicks.log" (естественно с моим правельным path)

   
 
 автор: goddamn   (21.11.2005 в 22:55)   письмо автору
 
   для: cccp   (21.11.2005 в 22:38)
 

извини,недосмотрел.
fclose($logfile); // закрываем
каюсь,виноват ...

   
 
 автор: cccp   (23.11.2005 в 01:02)   письмо автору
 
   для: goddamn   (21.11.2005 в 22:55)
 

Спасибо!
Так всё ОК.
Только мне надо было путь к файлу поставить типа: path/to/file/clicks.log

goddamn.
А как убрать строчку котороя записывает сам линк, типа: index1.html
так-как мне это не надо.
Просто хотел что бы записывало просто 2 2005-11-21 20:45
А я потом переделаю на типа:

Посетили: 2 раз(а)
Последний раз: 2005-11-21 в 20:45



Зарание спасибо!

   
 
 автор: goddamn   (23.11.2005 в 12:06)   письмо автору
 
   для: cccp   (23.11.2005 в 01:02)
 

так если будет записывать как 2 2005-11-21 20:45, как потом разберешься, к какому линку это относится ??? чего-то не пойму :) ведь каждая строчка для своего линка, иначе скрипт по-другому писать нужно было :)
ну а так, $encodedurl и $link[0] - это и есть линк (типа index.html)... просто не добавляешь его к данным, если не нужно записывать. но опять же, получается противоречие ..

   
 
 автор: cccp   (23.11.2005 в 19:45)   письмо автору
 
   для: goddamn   (23.11.2005 в 12:06)
 

Ну я вообше-то думал что вожможно сделать так что бы каждый линк записывал свой log файл.
Тогда можно было бы использовать лиш один скрипт для всех линков.
Но это всё мои идеи, а сам я не в состоянии сделать это, поэтому думал использовать этот (ваш) скрипт, переименоувая для каждого линка...Что само сабой делает больше файлов и занимает больше места на сервере.

Как вы думаете?
Что посоветуете?

   
 
 автор: goddamn   (23.11.2005 в 19:58)   письмо автору
 
   для: cccp   (23.11.2005 в 19:45)
 

вам решать - много маленьких файлов или один большой. если первый вариант, то скрипт немного переписать надо. единственное, какие имена будут у файлов при 1-м варианте ? представили ? если линк = ./abc/def/ghijk/lmnopqrst/?id=1&tratata=1000&aaa=%0A%0D%0E%0C---~_,-,-,-~ что тогда ? :)

   
 
 автор: cccp   (23.11.2005 в 20:06)   письмо автору
 
   для: goddamn   (23.11.2005 в 19:58)
 

Ну не знаю...
Неужели нельзя сделать что бы он отталкивался от вписанного id на самом линке в этой строчке, a?
<a href="click.php?url=<?print urlencode("papka/index.php3");?>"

   
 
 автор: cccp   (24.11.2005 в 14:42)   письмо автору
 
   для: cccp   (23.11.2005 в 20:06)
 

может есть у кого-то подобный скипт?

   
 
 автор: cccp   (24.11.2005 в 15:09)   письмо автору
 
   для: cccp   (24.11.2005 в 14:42)
 

Посмотрите,
нашол такой вот скрипт.
Работает хорошо. Он вообше-то для счётчика скачивания файлов, но я ему указал файл .php считать, получается тоже самое.

Поскажите как можно сюда добавить строчку для результата типа:
последний раз нажато : 24-11-2005 в 12:00

Неимоверно благодарен !!!


<SCRIPT LANGUAGE="php">
/////////////////////////////////////////////////////////////////////////////
////                     COMPTEUR DE TELECHARGEMENTS                     ////
////                      <2005 Version 1.00>                        ////
////                      (c) <nazdorovie>                        ////
/////////////////////////////////////////////////////////////////////////////
////  Param&#352;tre en entr‚e : $Fichier  : nom du fichier &#224; t&#233;l&#233;charger (doit )
////                                    obligatoirement &#234;tre dans le m&#234;me
////                                    r&#233;pertoire que le script.
////  Appel du script     : <A HREF="download.php3?Fichier=toto.zip">
////  Fichier Compteur    = $Fichier+.dat;
////  07/00 : Suppression des r&#233;f&#233;rences &#224; BC-Math
/////////////////////////////////////////////////////////////////////////////
$FileCompteur=$Fichier.".dat";
///------Fonctions Lock et Unlock d'apr&#352;s Etienne De Toqueville--------------
Function lock($file) {
  
$timeout =  30// Timeout (secondes) PHP
  
$retry   =   5// Temps maxi (secondes) d'attente avant abandon
  
$delay   0.1// Dur&#233;e d'attente (secondes) entre chaque test

  
if (file_exists($file.".lck")) {
          
$time = @filemtime($file.".lck");
          if (
$time) {
                  
$since time() - $time;
                  if (
$since $timeoutunlink($file.".lck");
          }
  }

  for(
$i 0$i $retry$i += $delay) {
          if (!
file_exists($file.".lck")) {
             
$idlck=fopen($file.".lck","w");
             
fclose($idlck);
             return 
1;
          }
          
usleep($delay 1000000);
  }
  return 
0;
}
///-------------------------------------------------------------------------
Function unlock($file) {
  
$i = @unlink($file.".lck");
  return 
$i;
}
///-------------------------------------------------------------------------
Function Error($Msg){
  Echo 
$Msg;
  
FinPres();
  Exit(
"");
}
///-------------------------------------------------------------------------
if (!file_exists($FileCompteur)){
   
$Compteur=1;
   
$Fp=fopen($FileCompteur,"w");
   
fputs($Fp,$Compteur);
   
fclose($Fp);
}
else{
   if (!
lock($FileCompteur)) Error("Occup&#233; ! Recommencez plus tard. Merci.");
   
$Fp=fopen($FileCompteur,"r");
   
$Compteur=Trim(fgets($Fp,255))+1;
   
fclose($Fp);
   
$Fp=fopen($FileCompteur,"w");
   
fputs($Fp,$Compteur);
   
fclose($Fp);
   
unlock($FileCompteur);
}
Header("Location: ".$Fichier);
Exit(
"");
</SCRIPT>

   
Rambler's Top100
вверх

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