Newsgroup: it.comp.www.php
Titolo: Efficienza del Carrello

Ciao a tutti!
Siccome ho sentito pareri discordanti riguardo l'efficienza della
memorizzazione dei dati temporanei di un carrello della spesa ho deciso
di aprire questo argomento.
Ho creato un sito in cui i prodotti acquistati vengono messi
temporaneamente nella Sessione. Gli utenti però si lamentano del fatto
che se la finestra viene chiusa vengono persi i dati... Quindi ci
sarebbero due possibilità:
1) memorizzare il carrello su DB
2) memorizzare il carrello sui Cookies
Alcuni dicono che memorizzare sui Cookies è più efficiente ed evita
problemi sul DB. Altri dicono il contrario, perchè ci sono troppe cose
nel carrello per utilizzare in modo efficiente i Cookies...
Che ne pensate?

2) memorizzare il carrello sui Cookies
metti nel Cookie un id univoco associato al carrello nel db, così hai la 
persistenza della sessione e i dati sul db.
ciao
Mario 

Ok!
Questa soluzione mi piace, e la stavo pensando anche io. Così evito di
interrogare il DB inutilmente per sapere se ci sono dati salvati...
Però, in caso ci sia un browser che blocca i Cookie vorrei poterlo
sapere.
Si può fare in modo di sapere se il browser li accetta??

 Si può fare in modo di sapere se il browser li accetta??
Google -> 
http://www.google.com/search?q=php+check+cookie+support
-- 
I am what I am, I do what I can
Do. Or do not. There is not try.

2) memorizzare il carrello sui Cookies.
Io metterei tutto su db e dopo un tot tempo cancellerei gli oggetti non 
acquistati in modo da avere un db sempre snello(basta fare un semplicissimo 
script che pulisce la tabella).
Se uno tiene in carrello un oggetto per un mese e non si decide a fare il 
checkout allora non è molto interessato...
-- 
=============== Totò alias J_Zanetti ================
         Tessera #5 25 maggio: you'll never walk alone
  Tessera #0 #7 "ANDY SCHIET ZE ALLEMAAL" (fondatore)
============== toto...@SPAMtin.it ===============

 persistenza della sessione e i dati sul db.
E se l'utente è malizioso e cambia l'ID? Forse è meglio che lasci al PHP la
gestione delle sessioni.
Nel database, associa il carrello all'utente tramite l'ID utente.
In questo modo l'utente disporrà del proprio carrello anche se termina la
sessione con il logout. Al login, l'utente riavrà il proprio carrello.
Stesso discorso per le wish list.
Byez!
By Design

 sessione con il logout. Al login, l'utente riavrà il proprio carrello.
anche qua dipende dai punti di vista, io in genere preferisco fare vedere 
all'utente il suo carrello senza obbligarlo ad autenticarsi, ovvio che deve 
farlo quando inizia la fase di checkout
ciao
-- 
Mario
___________________
www.mario-online.com
___________________

 deve farlo quando inizia la fase di checkout
Funziona anche con un'autenticazione leggera. Quando registri l'ID del
carrello su cookie, è come avere una normale autenticazione.
Esistono 3 livelli:
1. Autenticato e loggato: l'utente è riconosciuto e può procedere
all'acquisto.
2. Autenticato: l'utente è riconoscito dal sistema ma viene richiesto il
login per procedere all'acquisto.
3. Sconosciuto: il sistema non conosce per nulla l'utente.
Nel caso in cui preferisci far vedere all'utente il suo carrello senza
obbligarlo ad "autenticarsi" è il caso 2. Il sistema riconosce l'utente e
quindi può conosce l'ID utente ed il suo carrello.
Quindi si può fare.
---
Nella pratica, il sistema usa sempre le sessioni fino a quanto è possibile.
Per procedere all'acquisto il sistema richiederà di effettuare login.
Se l'utente effettua il logout (o chiude il browser), il sistema mantiene la
sessione ma effettua il logout.
Se l'utente è sconosciuto, il sistema apre una sessione e aspetta un login o
una registrazione per poter effettuare un acquisto.
A questo punto servirebbero due ipotetiche tabelle: "utenti" e "carrelli".
Ogni utente dispone di ID e di ID sessione, ogni carrello dispone di ID, ID
e ID utente.
-   utente.ID = numero univoco dell'utente. Il numero dev'essere sempre
maggiore di 0.
-   utente.ID_sessione = numero ID univoco dell'ultima sessione dell'utente.
-   carrello.ID = numero univoco del carrello. E' "Null" o "0" se l'utente è
sconosciuto.
Ogni sessione con utente registrato incorpora l'ID utente per effettuare
ricerche sull'utente e sui carrelli. Ogni sessione con utente sconosciuto
incorpora l'ID del carrello per effettuare ricerche sui carrelli.
---
Avvertimi se ho spiegato male.
Byez!
By Design

 sessione ma effettua il logout.
questo invece non mi è chiaro...


 probabilmente mi tolgo il pensiero....;)
E fai male.
Se tu nel cookie metti l'id di sessione e nella sessione metti l'id
dell'utente, allora puoi toglierti il pensiero.
Bye.

 dell'utente, allora puoi toglierti il pensiero.
mmhh forse mi sfugge qualcosa ... però mi sembra che cosi devi gestire 
autonomamente la sessione (cioè non devi cancellare file temporaneo oppure 
rimuovere da db quando la sessione finisce), cioè quando, in un altra 
sessione ,  mi torna il cookie con il PHPSESSID originale dove prendi l'id 
dell'utente? Se lo hai messo nel db ok.
A questo punto allora mettiamo nel php.ini
session.cookie_lifetime = 2592000
e per 1 mese (se ho calcolato bene) teniamo la sessione PHP.


 dell'utente, allora puoi toglierti il pensiero.
