Dunque, il sistema che tu proponi non è molto efficiente e presenta alcune limitazioni. Pensa ad esempio se hai un prodotto il cui nome contiene il carattere speciale che usi come delimitatore. La sessione verrebbe completamente sballata e ci potrebbero essere gravi conseguenze. Per questo PHP mette a disposizione le funzioni di serializzazione (serialize() e unserialize()). Esse si occupano di convertire qualsiasi oggetto in una stringa e viceversa, in modo che possa essere memorizzato anche dove normalmente non sarebbe consentito (un file di testo, un database...). Inoltre sono assolutamente sicure e non c'è rischio che succeda ciò di cui ho parlato qualche riga sopra.
Per quanto riguarda la memorizzazione dell'ordine sul database: sì, si potrebbe fare, e sarebbe anche più efficiente e professionale, ma non penso che ne valga la pena. Innanzitutto dovresti prepararti a priori per molte problematiche. Metti che l'utente inserisca nel carrello 100 prodotti, e poi chiuda la pagina? I dati rimarrebbero nel database ad occupare spazio, e a lungo andare potrebbe causare seri problemi. Quindi dovresti implementare un sistema che fa automaticamente scadere gli ordini non manipolati da un certo periodo di tempo. Non è complesso, però è una cosa lunga e dispendiosa in termini di tempo. Usare le sessioni invece è veloce, pratico (vengono distrutte appena l'utente chiude il browser), ed efficiente.