{"id":1180,"date":"2012-05-17T06:00:20","date_gmt":"2012-05-17T05:00:20","guid":{"rendered":"http:\/\/www.manuelmarangoni.it\/sir-bit\/?p=1180"},"modified":"2016-02-03T17:36:49","modified_gmt":"2016-02-03T16:36:49","slug":"php-cosa-sono-le-variabili-di-sessione-e-come-si-usano","status":"publish","type":"post","link":"https:\/\/www.manuelmarangoni.it\/sir-bit\/1180\/php-cosa-sono-le-variabili-di-sessione-e-come-si-usano\/","title":{"rendered":"PHP &#8211; Cosa sono le variabili di sessione e come si usano"},"content":{"rendered":"<p>Il comune protocollo HTTP che conosciamo, di suo, non ha la possibilit\u00e0 di &#8220;tenere salvati&#8221; i dati trasmessi tra <em>client<\/em> (il pc di chi naviga nel sito, per intenderci) e <em>server<\/em>: una volta inviati e ricevuta la risposta, i dati vengono persi.<br \/>\nFortunatamente sono state create le <em>variabili di sessioni<\/em>, cio\u00e8 <strong>variabili capaci di tenere attivi gli scambi tra client e server fino alla chiusura del nostro browser<\/strong>.<\/p>\n<p>Come funzionano? La prima volta che il client fa la chiamata al server viene generato un ID, che \u00e8 unico e quindi identifica senza errori il mittente, e lo salva in un file all&#8217;interno del server stesso. A questo punto il motore php genera un cookie che sar\u00e0 inviato al client e che conterr\u00e0 quell&#8217;ID identificativo.<br \/>\nIl meccanismo \u00e8 semplice: la prossima volta che si far\u00e0 una chiamata allo stesso server, questo legger\u00e0 il contenuto del cookie e sapr\u00e0 a quale client appartiene.<br \/>\nL&#8217;identificativo \u00e8 chiamato <strong>SID ed \u00e8 una stringa di 32 caratteri alfanumerici<\/strong>.<\/p>\n<p>L&#8217;esempio di uso pi\u00f9 comune \u00e8 la login. Una volta inserite username e password, i dati dell&#8217;utente saranno salvati in variabili di sessione: fino a quando queste variabili esistono, l&#8217;utente potr\u00e0 continuare a navigare nell&#8217;area riservata. Alla chiusura del browser, le variabili si perdono (e in questo caso, perch\u00e9 l&#8217;utente al ritorno sia ancora loggato, si deve far uso di altri strumenti, come i cookies).<br \/>\nUn altro esempio \u00e8 <strong>il carrello di un negozio online<\/strong>: una volta scelto un prodotto, questo va a finire nel carrello. L&#8217;utente potr\u00e0 poi navigare nel sito in cerca di altri prodotti da aggiungere al carrello o eliminare elementi dal carrello stesso. Tutto questo pu\u00f2 essere gestito dalle nostre variabili di sessione, che tengono tracce delle azioni dell&#8217;utente (aggiunta, eliminazione, ecc.).<\/p>\n<p><strong>Una nota:<\/strong> l&#8217;uso di variabili di sessione \u00e8 molto utile in certi casi, ma non indispensabile e pu\u00f2 essere sostituito da metodi diversi. Il carrello citato sopra, per esempio, pu\u00f2 essere tranquillamente fatto appoggiandosi a un database e ai cookies; allo stesso modo, l&#8217;accesso a un&#8217;area riservata pu\u00f2 essere gestito con cookies e variabili comuni. Il metodo di uso \u00e8, come sempre, personale, ma prima di decidere quale usare si deve conoscere i vari approcci.<\/p>\n<p>Nel caso in cui stiate lavorando su un server vostro o in locale e avete la possibilit\u00e0 di mettere le mani sul <code>php.ini<\/code>, potete configurare le variabili di sessioni a vostro piacimento. Questa trattazione non \u00e8 nello scopo dell&#8217;articolo, ma chi fosse interessato pu\u00f2 dare un&#8217;occhiata al <code>php.ini<\/code> nella sezione &#8220;[Session]&#8221;.<br \/>\n<!--more--><\/p>\n<h2>Uso base della sessione &#8211; Apertura e creazione di variabili<\/h2>\n<p>Per aprire una sessione la sintassi \u00e8 semplice:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">&lt;?php<\/span>\r\n<span style=\"color: #990000;\">session_start<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">?&gt;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Questo codice va inserito a inizio di ogni pagina (non soltanto della pagina di index) e <strong>non deve contenere alcun codice precedente<\/strong>: anche mettere uno spazio prima dei tag php di apertura generer\u00e0 un errore di <em>warning<\/em>. Questo \u00e8 uno dei motivi per cui tendo a usare il meno possibile le sessioni (in alcuni casi l&#8217;impossibilit\u00e0 di inserire codice precedente obbliga a cercare vie traverse per gestire alcuni script particolari); in genere comunque non incontrerete problemi di sorta.<\/p>\n\n<p>A questo punto avremo <strong>a disposizione una variabile superglobale chiamata <code>$_SESSION<\/code><\/strong>. Il suo funzionamento e uso \u00e8 identico alle variabili <code>$_GET<\/code> e <code>$_POST<\/code>: si tratta quindi di un array a cui potremo assegnare gli indici a piacere.<br \/>\nPoniamo, per esempio, di provenire da una pagina di login, dove abbiamo inserito username (campo di input &#8220;username&#8221;) e password (campo di input &#8220;password&#8221;). All&#8217;invio del form avremo quindi a disposizione i valori <code>$_POST['username']<\/code> e <code>$_POST['password']<\/code> (quest&#8217;ultima possibilmente criptata).<br \/>\nPer fare in modo che <strong>le pagine del sito si portino sempre dietro queste due variabili<\/strong>, possiamo fare una semplice assegnazione:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">&lt;?php<\/span>\r\n<span style=\"color: #990000;\">session_start<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000088;\">$_SESSION<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'username'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #000088;\">$_POST<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'username'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000088;\">$_SESSION<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'password'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #000088;\">$_POST<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'password'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">?&gt;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Nelle pagine successive potremmo richiamarle come delle comuni variabili, per esempio:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">&lt;?php<\/span>\r\n<span style=\"color: #990000;\">session_start<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #b1b100;\">echo<\/span> <span style=\"color: #000088;\">$_SESSION<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'username'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">?&gt;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>In questo modo avremo sempre a disposizione, in ogni pagina, l&#8217;user e la password dell&#8217;utente e potremmo confrontarla con i valori che abbiamo per esempio nel database: se trova l&#8217;utente con quelle username e password, significa che questo \u00e8 registrato e pu\u00f2 continuare la navigazione.<\/p>\n<h2>Distruggere la sessione<\/h2>\n<p>Una volta aperta la sessione e create le variabili come viste sopra, in qualsiasi punto delle nostre pagine possiamo evocare la seguente funzione:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">&lt;?php<\/span>\r\n<span style=\"color: #990000;\">session_destroy<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">?&gt;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>In realt\u00e0, il comando <strong>non &#8220;annienta&#8221; la sessione: svuota soltanto il suo contenuto<\/strong>. Questo significa che la sessione sar\u00e0 ancora attiva, ma l&#8217;array <code>$_SESSION<\/code> sar\u00e0 vuoto (e quindi non avremo pi\u00f9 i valori di username e password a disposizione). L&#8217;effetto si avr\u00e0 per\u00f2 soltanto all&#8217;evocazione del prossimo <code>session_start()<\/code> (cio\u00e8, per esempio, quando cambieremo pagina).<\/p>\n<p>Per svuotare immediatamente il <code>$_SESSION<\/code> dobbiamo invece usare <code>session_unset()<\/code>. In questo caso <code>$_SESSION<\/code> sar\u00e0 svuotato anche senza cambiare pagina.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le variabili di sessione permettono di tenere traccia per tutto il sito di dati specifici, evitando che si perdano al cambio di pagina. Vediamo il loro uso di base.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78],"tags":[4],"class_list":["post-1180","post","type-post","status-publish","format-standard","hentry","category-php-mysql","tag-php","cat-78-id"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1180"}],"collection":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/comments?post=1180"}],"version-history":[{"count":13,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1180\/revisions"}],"predecessor-version":[{"id":2328,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1180\/revisions\/2328"}],"wp:attachment":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/media?parent=1180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/categories?post=1180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/tags?post=1180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}