buffer

Sehnal jsem funkci Get_Visitor_Identifier(), je na identifikaci uživatele. Najdete ji na:

http://unas.unas.cz/visitor.txt

Problém je v tom, že mi ta funkce cosi posílá na výstup (ještě jsem nezjišťoval co). Nevidím tam ale žádné echo ani set_cookie, takže se tomu divím.

Když funkci neuzavřu mezi:

Ob_Start();
$visitor = Get_Visitor_Identifier();
Ob_End_Clean();

Tak už se mi patrně neodešlou XML hlavičky na konci skriptu a díky tomu nic nefunguje tak jak má. Na webzdarma jsem tyhle problémy neměl, ale na placeném hostingu vznikly (PHP 4.4.2).

Napadá vás vysvětlení?
Co děláš s tím returnem? Tenhle skript po zběžném shlédnutí nic nevypisuje... zkus tu fci spustit v jinak prázdném dokumentu a uvidíš.
IMHO by bylo zahodno skript prepsat, aby pouzival superglobalni $_SERVER['REMOTE_ADDR'] misto $REMOTE_ADDR a podobne, protoze skript nebude fungovat, pokud jsou vypnuty register_globals, coz muze byt ten rozdil mezi wz (reg. glob. zapnute) a tim druhym hostingem (nevim, jestli by to mohlo vypisovat i nejakou chybu).
Jé, to zkoušel spustit jenom jako deklaraci funkce, ale ono to vypisuje warning až když tu funkci spustím (no jo pochopitelně :o)

Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in /httpd/html/kolbdancecz/www/include/F_Get_Visitor_Identifier.php on line 72

Takže tý hlášce ale stejnak moc nerozumim. Co je to IPv4 a IPv6?

Jinak s tim $_SERVER má donny pravdu. To přepíšu.
>> Address is not a valid IPv4 or IPv6 address
Zadana adresa neodpovida formatu IP adresy. Proste tam davas neco jineho nez XXX.XXX.XXX.XXX, kde XXX je od 0 do 255.

>> Co je to IPv4 a IPv6?
Zkracene IP adresa. v4 a v6 jsou verze. Dnes se nejvice pouziva IPv4. IPv6 je "novejsi" verze, ktera se ale nejak masove nepouziva. Rozdil mezi nimi je v rozsahu adres. IPv6 nabizi mnohonasobne vic adres nez IPv4.
Jo ták, už mi buňky v mozku seply. Je to jak říkal donny. Register globals je OFF a tak on nezná tu adresu (jak vysvětluje zase Tomík). Díky vám všem.

Opravil jsem to všechno na $_SERVER[''] a už to fachá bez warningu. Kdyby to někdo potřeboval, tu je funkční verze.

Typické použití - při přihlášení se uloží výstup funkce do $_SESSION[''][''] a při ověřování uživatele se pak porovnává obsah session s aktuálním výstupem funkce.

<?php
function Get_Visitor_Identifier ()
{
if($_SERVER['HTTP_X_FORWARDED_FOR']) {
$b = Ereg("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED_FOR'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_FORWARDED_FOR']);
}
}
elseif($_SERVER['HTTP_X_FORWARDED']) {
$b = Ereg("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_FORWARDED']);
}
}
elseif($_SERVER['HTTP_X_FORWARDED_FOR']) {
$b = Ereg("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED_FOR'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_FORWARDED_FOR']);
}
}
elseif($_SERVER['HTTP_FORWARDED']) {
$b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_FORWARDED'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_FORWARDED']);
}
}
elseif($_SERVER['HTTP_VIA']) {
return ($_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_COMING_FROM'].'_'.$_SERVER['HTTP_COMING_FROM']);
}
elseif($_SERVER['HTTP_X_COMING_FROM'] || $_SERVER['HTTP_COMING_FROM']) {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_X_COMING_FROM'].'_'.$_SERVER['HTTP_COMING_FROM']);
}
else {
return (MD5(GetHostByAddr($_SERVER['REMOTE_ADDR']).$_SERVER['HTTP_USER_AGENT']));
}
}
?>
Trochu jsem to prepsal. Co takhle toto:

<?php
function ip2int($ip) {
  $ex = explode(".", $ip);
  if (count($ex)!=4) return -1;
  list($a, $b, $c, $d) = $ex;
  $a = $a*16777216;
  $b = $b*65536;
  $c = $c*256;
  $ret = $a+$b+$c+$d;
  if ($ret<0) {return 0;}
  else {return $ret;}
}

/*function by Marc Meurrens*/

function Get_Visitor_Identifier ()
{
if($_SERVER['HTTP_X_FORWARDED_FOR'])
{
   // case 1.A: proxy && HTTP_X_FORWARDED_FOR is defined
   $b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED_FOR'], $array) ;
   if ($b && (Count($array)>=1) )
   { return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
   else
   { return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ip2int($_SERVER['HTTP_X_FORWARDED_FOR']) ) ; }
}
elseif($_SERVER['HTTP_X_FORWARDED'])
{
   // case 1.B: proxy && HTTP_X_FORWARDED is defined
   $b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED'], $array) ;
   if ($b && (Count($array)>=1) )
   { return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
   else
   { return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ip2int($_SERVER['HTTP_X_FORWARDED']) ) ; }
}
elseif($_SERVER['HTTP_FORWARDED_FOR'])
{
   // case 1.C: proxy && HTTP_FORWARDED_FOR is defined
   $b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_FORWARDED_FOR'], $array) ;
   if ($b && (Count($array)>=1) )
   { return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
   else
   { return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ip2int($_SERVER['HTTP_FORWARDED_FOR'] )) ; }
}
elseif($_SERVER['HTTP_FORWARDED'])
{
   // case 1.D: proxy && HTTP_FORWARDED is defined
   $b = ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_FORWARDED'], $array) ;
   if ($b && (count($array)>=1) )
   { return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
   else
   { return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ($_SERVER['HTTP_FORWARDED']) ) ; }
}
elseif($_SERVER['HTTP_VIA'])
{
   // case 2:
   // proxy && HTTP_(X_) FORWARDED (_FOR) not defined && HTTP_VIA defined
   // other exotic variables may be defined
   return ( ip2int($_SERVER['HTTP_VIA']) .
            '_' . ip2int($_SERVER['HTTP_X_COMING_FROM']) .
            '_' . ip2int($_SERVER['HTTP_COMING_FROM'])    
          ) ;
}
elseif(   $_SERVER['HTTP_X_COMING_FROM'] || $_SERVER['HTTP_COMING_FROM']  )
{
   // case 3: proxy && only exotic variables defined
   // the exotic variables are not enough, we add the REMOTE_ADDR of the proxy
   return ( ip2int($_SERVER['REMOTE_ADDR']) .
            '_' . ip2int($_SERVER['HTTP_X_COMING_FROM']) .
            '_' . ip2int($_SERVER['HTTP_COMING_FROM'])    
          ) ;
}
else
{
   // case 4: no proxy
   // or tricky case: proxy+refresh
   return ip2int($_SERVER['REMOTE_ADDR']);
}
}


echo Get_Visitor_Identifier ();
?>