Autor Zpráva
petrsev
Profil
Ahoj,
potreboval bych poradit:
snazim se docilit funkcionality overovani dostupne URL. Pouzivam nasledujici kod
    $sql = "  select link from tabulka ";
    $result = mysql_query($sql,$db_spojeni);
  
    while ($zaznam = mysql_fetch_row($result))
        {
        $url = $zaznam[0];
        $headers = get_headers($url, 1);
        $code = substr($headers[0], 9, 1);
              
       if ( ($zaznam[1]=='') ||  (($code)<>2) || ($headers[0] == '404 Not Found')) 
       {  echo 'Url neni OK'; }
       else
       {  echo 'Url OK';}

Vyhodnocovani je zpravidla v poradku, mam ale problem v tom kdyz je v promenne $url napr. http://www.seznam.c
tz. adrea je spatne zadana.
vystupy jsou
get_headers[0] = HTTP/1.1 200
$code = 2

coz znamena, ze funkce mi vrati platnost URL, coz neni pravda.
V cem delam chybu nebo v cem je problem?

Dekuji za pomoc.
Davex
Profil
Bylo by dobré kontrolovat, že volání funkce get_headers() neskočilo chybou a stavový kód se skládá ze třech číslic, které je dobré přetypovat na číslo.

$headers = get_headers($url, 1);
if ($headers) {
  $code = (int) substr($headers[0], 9, 3);
  // ...
}

Při požadavku na neplatnou adresu by měla být v proměnné $headers hodnota false. Existují ale situace, kdy tomu tak být nemusí, protože se neplatné jméno může překládat na nějakou funkční IP adresu - např. pokud používáš DNS servery OpenDNS.
petrsev
Profil
Davex:
Diky za info.
Zkousel jsem si ted vyjet celou funkci GET_HEADERS pro url napr. www.seznam.c

vystup:
0: =HTTP/1.1 200 OK
1: =Date: Tue, 17 Jan 2012 07:36:12 GMT
2: =Server: Apache
3: =Connection: close
4: =Content-Type: text/html
5: =
6: =
7: =
8: =

Vsimni si ze parametr 0 vypada ze stranka je platna...ocekaval jsem 404 Not Found.
S temi servery OPEN DNS fakt nevim,jestli pouzivam. Jestli ano asi s tim nic neudelam.
Spis me napadlo ze bych krom toho prvniho parametru mohl testovat jeste nejaky jiny parametr v GET_HEADERS.
Napada me [connection], ale moc o nem nevim...

[0] => HTTP/1.1 200 OK
[Date] => Sat, 29 May 2004 12:28:14 GMT
[Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)
[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
[ETag] => "3f80f-1b6-3e1cb03b"
[Accept-Ranges] => bytes
[Content-Length] => 438
[Connection] => close
[Content-Type] => text/html

Nejaky napad?
Davex
Profil
Pro neexistující adresu by měla funkce get_headers() vrátit false. Případně s povoleným výpisem zobrazit varování:
Warning: get_headers() [function.get-headers]: php_network_getaddresses: getaddrinfo failed: No such host is known. in .../get_headers.php on line 3
Warning: get_headers(http://www.seznam.c) [function.get-headers]: failed to open stream: php_network_getaddresses: getaddrinfo failed: No such host is known. in .../get_headers.php on line 3

Tobě se neplatné jméno přeloží na funkční IP adresu webového serveru. Nevím proč, ale možná je to hostingem nebo ISP. Co vypíše funkce echo gethostbyname('www.seznam.c')?
petrsev
Profil
Davex:

Ahoj,
funkce
echo gethostbyname('www.seznam.c') mi vypise: IP adresu mych stranech.

Tak asi opravu se to presmeruje na funkcni IP adresu. Myslis, ze to jde vyresit konzultacne s podporou hostingu,ze to mohou nastavit?
Jeste me napadla jedna moznost. kdyz si dam vypsat neexistujici url adresu, tka se mi vzdy vyplni pouze 4 prvni atributy viz.

0: =HTTP/1.1 200 OK
1: =Date: Tue, 17 Jan 2012 07:36:12 GMT
2: =Server: Apache
3: =Connection: close
4: =Content-Type: text/html
5: =
6: =
7: =
8: =

tak jsem tam pridal jeste podminku, ze pokud je 8 atribut GET_HEADERS prazdny, tak at to bere taky tak ,ze stranka neexistuje a zatim facha..ale moc se mi to reseni nelibi..
Davex
Profil
petrsev:
gethostbyname('www.seznam.c') mi vypise: IP adresu mych stranech
Tak to se nechová správně a mělo by se to řešit s technickou podporou hostingu. Počet položek v HTTP hlavičce může být pokaždé jiný a nedá se na to spoléhat.
petrsev
Profil
Davex:
Ano,neti to moc idealni reseni. napsal jsem jit podpore meho webhostingu tak uvidim co mi napisou.Kazdopadne moc diky za konzultaci.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: