Appunti Database MySql e Php per il recupero del debito di lab informatica

Database MySQL e PHP

OBIETTIVI DELLA LEZIONE
In questa lezione:
  1. Impareremo ad interrogare un database SQL da PHP
  2. Vedremo cosa sono le sessioni e perchè servono
  3. Miglioreremo la conoscenza di base del linguaggio PHP

 

MySQL

Contestualizzazione:
Il processo di creazione dinamica di una pagina HTML può essere schematizzato nei seguenti passi fondamentali:
(1) Invio dei dati dal client al server form HTML + richiesta HTTP (GET/POST) post pagine dinamiche e form
(2) Sul server una CGI riceve i dati Server + Programma PHP post php e MySql
(3) La CGI interroga il DB MySQL query MySQL questo post
(4) Con i risultati ottenuti crea la pagina da rimandare all'utente Programma PHP + Server lez15e16

In questa sezione ci concentriamo sul punto (3).
MySQL è un server di database relazionale, in parte conforme allo standard SQL92. In termini molto rozzi, un database relazionale è un insieme di tabelle e di relazioni tra alcuni campi di tabelle diverse.
Per quanto riguarda il nostro corso chiameremo con il nome di "record" ciascuna riga di una tabella e con quello di "campo" ciascuna colonna.
MySQL può essere interrogato attraverso un dialetto del linguaggio standard SQL. Vediamo attraverso alcuni esempi una possibile sessione:
  • Creazione di un database chiamato "db_annunci" [NON lo faremo dal PHP ma con PhpMyAdmin]
    CREATE DATABASE db_annunci;
    
  • Selezioniamo il database appena creato (indichiamo al server che le ulteriori operazioni sono da intendersi sul database specificato, è una sintassi MySQL non SQL standard)
    \u db_annunci
    
  • Creazione di una tabella "annunci" [NON lo faremo dal PHP ma con PhpMyAdmin] contenente i seguenti campi:
    1. un numero identificativo dell'annuncio che viene incrementato automaticamente
    2. la data
    3. il testo dell'annuncio
    4. la matricola dello studente che ha inserito l'annuncio
    CREATE TABLE annunci (
     id INT UNSIGNED NOT NULL AUTO_INCREMENT,
     data DATE NOT NULL,
     testo TEXT NOT NULL,
     matricola VARCHAR( 6 ) NOT NULL,
     PRIMARY KEY ( id ) );
    
  • Inserimento di un annuncio:
    INSERT INTO annunci (data, testo, matricola)
     VALUES ('2004-05-02', 
            'Vendo VESPA 125 da sistemare. Luigi 333123456', '123456');
    
  • Eliminazione dell'annuncio avente id=5:
    DELETE FROM annunci WHERE id=5;
    
  • Modifica dell'annuncio avente id=5:
    UPDATE annunci SET
     testo='Vendo VESPA 200 da sistemare. Luigi 333 1234567',
     matricola='123457'
     WHERE id=5;
    
  • Selezione di tutti i record della tabella annunci:
    SELECT * FROM annunci;
    
  • Selezione di tutti i record della tabella annunci contenenti nel testo le parole "vendo" e "vespa"
    SELECT * FROM annunci
     WHERE testo LIKE '%vendo%' AND testo LIKE '%vespa%';
    
  • Eliminazione della tabella annunci [NON lo faremo dal PHP ma con PhpMyAdmin]:
    DROP TABLE annunci;
    
  • Eliminazione del database db_annunci [NON lo faremo dal PHP ma con PhpMyAdmin]:
    DROP DATABASE db_annunci;
    
I comandi SQL (SELECT ad esempio) e i nomi delle colonne (i campi) non sono case-sensitive. Sono invece case-sensitive in MySQL i nomi dei database e delle tabelle.
ATTENZIONE: i comandi SQL riportati sopra terminano con il punto e virgola (;). Quando li effettuaremo da PHP, anche se per il resto la sintassi sarà IDENTICA, il punto e virgola finale NON DEVE ESSERE INSERITO.

PhpMyAdmin