Concordo.
Byez!
By Design

 questo invece non mi è chiaro...
Una sessione può essere mantenuta con alcune tecniche come i cookie,
esattamente come preferisci tu. Un logout soft dice al sistema di ricordare
l'utente ma di non considerarlo "sicuro". Un logout duro cancella proprio
la sessione e quindi impossibilita il sistema a ricordarsi dell'utente.
Normalmente i logout sono tutti soft, a meno dell'ingenuità del sistema (un
argomento lungo e filo-politico).
Spero di essere riuscito a chiarire questo concetto. Un esempio lo puoi
vedere con molti siti, tipo Sourceforge, ed anche con molti altri italiani.
Byez!
By Design

 dell'utente? Se lo hai messo nel db ok.
Perche' vuoi mantenere la sessione?
Tieni l'utente con la sua pass nel DB. Quando accede alla pagina parti
con la sessione, fa il login e lo memorizzi in sessione, quindi recuperi
il suo carrello e glielo mostri.
Quando chiude il browser perdi la sessione, ma rifai la stessa
procedura.
Do' per scontato che il carrello lo tieni su DB/file/ldap/quellochevuoi
ma in maniera stabile e associato all'utente, non dentro una sessione.
Bye.

gestione delle sessioni.
Io faccio cosě: utilizzo una tabella per il carrello contenente id di
sessione (generato con  $sid = md5(uniqid(rand(), true)); ,
praticamente impossibile da riprodurre), id utente e dati prodotti.
L'id di sessione viene memorizzato in un cookie, e l'id utente viene
impostato solo dopo che l'utente ha fatto il login.
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

procedura.
proprio su questo si discuteva...io preferisco che l'utente possa vedere già 
il carrello "prima" di loggarsi (autenticazione forte si diceva): anche 
Amazon è cosi...;)
ciao


 Amazon è cosi...;)
L'ultima volta che ho usato amazon i permetteva di mettere roba in
carrello prima di loggarti, ma dovevi comunque loggarti PRIMA di vedere
roba nel carrello inserita in una sessione precedente.
Ammetto che e' passato qualche mese...

Il giorno mar, 28/06/2005 alle 17.34 +0200, Alessandro Pellizzari ha
scritto:

[inviato il messaggio per sbaglio...]
Puoi fare la stessa cosa tenendo il carrello in sessione finche'
l'utente non si logga (e se non si logga lo perde) e riversandolo su DB
al momento del login, mantenendolo poi aggiornato tra sessione e DB.
Altre soluzioni sono comunque pericolose.
Bye.

Ho capito che la soluzione migliore è memorizzare il carrello su DB.
Sui Cookies al massimo memorizzo l'ID dell'ordine, così posso evitare
di fare interrogazioni inutili per vedere se il cliente aveva in
memoria un ordine...
Però sorge un'altra questione. E' meglio:
1) aggiungere gli articoli direttamente nel DB ?
2) aggiungerli nella Sessione, come sto facendo, e memorizzarli nel DB
solo alla fine cliccando su un link o bottone chiamato "Memorizza" ?

 impostato solo dopo che l'utente ha fatto il login.
Ok, si può fare, è sicuro. Ti lascio un piccolo consiglio.
Pensiamo ai futuri upgrade e supponiamo che tu abbia più tabelle contenenti
informazioni: quella del carrello, una wish list ed altre. In questo modo
dovresti dedicare una colonna per ogni tabella all'ID sessione e avresti
gli ID sessione ridondanti (teoricamente possono anche subire delle
pericolose incongruenze). Non sarebbe più semplice mettere l'ID sessione in
una sola tabella? E se questa tabella fosse quella degli utenti, non
sarebbe più veloce e coerente con i dati ivi contenuti?
Fai un test, spero di esserti stato utile, byez!
By Design

 solo alla fine cliccando su un link o bottone chiamato "Memorizza" ?
Vedo nella soluzione con il bottone "Memorizza" due difetti:
- un'operazione in più che grava sull'utente (che ha sempre fretta e poca
testa);
- un pericolo di perdita dati nel caso in cui la sessione venga interrotta,
esattamente come faceva Bol.it.
Una query in più che dà sicurezza è sempre una query buona. Ricordiamoci che
per queste operazioni "il computer sarà sempre più veloce dell'uomo".
Il modo migliore sarebbe quello di pacchetizzare tutte le operazioni in una
sola procedura, per eseguirle tutte in una volta sola e disporre
dell'"undo" del database. Questa è una proposta complessa.
Quindi, ecco la soluzione che vedo migliore per te: aggiungere gli articoli
direttamente nel database, come hai detto tu.
Alla fine risulta la soluzione più facile e veloce da scrivere, in oltre è
sufficientemente sicura per un normale sito. Se si parla di grandi siti,
allora si và su problemi davvero troppo complessi per un solo uomo.
Spero di esserti stato utile nel tuo lavoro, byez!
By Design

sarebbe piů veloce e coerente con i dati ivi contenuti?
Hai perfettamente ragione, ma forse non mi sono spiegato...io uso l'id
solo nella tabella del carrello, la wishlist ed altre cose le riservo
agli iscritti e quindi il problema di riportare in altre tabelle l'id
di sessione non si pone; in pratica gestisco separatamente la sessione
del carrello, memorizzata permanentemente in un cookie con quell'id di
sessione, dalla sessione vera e propria creata con il login, č piů
chiaro ora? Poi chiaramente va ripulita la tabella del carrello dalle
sessioni scadute, mi sembra ovvio.


 sessioni scadute, mi sembra ovvio.
Ha, ora ho capito, grazie per il chiarimento.
Bene, non vedo problemi di sicurezza.
Buon lavoro, byez!
By Design