2012-06-26 21 views
9

Tengo un problema realmente frustrante en el que no puedo recuperar ninguno de los encabezados. Aquí está mi código:PHP Weird Error de índice indefinido

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

Ambas líneas producen el error 'Indefinido índice: SystemTime'.

No puedo entender por qué no puedo obtener el valor. Si voy print_r($headers); consigo este

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

var_dump de $ cabeceras

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 de $ teclas

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"; 
} 

devuelto:

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 atascado y serio no puede entender lo que es yendo mal. Deberia de funcionar.

PS. Sé que el encabezado SystemTime no es estándar. Lo proporciono desde mi http_request.

+0

¿Qué versión de PHP está utilizando? – drew010

+2

Use 'var_dump()' para ver si las cadenas (claves) son las que espera (por ejemplo, null bytes o unicode ws). Además 'SystemTime' no es un encabezado estándar. ¿Quién lo agregó? Y con "cualquiera de los encabezados" ¿te refieres a que probaste los ordinarios? – mario

+0

PHP Version 5.2.17 –

Respuesta

2

Lo obtuve después de mucha ayuda de ustedes. Tenía la sensación de que, dado que funcionaba después de la deserialización, ¿que tal vez la codificación era diferente y por eso podíamos verla, pero no tocarla?

Mi código de abajo se lleva todos los encabezados y convierte la codificación y la coloca en una nueva matriz :)

Aquí está mi código de 'traducción'.

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

¡Eres un PHP Chuck Norris, creo! – odiszapc

+1

* Round ElePHPant Kick * Kapow! –

+0

Suena plausible, pero eso no explica el comportamiento del fragmento 'foreach': utilizamos algo que fue proporcionado por' foreach', pero eso no cuenta como clave. – raina77ow

0

Su mejor opción en este punto puede ser el uso de la $_SERVER superglobal obtener los valores de los encabezados que necesita (por ejemplo $_SERVER['HTTP_SYSTEMTIME'].

no podía reproducir el problema en mi sistema (PHP 5.4.3) por llamando al getallheaders() y enviando una solicitud personalizada como la suya con el encabezado SystemTime establecido en 2012-06-26+10%3a10%3a08. Funcionó como se esperaba y veo el valor impreso dos veces (una vez que usó getallheaders() y una vez usando $_SERVER. Esto podría ser un extraño error de PHP como No veo ninguna nota especial sobre la función apache_request_headers, ni nada extraño acerca de su código en la rama 5.2.17 de PHP.

Espero que esto ayude por el momento. El uso del $_SERVER['HTTP_*'] puede ser más confiable de todos modos ya que el getallheaders no está disponible en todas las configuraciones.

+0

Ya había intentado esto. Obtuve una función de http://php.net/manual/en/function.getallheaders.php en la parte inferior de la página que producía los mismos resultados, que hace lo que especifique. (Eliminé la función de comprobación y la hice 'getAllHeadersEx()') –

+0

Ok, ¿así que '$ _SERVER ['HTTP_SYSTEMTIME']' tampoco está llena? – drew010

+0

Está allí pero no accesible. –