PhpMyAdmin è un pacchetto di script PHP che ci permetterà di interagire molto più semplicemente con il server MySQL [Benissimo!].
Ad esempio la vediamo in queste immagini la creazione del database "db_annunci" e della tabella "annunci", come fatto in SQL nella sezione precedente.
  1. Viene inserito il nome del database da creare da creare. [Immagine]
  2. Viene inserito il nome della tabella da creare e il numero di campi che la tabella deve avere. [Immagine]
  3. Vengono specificati i nomi dei campi e il tipo di ciascun campo. [Immagine]
  4. La tabella è stata creata ed è possibile inserire nuovi record. [Immagine]
Anche se PhpMyAdmin permette di fare molto di più di quanto visto, in generale servirà più che altro per creare la struttura del database. I dati verranno inseriti dagli script PHP.

PHP + MySQL

L'accesso al database MySQL da PHP si compone SEMPRE dei seguenti passi:
  1. apertura della connessione al database MySQL;
  2. selezione del database su cui operare;
  3. esecuzione query SQL sul database;
  4. lettura dei risultati della query;
  5. eliminazione dei risultati della query (NON NECESSARIO);
  6. chiusura della connessione.
  • Aperturtura della connessione

    L'apertura della connessione di fa attraverso la funzione mysql_connect($host,$username,$password). BISOGNA sempre verificare che l'operazione abbia avuto esito positivo. Ad esempio la connessione al server php.weblab si effettua con
    $ptr_mysqls=mysql_connect("localhost","rsassi","rsassi")
     or die("Impossibile connettersi al server MySQL.\n");
    
  • Selezione del database

    Il server database supporta molti database contemporaneamente. La selezione di quello desiderato si effettua tramite la funzione mysql_select_db($database, $puntatore_connessione_aperta). Tutte le operazione successive si intendono da effettuare sul database prescelto. BISOGNA sempre verificare che l'operazione abbia avuto esito positivo. Ad esempio:
    mysql_select_db("db_annunci", $ptr_mysqls)
     or die("Impossibile aprire il database.\n");
    
  • Query SQL

    La query si effettua in due passi: 1) si prepara la stringa con il testo SQL della query (esattamente come negli esempi SQL sopra ma SENZA il punto e virgola finale); 2) si passa la stringa alla funzione mysql_query($query, $puntatore_connessione_aperta) che effettua la query vera e propria sul database. La funzione ritorna un puntatore al risultato della query (il risultato è una tabella temporanea presente nella memoria del server database MySQL).
    $query="SELECT * FROM annunci";
    $ptr_risultato_query=mysql_query($query, $ptr_mysqls);
    
  • Lettura dei risultati

    • Numero dei record che hanno soddisfatto i requisiti della query (cioè il numero di record contenuti nella risposta alla query)
      $numero_records=mysql_affected_rows($puntatore_connessione_aperta);
      
    • Numero dei campi contenuti nella risposta alla query
      $numero_campi=mysql_num_fields($ptr_risultato_query);
      
    • Nome del campo i-esimo contenuto nella risposta alla query
      // $i è un numero da 1 a $numero_campi
      $nome_campo=mysql_field_name($ptr_risultato_query, $i-1);
      
      Attenzione: i campi sono numerati a partire da 0!

    • Lettura di un record (riga) contenuto nella risposta alla query
      $record=mysql_fetch_array($ptr_risultato_query, MYSQL_ASSOC);
      
      $record è un array associativo che contiene tanti elementi quanti sono i campi contenuti nella risposta ($numero_campi). Le chiave di ciascun elemento è il nome del campo corrispondente.
      Dopo la lettura di un record, la testina di lettura di sposta di una posizione e punta al record successivo (simile a quello che succede quando si legge un carattere da un file e la testina di lettura si sposta di una posizione).

    • Lettura del record i-esimo contenuto nella risposta alla query
      // $i è un numero da 1 a $numero_records
      mysql_data_seek($ptr_risultato_query, $i-1)
       or die("Impossibile posizionarsi sul record $i\n");
      $record=mysql_fetch_array($ptr_risultato_query, MYSQL_ASSOC);
      
      Attenzione: i record sono numerati a partire da 0!

  • Eliminazione dei risultati

    Libera la memoria occupata dai risultati. Non è necessario a meno che la memoria implicata sia molta (alla chiusura della connessione la memoria viene liberata comunque). Ad esempio:
    mysql_free_result($ptr_risultato_query);
    
  • Chiusura della connessione

    Chiude la connessione con il database server.
    mysql_close($ptr_mysqls);
    

Esempio 1

esempiosql1.php conta i records contenuti nella tabella annunci del database db_annunci, visto sopra.

