Прблема со скриптом счетчика

ArkDoom

Новичок
Прблема со скриптом счетчика

Возникла проблема, добавляю через инклуд фаил счетчика в индекс страничку, скрипт делает все как нада и в файл базы записыват (количество просмотров - IP - /index)
Но когда такде добавляю на генерируемые странички (/sale-realty/cottage/?a=det&id=297 например) то возникает след ошибка:

Fatal error: Cannot redeclare base_for_search() (previously declared in \home\ololo.ru\www\php\lib.php:5) in \home\ololo.ru\www\php\lib.php on line 8

PHP:
<?php
if(isset($_GET))   {foreach ($_GET as $key=>$val)    {$$key=$val;}}
if(isset($_POST))  {foreach ($_POST as $key=>$val)   {$$key=$val;}}

function base_for_search ($path){       
  $path = str_replace ("\r","", @trim (@implode("",@file($path))));
  return "~(".str_replace ("\n","|", preg_quote($path,"~")).")~i";  
    }
$base_for_search_robot   = base_for_search ('stat/base_robot.dat');
$base_for_search_system  = base_for_search ('stat/base_system.dat');
$base_for_search_browser = base_for_search ('stat/base_browser.dat');

 function ip(){
     if(getenv('REMOTE_ADDR'))               
     {$user_ip = getenv('REMOTE_ADDR');}
      elseif(getenv('HTTP_FORWARDED_FOR'))   
      {$user_ip = getenv('HTTP_FORWARDED_FOR');} 
      elseif(getenv('HTTP_X_FORWARDED_FOR')) 
      {$user_ip = getenv('HTTP_X_FORWARDED_FOR');} 
      elseif(getenv('HTTP_X_COMING_FROM'))   
      {$user_ip = getenv('HTTP_X_COMING_FROM');} 
      elseif(getenv('HTTP_VIA'))             
      {$user_ip = getenv('HTTP_VIA');} 
      elseif(getenv('HTTP_XROXY_CONNECTION'))
      {$user_ip = getenv('HTTP_XROXY_CONNECTION');} 
      elseif(getenv('HTTP_CLIENT_IP'))       
      {$user_ip = getenv('HTTP_CLIENT_IP');} 
     else{$user_ip='unknown';}
     if(15 < strlen($user_ip)){
        $ar = split(', ', $user_ip);
          for($i=sizeof($ar)-1; $i > 0; $i--){
             if($ar[$i]!='' and !preg_match('/[a-zA-Zа-яА-Я]/', $ar[$i]))
             {$user_ip = $ar[$i]; 
             break; 
             }
             if($i==sizeof($ar)-1){$user_ip = 'unknown';}
            }
        }
     if(preg_match('/[a-zA-Zа-яА-Я]/', $user_ip)){$user_ip = 'unknown';}
     return $user_ip;
   }


и далее....

В чем может быть дело?
 

ArkDoom

Новичок
Спасибо, разобрался в чем дело и сразу возник вопрос номер 2.

Скрипт отказывается записывать данные с генерируемых страниц (пример был чуть выше)

Т/е/ страницу index он записывает, но другие нет?

Если нужно могу выложить весь скрипт
 

Sigorma

Новичок
что такое "генерируемые страницы" и что и в какой форме должно записываться?
 

ArkDoom

Новичок
Работа скрипта заключается в том, что он записывает в фаил counter.dat информацию об просмотрах.

записывает в форме:

Количество просмотров | Ip адрес(последнего просмотревшего) | ссылка странички

13 89.175.208.68 index
1 89.175.208.68 act=broser
1 89.175.208.68 act=ip
1 89.175.208.68 act=count


Генерируемые страницы это типа : /sale-realty/cottage/?a=det&id=297 которые нужна записывать в фаил
 

Sigorma

Новичок
отлично.
теперь покажи код который записывает строку в файл counter.dat и собственно что должно быть записано в файл например со страницы /sale-realty/cottage/?a=det&id=297
 

ArkDoom

Новичок
PHP:
function html ($path){
     if(@is_file($path)){$down = @implode("",@file($path));}
       else{$down = $path;}
     foreach ($GLOBALS as $key=>$val)   {
             if(!is_array($val) and !is_object($val) and preg_match("/%%$key%%/",$down)){
                  $down = str_replace("%%$key%%",$val,$down);
                 }
             }
     if(preg_match("/%%[\w_]+%%/",$down)){
       preg_match_all("/(?<=%%)[\w_]+(?=%%)/", $down, $array);
        while(list($key, $val) = each ($array[0])){ 
             $down = str_replace("%%$val%%",'',$down); 
             } 
       }
    return $down;
   }
$user_ip = ip();
$arr = detect_browser();
$BName     =  $arr[0];
$BVersion  =  $arr[1];
$BPlatform =  $arr[2];
$Brobot    =  $arr[3];
if($BName!='Robot'){ include 'counter.php'; }
-~{}~ 19.02.10 13:40:

counter.php
PHP:
class fopen {
    var $resource,$file = false;
    function fopen($file,$attr='a+') {
      if (!is_readable($file)){
           print charset("\n<br><b><font class='forums'>WARNING:</b> файл <b>'".$file."'</b> не доступен для чтения!</font>\n<br>");
           return false;
           	} 
      if($attr=='a+'){  
        if(!is_writeable($file)){ 
           print charset("\n<br><b><font class='forums'>WARNING:</b> на файл <b>'".$file."'</b> не установлены права доступа на запись!</font><br>\n");  
           return false;
          }
       }  
      clearstatcache();
      $this->file = $file;
      if($attr=='r'){$attr=='a+';}
      $this->resource = fopen($file,$attr);
      if ($this->resource) {
         if(substr(PHP_OS,0,3)=='WIN'){  
             set_file_buffer ( $this->resource , 0 );
             return true;  
            }
         elseif($this->resource and flock($this->resource,LOCK_EX)){ return true; }
         else{ return false; }
         }
      print charset("\n<br><b><font class='forums'>WARNING:</b> файл <b>'".$file."'</b> не удалось открыть!</font><br>\n");  
      return false;
    }
   function ftruncate($bytes='0') {
      if ($this->resource){
        return ftruncate($this->resource,$bytes);
        }
      }
   function fwrite($text) {
      if ($this->resource){
        return fwrite($this->resource, $text);}
        }
   function fread($bytes='1024') {
      if(filesize($this->file)==0){return;}
      if ($this->resource){
        return fread($this->resource,$bytes);
        }
      }
   function fclose() {
      if ($this->resource){
       flock($this->resource, LOCK_UN);
       fclose($this->resource);
       }
    }
}
   if($_SERVER['QUERY_STRING']==''){$QUERY_STRING = 'index';}
   else {$QUERY_STRING = $_SERVER['QUERY_STRING'];}
   $fopen = new fopen('data/counter.dat');
   $size = filesize('data/counter.dat')+'100';
   $general = $fopen->fread($size);
   $general = str_replace ("\r","", $general);
   
   if(preg_match("~([0-9]+)\t([0-9\.]+)\t(".
      preg_quote($QUERY_STRING).")\n~is",$general,$arr)){
      $_count = $arr[1];
      if($arr[2] != $user_ip){
        $general = preg_replace ("~([0-9]+)\t([0-9\.]+)\t(".
        preg_quote($QUERY_STRING).
        ")\n~is",++$arr[1]."\t".$user_ip."\t"."\\3"."\n",$general);
        ++$_count; 
        }
     }
   else{
     $general .= "1"."\t".$user_ip."\t".$QUERY_STRING."\n";
     $_count = 1;
   }
   $fopen -> ftruncate();
   $fopen -> fwrite($general);
   $fopen -> fclose();
 

Sigorma

Новичок
Автор оригинала: ArkDoom
PHP:
   function fwrite($text) {
      if ($this->resource){
        return fwrite($this->resource, $text);}
        }
свою функцию fwrite заменяем на :

PHP:
function fwrite($text)
{
  var_dump($text);
}
и смотрим что же там у тебя пишется в файл при посещении своих "генерируемых страниц".
Скорее всего твой код не совсем верно формирует строку для записи и тут тебе поможет только самостоятельная отладка своего скрипта.
 

ArkDoom

Новичок
Стерлись старые записи и новые не поступают.

Я брал этот скрипт тут http://omsk777.ru/counter.html

-~{}~ 19.02.10 16:31:

на страницу выводит : string(22) "1 89.175.208.68 index "

-~{}~ 19.02.10 16:40:

что-то с записью не то...как будто он все страницы как index видит. А скрипт работатет так, что проверяет есть ли такй айпи и ссылка в файле, если есть то ничего не делает, если новый айпи но ссылка такая же то обновляет показы (делает +1).
 

dimagolov

Новичок
это только меня удивляет, что для накопления кол-ва просмотров используется файл, а не база?
 

dimagolov

Новичок
1. у тебя кол-во просмотров меняется? или записывается один раз и навсегда? как я понял нет, иначе бы не понадобился метод ftruncate
2. у тебя в файле всегда одна строка?

п.с. поменять одно поле в ЛЮБОЙ записи в БД можно, а вот заменить что-то в середине файла без его перезаписи нельзя, без перезаписи можно только дописывать что-то в конец, а-ля лог.
 

Sigorma

Новичок
замени у себя и будет тебе счастье, это если совсем отладкой не заниматься и не вникать что там вообще скрипт делает.

PHP:
$fopen -> fwrite($_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']);
 

dimagolov

Новичок
Sigorma, ты что-то совсем левое написал.

а вообще жесть. файл читается в память, потом регулярками увеличивается счетчик, потом все это пишется назад. и чувак спрашивает "а зачем база". пикантность ситуации добавляет то, что файл может только увеличиваться в размере.
 

Sigorma

Новичок
dimagolov
я чесно говоря уже больше по вискарю чем говнокод разбирать... =)
 

ArkDoom

Новичок
Sigorma +1 про говнокод =)

:D Да я тут покопался, подумал.....реально гавно надо к чертям это удалять и писать код под sql =)))))))


Cпасибо за помощь
 

Sigorma

Новичок
ArkDoom
где лог хранить не суть важно, главное понимать откуда можно взять данные необходимые для твоего лога. Об этом расскажет phpinfo()

dimagolov
ну в это время конечно рановато для пятничной фиесты, хотя... xD
 
Сверху