Las cookies escritas en JavaScript solo se muestran como números enteros en PHP

Tengo un problema con la lectura correcta de las cookies en PHP, que se escribieron en JavaScript. Específicamente, el problema es que PHP solo leerá números enteros e ignorará todos los demás caracteres. Por ejemplo, si tengo 'firstName' almacenado como 'Bob' y 'phoneNumber' mostrado como '555-1234', PHP mostrará 0 para 'firstName' y '555' para 'phoneNumber'.

Datos de ejemplo que estoy almacenando (cookieName=value)

AreCookiesEnabled=344
firstName=Bob
lastName=Smith
email=bsmith@email.com
hpID=PL7H88
company=Bobcorp
phoneNumber=555-1234
language=en
os=Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; BRI/1; .NET4.0C; .NET4.0E)
browser=5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; BRI/1; .NET4.0C; .NET4.0E)
description=This is a description.

Esta es la función de JavaScript que estoy usando para escribir las cookies:

function SetCookie(cookieName, cookieValue, nDays)
{
    //alert("SetCookie("+cookieName+", "+cookieValue+", "+nDays+")");
    var today = new Date();
    var expire = new Date();
    if (nDays==null || nDays==0)
    {
        nDays=1;
    }

    if(cookieValue == '')
    {
        cookieValue = 'none';
    }

    expire.setTime(today.getTime() + 3600000*24*nDays);
    document.cookie = cookieName+"="+escape(cookieValue)+";expires="+expire.toGMTString()+";domain=.ourdomain.com;path=/";
}//

En la página PHP, tengo phpinfo() mostrando las cookies. Para _REQUEST["firstName"] y _COOKIE["firstName"] obtengo "Bob", pero cuando hago eco de $_COOKIE["firstName"] obtengo 0. De hecho, usando la información de ejemplo anterior, obtengo este resultado:

Are cookies enabled: 108
First Name: 0
Last Name: 0
Email: 0
HP ID: 0
Company: 0
Phone Number: 555
Language: 0
Operating System: 0
Browser: 5
Description: 0

También hago print_r($_COOKIE); y obtener esta salida:

Array ( [testsession] => true [firstName] => Bob [lastName] => Smith [email] => bsmith@email.com [hpID] => PL7H88 [company] => Bobcorp [phoneNumber] => 555-1234 [language] => en [AreCookiesEnabled] => 108 [description] => This is a description. [browser] => 5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; BRI/1; .NET4.0C; .NET4.0E) [os] => Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; BRI/1; .NET4.0C; .NET4.0E) ) 

Parece que todo está ahí y correcto, excepto en la salida final. ¿Alguien puede decirme qué estoy haciendo mal aquí? Gracias.

Edit: Por demanda popular, este es el archivo PHP...

<?php
phpinfo();
phpversion();
print_r($_COOKIE);

echo("<p>An error has occurred.</p>");
echo("<p><b>Are cookies enabled:</b> ");
echo($_COOKIE['AreCookiesEnabled']+"<br /></p>");
echo("<p><b>First Name:</b> ");
echo($_COOKIE['firstName']+"<br /></p>");
echo("<p><b>Last Name:</b> ");
echo($_COOKIE['lastName']+"<br /></p>");
echo("<p><b>Email:</b> ");
echo($_COOKIE['email']+"<br /></p>");
echo("<p><b>HP ID:</b> ");
echo($_COOKIE['hpID']+"<br /></p>");
echo("<p><b>Company:</b> ");
echo($_COOKIE['company']+"<br /></p>");
echo("<p><b>Phone Number:</b> ");
echo($_COOKIE['phoneNumber']+"<br /></p>");
echo("<p><b>Language:</b> ");
echo($_COOKIE['language']+"<br /><br /></p>");
echo("<p><b>Operating System:</b> ");
echo($_COOKIE['os']+"<br /></p>");
echo("<p><b>Browser:</b> ");
echo($_COOKIE['browser']+"<br /><br /></p>");
echo("<p><b>Description:</b> <br /><br />");
echo($_COOKIE['description']+"</p>");
?>

preguntado el 07 de marzo de 13 a las 22:03

Sería útil ver el código PHP que tiene para generar esas cookies, pero mi primer instinto dice que tiene un + en algún lugar del código donde deberías tener un ., lo que podría forzar el valor de la cadena a un número entero. -

Aprovechando el comentario de @RossMcLellan, supongo que por su salida que está haciendo cosas como echo "First Name: " + $_COOKIE... -

He actualizado con el archivo PHP -

1 Respuestas

Obviamente, el problema no está en los datos de la sesión en sí, sino en cómo los obtiene en PHP.

El comportamiento que veo aquí es que esas cadenas ("Bob" y "555-1234") se están convirtiendo a int. PHP, de hecho, convierte esas cadenas a 0 y 555 respectivamente como se describe aquí.

En particular:

El valor viene dado por la parte inicial de la cadena. Si la cadena comienza con datos numéricos válidos, este será el valor utilizado. En caso contrario, el valor será 0 (cero).

Verifique su secuencia de comandos para la conversión int (definida como (int)) o cualquier conversión implícita y eliminarlo. O publique su código PHP y déjeme verificarlo.

Edit:

En tu código PHP estás usando el + operador, que está reservado para valores numéricos; por lo tanto, conduce a una conversión implícita a int. Usar . para la concatenación de cadenas en su lugar.

respondido 07 mar '13, 23:03

¡Usted tenía razón! Olvidé que PHP usa un . en lugar de un + para concatenar cadenas. Tonto error n00b. ¡Gracias! - pWEN

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.