<html>
<head>
<title>Bacheca annunci</title>
</head>
<body>
<?php

$ptr_mysqls=mysql_connect("localhost","root","")
    or die("Impossibile connettersi al server MySQL.\n");
mysql_select_db("db_annunci", $ptr_mysqls)
    or die("Impossibile aprire il database.\n");

$query_visualizzazione="SELECT * FROM annunci";
$ptr_risultato_query=mysql_query($query_visualizzazione, $ptr_mysqls);

$numero_records=mysql_affected_rows($ptr_mysqls);

print "Il database contiene $numero_records annunci.\n";

mysql_free_result($ptr_risultato_query);
mysql_close($ptr_mysqls);

?>
</body>
</html>


Esempio 2

esempiosql2.php visualizza tutti i records della tabella annunci

<html>
<head>
<title>Bacheca annunci</title>
</head>
<body>
<?php

$ptr_mysqls=mysql_connect("localhost","root","")
    or die("Impossibile connettersi al server MySQL.\n");
mysql_select_db("db_annunci", $ptr_mysqls)
    or die("Impossibile aprire il database.\n");

$query_visualizzazione="SELECT * FROM annunci";
$ptr_risultato_query=mysql_query($query_visualizzazione, $ptr_mysqls);

print "<table cellpadding=\"3\" border=\"1\">\n";
while( $record=mysql_fetch_array($ptr_risultato_query, MYSQL_ASSOC) )
{
    print "<tr>\n";
    foreach($record as $valore_campo)
    {
        print "<td>\n";
        print $valore_campo . "\n";
        print "</td>\n";
    }
    print "</tr>\n";
}
print "</table>\n";

mysql_free_result($ptr_risultato_query);
mysql_close($ptr_mysqls);

?>
</body>
</html>

Esempio 3

