2012-05-23 34 views
5

ho seguito la risposta da qui, ma non ha funzionato per me:
Is possible to keep session even after the browser is closed?Come mantenere aperta una sessione dopo che il browser è stato chiuso in PHP?

Ecco il codice che ho provato:

$session_life = 2592000; // 30 days 
session_set_cookie_params($session_life); 
session_name('my_cart'); 
session_start(); 
// update the session_life 
setcookie(session_name(),session_id(),time()+$session_life); 

Il problema è che ogni volta che il browser è chiuso ho ancora un nuovo session_id, non quello vecchio.

Sto utilizzando un database per memorizzare gli elementi in "my_cart" e il session_id è appena utilizzato per identificare l'utente per mostrare loro il proprio carrello.

Qual è il modo migliore per mantenere vivo il carrello degli utenti per 30 giorni?


Questo è il codice ho finito con:

$cart_name = "my_cart"; 
$cart_life = 2592000; // 30 days 
session_start(); 
if (isset($_COOKIE[$cart_name])) { 
    session_id($_COOKIE[$cart_name]); 
} 
setcookie($cart_name, session_id(), time()+$cart_life); 
+1

Forse questo è un lavoro per i cookie e non per le sessioni. – mawburn

+0

La sessione può anche scadere sul server. Il parametro php [session.gc_maxlifetime] (http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime) definisce il tempo massimo in cui le informazioni sulla sessione vengono conservate prima che sia spazzatura raccolto. –

risposta

3

ho dovuto fare una cosa simile con un sito che ho scritto (consentire a un periodo di 30 minuti per un cliente di inserire un codice)

Piuttosto che utilizzare un cookie (poiché non è possibile garantire che il cliente ritorni al sito nello stesso browser), ho memorizzato il tempo di scadenza del codice rispetto al record dell'utente. In questo modo, indipendentemente dal browser da cui hanno avuto accesso alla pagina (ad es., A partire dal cellulare, finendo su un desktop), scadevano sempre allo stesso tempo.

quando il cliente ritorna al sito, ho confrontare il tempo corrente al tempo di scadenza e agiscono di conseguenza

Come si sta già memorizzare cestino del cliente, vorrei aggiungere un tempo di scadenza contro il record e quindi eseguire un confronto quando il cliente ritorna. E 'abbastanza facile da fare:

update basket set expiryDateTime=date_add(now(),interval 7 day) where basketID=[xyz] 

Se si vuole, si potrebbe anche impostare l'ora del giorno per essere un valore standard (20:00) utilizzando un po' di più l'inganno in MySQL

+0

Grazie, ma funziona solo quando il cliente ha effettuato l'accesso. Volevo anche consentire al cliente di aggiungere elementi al carrello senza dover registrarsi. Oltre al quale sto già mantenendo un campo last_update nel database rispetto al record del carrello. (Quello che voglio dire è che lo farò già per i clienti registrati). – user1275136

+0

In tal caso, memorizzare il carrello in un cookie (come una stringa JSON) con un valore di data di scadenza anche. Al loro ritorno, controlla il cookie e lascia scadere tutti gli elementi che devono essere. Assicurati che nessuna informazione personale sia memorizzata nel cookie. Se hanno bisogno di registrarsi per arrivare effettivamente alla sezione check-out/pagamento, trasferire le informazioni al DB una volta che sono state registrate correttamente e utilizzare solo il DB da lì in poi (ad esempio, cookie per non registrati, DB per registrati) . Ciò consentirebbe anche la ricerca della cronologia degli ordini. – DaveyBoy

+0

Scusa, non penso che tu mi abbia capito. Sto già memorizzando il carrello nel database e per i clienti registrati troverò i carrelli che possiedono dal database. Tutto quello che sto cercando di fare qui è che quando il browser è chiuso, persistete il session_id da prima in modo che i clienti non registrati vedano il loro carrello da prima. Così ho creato una sessione sotto il nome della sessione e l'ho impostata per scadere in 30 giorni, ma sembra ancora scadere quando il browser è chiuso.Cosa devo fare per risolverlo? Ho solo bisogno dell'ID di sessione di prima per identificare il carrello che è già stato archiviato nel database. grazie – user1275136

Problemi correlati