2012-06-26 17 views
9

Ho un problema davvero frustrante in cui non riesco a recuperare nessuna delle intestazioni. Ecco il mio codice:PHP Weird Undefined index error

$headers = getallheaders(); 
echo($headers["SystemTime"]); //Doesnt work 
$keys = array_keys($headers); 
echo($headers[$keys[4]]); //Doesnt work 

Entrambe le righe generano l'errore "Indice non definito: SystemTime".

Non posso per la vita di me capire perché non riesco a ottenere il valore. Se vado print_r($headers); ottengo questo

Array 
(
    [Content-Type] => application/x-www-form-urlencoded 
    [Content-Length] => 0 
    [Host] => localhost 
    [Referer] => 
    [SystemTime] => 2012-06-26+09%3a20%3a27 
) 

var_dump di $ headers

array(5) { 
    ["Content-Type"]=> 
    string(33) "application/x-www-form-urlencoded" 
    ["Content-Length"]=> 
    string(1) "0" 
    ["Host"]=> 
    string(9) "localhost" 
    ["Referer"]=> 
    string(0) "" 
    ["SystemTime"]=> 
    string(23) "2012-06-26+10%3a10%3a08" 
} 

var_dump di $ chiavi

array(5) { 
    [0]=> 
    string(12) "Content-Type" 
    [1]=> 
    string(14) "Content-Length" 
    [2]=> 
    string(4) "Host" 
    [3]=> 
    string(7) "Referer" 
    [4]=> 
    string(10) "SystemTime" 
} 

foreach ($headers as $name => $value) { 
    echo "$name: $value. From Array: {$headers[$name]}\n"; 
} 

tornato:

Connection: Keep-Alive. From Array: Keep-Alive 
Content-Type: application/x-www-form-urlencoded. From Array: application/x-www-form-urlencoded 
Content-Length: 0. From Array: 0 
Host: localhost. From Array: localhost 
Referer: . From Array: 

Notice: Undefined index: SystemTime in /clientdata/apache-www/a/d/[XXXXXX].com/www/admin/request/GetPCLicence.php on line 22 
SystemTime: 2012-06-26+10%3a10%3a08. From Array: 

Im bloccato e ho seriamente non riesco a capire cosa sia andare storto. Dovrebbe funzionare.

PS. So che l'intestazione SystemTime non è standard. Fornisco questo dal mio http_request.

+0

Quale versione di PHP stai utilizzando? – drew010

+2

Usa 'var_dump()' per vedere se le stringhe (chiavi) sono ciò che ti aspetti (ad esempio byte null o unicode ws). Anche 'SystemTime' non è un'intestazione standard. Chi l'ha aggiunto? E per "qualsiasi intestazione" intendi che hai provato quelli ordinari? – mario

+0

Versione PHP 5.2.17 –

risposta

2

L'ho capito dopo tanto aiuto da voi ragazzi. Avevo la sensazione che, dopo la deserializzazione, avesse funzionato, forse la codifica era diversa e questo è il motivo per cui potevamo vederlo, ma non toccarlo?

mio codice qui sotto ottiene tutte le intestazioni e converte la codifica e la mette in un nuovo array :)

Ecco il mio codice 'Traduzione'.

$headersRaw = getallheaders(); 
    $headers = array(); 
    foreach($headersRaw as $key => $value) 
    { 
     $headers[mb_convert_encoding($key, "UTF-8")] = $value; 
    } 
+2

Sei un PHP Chuck Norris, penso! – odiszapc

+1

* Round ElePHPant Kick * Kapow! –

+0

I suoni sono plausibili, ma questo non spiega il comportamento di "foreach' snippet: abbiamo usato qualcosa che è stato fornito da' foreach', ma che non conta come una chiave. – raina77ow

0

La cosa a questo punto migliore potrebbe essere quella di utilizzare il $_SERVER superglobale ottenere i valori di qualsiasi header necessari (ad es $_SERVER['HTTP_SYSTEMTIME'].

non riuscivo a riprodurre il problema sul mio sistema (PHP 5.4.3) per chiamando getallheaders() e inviando una richiesta personalizzata proprio come la tua con l'intestazione SystemTime impostata su 2012-06-26+10%3a10%3a08. Ha funzionato come previsto e vedo il valore stampato due volte (una volta utilizzando getallheaders() e una volta utilizzando $_SERVER. Questo potrebbe benissimo essere uno strano bug PHP come Non vedo alcuna nota speciale sulla funzione apache_request_headers o qualcosa di strano sul suo codice nella sezione 5.2.17 di PHP.

Spero che questo aiuti per il momento. L'utilizzo di $_SERVER['HTTP_*'] potrebbe essere più affidabile in ogni caso poiché lo getallheaders non è disponibile in tutte le configurazioni.

+0

L'avevo già provato. Ho ottenuto una funzione da http://php.net/manual/en/function.getallheaders.php nella parte inferiore della pagina che ha prodotto gli stessi risultati, che fa ciò che si specifica. (Ho rimosso il controllo della funzione e l'ho reso 'getAllHeadersEx()') –

+0

Ok quindi anche il '$ _SERVER ['HTTP_SYSTEMTIME']' non è popolato? – drew010

+0

È lì ma non accessibile. –