Sito dove gli studenti possono inserire le loro inserzioni. L'esempio è più complesso e costituito da tre files. annunci0.php è la pagina principale, inserisci0.php permette di inserire un nuovo annuncio e cancella0.php cancella un annuncio dal database. Il database è sempre bd_annunci e la tabella annunci ha la struttura vista sopra.
  • annunci0.php
    
    <html>
    <head>
    <title>Bacheca annunci</title>
    </head>
    <body>
    <h2>Bacheca Annunci</h2>
    <h3>(riservata agli studenti del polo di Crema)</h3><br />
    <?php
    
    $ptr_mysqls=mysql_connect("localhost","root","")
        or die("Impossibile connettersi al server MySQL.\n");
    mysql_select_db("db_annunci", $ptr_mysqls)
        or die("Impossibile aprire il database.\n");
    
    $query_visualizzazione="SELECT * FROM annunci";
    if( isset($_GET["parola"]) and ($_GET["parola"]!=="") )
        $query_visualizzazione .= " WHERE testo LIKE '%{$_GET['parola']}%'";
    $ptr_risultato_query=mysql_query($query_visualizzazione, $ptr_mysqls);
    
    $numero_records=mysql_affected_rows($ptr_mysqls);
    
    if($numero_records !== 0)
    {
        print "<table cellpadding=\"3\" border=\"1\" width=\"550\">\n";
    
        print "<tr>\n";
        $numero_campi=mysql_num_fields($ptr_risultato_query);
        for($i_campo=0; $i_campo<$numero_campi; $i_campo++)
        {
            print "<th>\n";
            print mysql_field_name($ptr_risultato_query, $i_campo) . "\n";
            print "</th>\n";
        }
        print "</tr>\n";
    
        while( $record=mysql_fetch_array($ptr_risultato_query, MYSQL_ASSOC) )
        {
            print "<tr>\n";
            foreach($record as $nome_campo => $valore_campo)
            {
                if($nome_campo == "testo")
                    print "<td>\n";
                else
                    print "<td nowrap>\n";
                print $valore_campo . "\n";
                print "</td>\n";
            }
            print "</tr>\n";
        }
    
        print "</table>\n";
    }
    else
    {
        print "<font color=\"#FF0000\">";
        print "Il database è vuoto o nessuna inserzione contiene la parola inserita.";
        print "</font><br />\n";
    }
    
    mysql_free_result($ptr_risultato_query);
    mysql_close($ptr_mysqls);
    ?>
    <br/><br/>
    <a href="inserisci0.php">Inserisci un nuovo annuncio</a>
    <br />
    <form action="cancella0.php" method="get">
    Cancella l'annuncio numero:
    <input type="text" name="id_annuncio" size="3">
    <input type="submit" value="Cancella">
    </form>
    <form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="get">
    Annunci che contengono questa parola:
    <input type="text" name="parola" size="20">
    <input type="submit" value="Cerca">
    </form>
    </body>
    </html>
    
    
  • inserisci0.php
    <?php
    if( !isset($_POST['testo']) or !isset($_POST['matricola']) )
    {
    ?>
    <html>
    <head>
    
    <title>Bacheca annunci</title>
    </head>
    <body>
    <h2>Bacheca Annunci<h2>
    <h3>(riservata agli studenti del polo di Crema)</h3><br />
    
    <h2>Inserisci un annuncio</h2><br />
    <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="POST">
    <textarea cols=40 rows=7 name="testo">
    
    </textarea>
    <table>
    <tr>
    <td>Matricola:</td>
    <td><input type="text" name="matricola" size="6"></td>
    </tr>
    </table>
    
    <input type="submit" value="Inserisci!">
    </form>
    </body>
    </html>
    <?php
    }
    else
    {
        $data=date("Y-m-d");
    
        $ptr_mysqls=mysql_connect("localhost","root","")
            or die("Impossibile connettersi al server MySQL.\n");
        mysql_select_db("db_annunci", $ptr_mysqls)
            or die("Impossibile aprire il database.\n");
    
        $query_inserimento="INSERT INTO annunci (data, testo, matricola) ".
            "VALUES('$data', '{$_POST['testo']}', '{$_POST['matricola']}')";
        $ptr_risultato_query=mysql_query($query_inserimento, $ptr_mysqls);
    
        if($ptr_risultato_query == FALSE)
        {
            print "<html>\n";
            print "<head>\n";
            print "<title>Bacheca annunci</title>\n";
            print "</head>\n";
            print "<body>\n";
            print "<h2>Impossibile inserire l'annuncio.</h2>\n";
            print "</body>\n";
            print "</html>\n";
        }
        else
        {
          header("Location: http://" . $_SERVER['HTTP_HOST'] . 
            dirname($_SERVER['PHP_SELF']) . "/annunci0.php");
        }
    
        mysql_close($ptr_mysqls);
    }
    
    ?>
    
  • cancella0.php
    <?php
    if( !isset($_GET['id_annuncio']) )
    {
        header("Location: {$_SERVER['HTTP_REFERER']}");
    }
    else
    {
        $ptr_mysqls=mysql_connect("localhost","root","")
            or die("Impossibile connettersi al server MySQL.\n");
        mysql_select_db("db_annunci", $ptr_mysqls)
            or die("Impossibile aprire il database.\n");
    
        $query_eliminazione="DELETE FROM annunci WHERE id={$_GET['id_annuncio']}";
        $risultato_query=mysql_query($query_eliminazione, $ptr_mysqls);
        $numero_record_eliminati=mysql_affected_rows($ptr_mysqls);
        if( ($risultato_query == FALSE) or ($numero_record_eliminati==0) )
        {
            print "<html>\n";
            print "<head>\n";
            print "<title>Bacheca annunci</title>\n";
            print "</head>\n";
            print "<body>\n";
            print "<h2>Impossibile cancellare l'annuncio.</h2>\n";
            print "</body>\n";
            print "</html>\n";
        }
        else
        {
            header("Location: {$_SERVER['HTTP_REFERER']}");
    
        }
    
        mysql_close($ptr_mysqls);
    }
    ?>
    

PHP e SESSIONI

HTTP è un protocollo senza memoria di stato e, di sua natura, ogni coppia "domanda del client"/"risposta del server" è indipendente dalle altre. Una SESSIONE è semplicemente una serie di domande/risposte effettuate da un client ad un server che condividono uno stato (condividono informazioni che persistono tra una connessione e le successive).
Nella lezione 15, abbiamo visto come sia possibile utilizzare un cookie per far si che il valore di alcune variabili permanga tra connessioni indipendenti. Di fatto l'esempio 4 costituiva un primo rudimentale esempio di sessione.
D'altra parte, per applicazioni in cui la sicurezza è critica il cookie ha un punto debole: le informazioni che si vogliono conservare tra una pagina e l'altra vengono salvate in un file sul disco del client e sono quindi modificabili dall'utente.
Una soluzione a questo problema è quello di mettere nel cookie un codice identificativo della sessione e salvare le informazioni che devono essere persistenti sul server.
Un esempio (essessione1.php):
<?php
session_start();

