2010-08-07 12 views
10

Sto convalidando un modulo di accesso con jQuery chiamata AJAX a PHP. In PHP, creo una sessione e se hanno spuntato la casella di controllo "ricordami", voglio creare un cookie. Ecco il codice php:Impostazione di un cookie in una richiesta 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 sessione è impostata correttamente, tuttavia il cookie non è impostato. Ho provato a impostare tutti i valori (dominio, percorso, ecc.) Ma ciò non ha cambiato nulla. C'è qualcosa di ovvio che mi manca?

+0

Da dove viene la variabile '$ exp'? – Sarfraz

+0

scusate, era solo un errore di battitura, $ exp è definito prima come data di scadenza (2 mesi) – williamg

+4

oooooh, non credo che vogliate impostare la password nel cookie, anche se è md5'ed. L'ID sessione è molto meglio – CpILL

risposta

14

Ecco alcuni suggerimenti:

  • Assicurarsi che si sta specificando il formato di scadenza corretta della data
  • Quando si imposta un cookie ad una pagina che reindirizza, il cookie deve essere impostato dopo la chiamata a header('Location: ....'); esempio:

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

  • Se avete delle URL umani come www.domain.com/path1/path2/, th it devi impostare il percorso del cookie su/per funzionare per tutti i percorsi, non solo quello corrente.

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

Avviso l'ultimo / negli argomenti.

Da manuale di PHP:

Il percorso sul server in cui il cookie sarà disponibile su. Se impostato su "/", il cookie sarà disponibile all'interno dell'intero dominio. Se impostato su "/ foo /", il cookie sarà solo disponibile nella directory/foo/ e tutte le sottodirectory come /foo/bar/di dominio. Il valore predefinito è la directory corrente che il cookie è stato impostato in.

  • setcookie() definisce un cookie da inviare insieme al resto delle intestazioni HTTP. Come le altre intestazioni, i cookie devono essere inviati prima di ogni output dal tuo script, il che significa che prima non dovrebbero esserci istruzioni html/code echo.
+0

Fantastico! Prima stavo facendo un'eco, l'ho cambiato, e tutto ha funzionato, tranne che quando provo a fare il percorso alla radice ('/') non imposta i cookie ... sto facendo qualcosa di sbagliato? – williamg

+0

@iMaster: siete i benvenuti :) – Sarfraz

+0

Controlla l'ultima parte del mio commento, l'ho appena modificato. – williamg

-12

Non è possibile impostare il lato server cookie quando si utilizza una chiamata AJAX. Invece, attendi finché non ottieni una risposta positiva e imposta il lato client del cookie. Per semplificare, potresti use a jQuery plugin.

+14

Mi dispiace, ma perché è impossibile impostare cookie utilizzando la chiamata Ajax? La chiamata Ajax è una normale richiesta http con le proprie intestazioni di richiesta e risposta. Siamo in grado di inserire qualsiasi informazione nell'intestazione del respose, compresi i cookie. Non ho ragione? – Kirzilla

+1

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

+0

Perché nel mondo 5 persone hanno avanzato questo? È semplicemente sbagliato dire che non si può restituire un'intestazione di un cookie set da una chiamata AJAX o che i browser non li onorano, e parlare di "impostare il lato server cookie" sembra indicare una certa confusione di base su come HTTP funziona. –

Problemi correlati