2010-08-07 12 views
10

Estoy validando un formulario de inicio de sesión con la llamada jQuery AJAX a PHP. En php, creo una sesión y si marcaron la casilla "recordarme", quiero crear una cookie. Aquí está el código php:¿Configurando una cookie en una solicitud AJAX?

<?php 

include '../includes/connection.php'; 
date_default_timezone_set('GMT'); 

$name = $_POST['username']; 
$pass = $_POST['password']; 


$query = mysql_query("SELECT id, username, password FROM users WHERE username = '$name' LIMIT 1"); 

if(mysql_num_rows($query) == 0) { 
echo 'error'; 
exit; 
} 

while($row = mysql_fetch_array($query)) { 

if($row['username'] == $name && $row['password'] == $pass) { 

    session_start(); 
    $_SESSION['username'] = $row['username']; 
    $_SESSION['usrID'] = $row['id']; 
    echo 'success'; 


    if($_POST['remember']) { 
    setcookie('username', $row['username'], $exp); 
    setcookie('password', $row['password'], $exp); 
    setcookie('usrID', $row['id'], $exp); 
    } 

} else { 
    echo 'error'; 
    exit; 
} 



} 


?> 

La sesión se establece con éxito, sin embargo, la cookie no se establece en absoluto. Intenté configurar todos los valores (dominio, ruta, etc.) pero eso no cambió nada. ¿Hay algo obvio que me estoy perdiendo?

+0

¿De dónde viene la variable '$ exp'? – Sarfraz

+0

lo siento, solo fue un error tipográfico, $ exp se definió anteriormente como la fecha de vencimiento (2 meses) – williamg

+4

oooooh, no creo que quiera establecer la contraseña en la cookie, incluso si es md5'ed. ID de sesión es mucho mejor – CpILL

Respuesta

14

Aquí están algunas sugerencias:

  • Asegúrese de que está especificando el formato de caducidad correcta de fecha
  • Al configurar una cookie en una página que redirige, la cookie se debe ajustar después de la llamada a header('Location: ....'); por ejemplo:

    header('Location: http://www.example.com/'); setcookie('asite', $site, time()+60*60, '/', 'site.com');

  • Si tiene direcciones URL humanos como www.domain.com/path1/path2/, TH es debe establecer la ruta de las cookies a/para trabajar en todas las rutas, no solo en la actual.

    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');

Aviso el último / en los argumentos.

De manual de PHP:

La ruta en el servidor en el que estará disponible en la galleta. Si se establece en '/', la cookie estará disponible dentro de todo el dominio. Si se establece en '/ foo /', la cookie solo será disponible en el directorio/foo/ y en todos los subdirectorios, como /foo/bar/de dominio. El valor por defecto es el directorio actual que la cookie se establece en.

  • setcookie() define una cookie para ser enviada junto con el resto de las cabeceras HTTP. Al igual que otros encabezados, las cookies deben enviarse antes de cualquier salida de su secuencia de comandos lo que significa que no debería haber declaraciones de html/código de eco antes de eso.
+0

¡Impresionante! Estaba haciendo una declaración de eco antes, cambié eso, y todo funcionó, excepto que cuando trato de hacer el camino a la raíz ('/') no establece las cookies ... ¿estoy haciendo algo mal? – williamg

+0

@iMaster: de nada :) – Sarfraz

+0

Echa un vistazo a la última parte de mi comentario, acabo de editarlo. – williamg

-12

No podrá establecer la cookie en el servidor cuando use una llamada AJAX. En cambio, espere hasta que obtenga una respuesta exitosa y configure el lado del cliente de cookies. Para hacerlo más fácil, puede use a jQuery plugin.

+14

Lo siento, pero ¿por qué es imposible establecer cookies utilizando la llamada Ajax? La llamada Ajax es una solicitud HTTP regular con sus propios encabezados de solicitud y respuesta. Podemos poner cualquier información en el encabezado de respostar, incluidas las cookies. ¿No estoy en lo cierto? – Kirzilla

+1

http://stackoverflow.com/questions/3340797/can-a-ajax-response-set-a-cookie – Ryan

+0

¿Por qué en el mundo votaban 5 personas esto? Es simplemente erróneo decir que no se puede devolver un encabezado set-cookie de una llamada AJAX o que los navegadores no los respetan, y que hablar de 'configurar el lado del servidor de cookies' parece indicar una confusión básica acerca de cómo HTTP funciona. –

Cuestiones relacionadas