if( !isset($_SESSION['numero_visite'])  )
{
    $_SESSION['numero_visite']=1;
}
else
{
    $_SESSION['numero_visite']++;
}
?>

<html>
<head>
<title>Titolo</title>
</head>
<body>

Il numero di volte che ti sei connesso a questa pagina è
<b><?php print $_SESSION['numero_visite']; ?></b>.

</body>
</html>
  • Tutti gli script che vogliono accedere alla sessione devono iniziare con la funzione session_start(). Come funziona?:
    1. se $_COOKIE non contiene la variabile PHPSESSID (la sessione non è ancora cominciata), session_start() genera PHPSESSID, un codice di 32 cifre, e aggiunge nella risposta la richiesta di un cookie che lo contenga:
      HTTP/1.x 200 OK
      Date: Mon, 10 May 2004 08:07:29 GMT
      Server: Apache/1.3.26 (Unix) Debian GNU/Linux PHP/4.1.2 mod_ssl/2.8.9 OpenSSL/
      0.9.6g 
      mod_perl/1.26
      X-Powered-By: PHP/4.1.2
      Set-Cookie: PHPSESSID=42b93d2d874a2f169896583a9e4d85db; path=/
      [...]
      
      Inoltre crea sul server un file dove verranno salvate le variabili da conservare per tutta la durata della sessione. Il nome del file contiene il valore di PHPSESSID. As esempio, viene creato il file sess_42b93d2d874a2f169896583a9e4d85db.

    2. se $_COOKIE contiene la variabile PHPSESSID (la sessione è già cominciata), legge il file sess_... e copia nell'array associativo $_SESSION tutte le variabili contenute nel file.
      Ad esempio ecco la risposta del client dopo che la sessione è cominciata:
      GET /~sassi/LIA2003/essessione1.php HTTP/1.1
      Host: www.dti.unimi.it
      [...]
      Cookie: PHPSESSID=42b93d2d874a2f169896583a9e4d85db
      [...]
      
      mentre il contenuto del file di sessione sess_42b93d2d874a2f169896583a9e4d85db è
      numero_visite|i:5;
      
      La variabile $_SESSION['numero_visite'] conterrà il valore 5.
  • Per fare in modo che il valore di una variabile sia disponibile per tutta la sessione, basta aggiungere un elemento all'array $_SESSION. I dati vengono automaticamente salvati nel file di sessione.
  • Quando si decide di chiudere una sessione:
    // elimina tutte le variabili dalla sessione
    session_unset();
    // chiude la sessione
    session_destroy();
    

PHP II

In questa breve sezione aumentiamo la conoscenza di base del PHP
  • Funzioni

    Come in C, anche in PHP è possibile costruire delle funzioni, che ritornino o meno dei valori. La sintassi generale è
    function nome_della_funzione($parametro1, $parametro2)
    {
     // corpo della funzione
     return $valore_restituito;
    }
    
    Anche per le funzioni, non è necessario specificare né il tipo dei parametri, né il tipo del valore che viene restituito.
    Non è necessario ma è buona abitudine dichiarare le funzioni all'inizio del file PHP: aumenta la leggibilità.
    Esempio: funzione che calcola il fattoriale di un numero
    
    <?php
    function fattoriale($n)
    {
        $risultato=1;
        for($i=2; $i<=$n; $i++)
            $risultato*=$i;
        return $risultato;
    }
    ?>
    
    <html>
    <head>
    <title>Fattoriale di un numero</title>
    </head>
    <body>
    
    <?php
    if( isset($_GET['numero']) )
    {
        print "Il fattoriale di {$_GET['numero']} è " . fattoriale($_GET['numero']);
    }
    else
    {
    ?>
    
    <form action="<?php print $_SERVER['PHP_SELF']?>", method="get">
    Calcola il fattoriale di
    <input type="text" name="numero">
    <input type="submit" value="Calcola!">
    </form>
    
    <?php
    }
    ?>
    
    </body>
    </html>
    
    
    I parametri sono passati per valore. Se si desidera che un parametro sia passato per riferimento, nella dichiarazione della funzione bisogna anteporre l'operatore & al nome della variabile.
    Ne stiamo passando il puntatore? Di certo qualcosa di simile, ma poco ci importa. L'importante, al di là dei dettagli implementativi, è che il valore della variabile viene effettivamente modificato.
    ATTENZIONE: l'operatore & va usato SOLO nella dichiarazione della funzione.
    Esempio: il fattoriale di un numero calcolato attraverso di una provedura:
    
    <?php
    function fattoriale($n, &$risultato)
    {
        $risultato=1;
        for($i=2; $i<=$n; $i++)
            $risultato*=$i;
        return $risultato;
    }
    ?>
    
    [...]
    
    <?php
    if( isset($_GET['numero']) )
    {
        fattoriale($_GET['numero'], $r);
        print "Il fattoriale di {$_GET['numero']} è $r";
    }
    else
    {
    
    [...]
    
    Le funzioni in PHP possono essere ricorsive.
  • Includere un FILE: include($nome_file)
    Immaginate di voler includere un banner e un footer fissi nel vostro sito. Basta salvarli in due files e chiedere al PHP di includerli nella pagina.
    Esempio
    Dato il file header.inc:
    <html>
    <head>
    <title>Il mio sito</title>
    </head>
    <body>
    <font color="#FF0000"><h2>IL MIO SITO</h2></font>
    <hr size="1">
    
    ed file footer.inc:
    <hr size="1">
    Contatta il <a href="mailto:webmaster@ilmiosito.it">WebMaster</a>!
    </body>
    </html>
    
    ecco lo script che li include (hf.php):
    
    <?php
    include("header.inc");
    ?>
    
    <br />
    <h2>Contenuto del sito</h2>
    <br />
    
    <?php
    include("footer.inc");
    ?>
    
    
    

Lab

CONSIGLIO: usate il manuale PHP!
Il manuale MySQL si scarica dalla pagina http://dev.mysql.com/doc/ (non è essenziale).
Per prima cosa svolgere gli esercizi della lezione 16
Esercizio 1: Prendiamo confidenza con MySQL e PhpMyAdmin
Una descrizione dettagliata della procedura di connessione al server MySQL attraverso PhpMyAdmin è disponibile all'indirizzo: http://php.weblab.crema.unimi.it . In breve, andate alla pagina http://php.weblab.crema.unimi.it/mysql/ e inserite SIA come username che come password lo username che vi è stato assegnato (solitamente lettera iniziale nome + cognome).
php.weblab pone la restrizione agli utenti di avere un solo database di nome "phpweb[numero del gruppo a cui appartenete]". Quindi non è possibile creare un database, solo aggiungervi delle tabelle (poco importa per il corso e al fine dello svolgimento dell'elaborato).
Create la tabella "annunci" in modo che abbia la struttura degli esempi visti a lezione. Inoltre, tramite PhpMyAdmin aggiungete qualche inserzione (suggerimento: selezionate la tabella e andate alla scheda "Inserisci").
Modificate i file degli esempi 1 e 2 in modo che funzionino dal vostro account: (1) cambiate username e password nella funzione mysql_connect() in modo che coincidano con i vostri dati; (2) cambiate il nome del database nella funzione mysql_select_db(), che nel vostro caso si chiama "phpweb[numero del gruppo a cui appartenete]".
Copiate i files sul webserver. Funzionano?
Esercizio 2
Tramite PhpMyAdmin, create una tabella "spese" che contenga 3 campi: (1) data: la data della spesa; (2) motivo: che cosa avete comperato; (3) importo: quanto avete speso.
Create lo script inseriscispesa.php che permetta all'utente di inserire, tramite un form una spesa effettuata nel database.
Preparare lo script vedispese.php che produca una tabella di tutte le spese effettuate.
Esercizio 3
Preparare lo script memorizzanome1.php che inizia una sessione e, dopo aver chiesto all'utente il nome, lo memorizza nella variabile di sessione "nome". Se "nome" è già contenuto in $_SESSION, presenta all'utente una pagina di saluto contenente il nome dell'utente.
Preparare lo script memorizzanome2.php che legge il valore della variabile di sessione "nome" e presenta all'utente una pagina di benvenuto contenente il nome.
Funzionano entrambi? Chiudete il brower. Apritelo di nuovo e visualizzate memorizzanome2.php. La sessione è ancora aperta?

Commenti