Introduzione In questo capitolo affronteremo le dinamiche relative all’interazione tra pagine scritte con PHP e il database MySQL. PHP può connettersi a svariati tipi di database server come: MS Access, Postgres, Oracle, Microsoft Sql, Sybase, SQL Server e tanti altri. In ogni caso, la soluzione MySQL è sicuramente la più utilizzata in assoluto tra i programmatori, infatti, MySQL è un potentissimo software Open Source (scaricabile gratuitamente dal sito www.mysql.com), che come PHP garantisce prestazioni in linea con le più note soluzioni a pagamento. 13.1 Introduzione a MySQL MySQL è un software per la gestione di database (un DBMS: DataBase Management System o “sistema per la gestione di database”), appartenete alla famiglia dei database SQL server (Structured Query Language). Le sue caratteristiche più note sono quelle di essere: “multi processo”, “multi - utente”, “veloce” e “robusto”. Con il termine “database” si intende un archivio utilizzato per la gestione di dati; questi dati vengono organizzati tramite tabelle e ciascuna tabella è suddivisa per righe e per colonne. I dati (documenti, immagini ed altro) saranno contenuti, letti, scritti, aggiornati ed eliminati nelle righe di ogni tabella. Per SQL, viene indicato un linguaggio standard preposto all’archiviazione e alla modifica dei dati inseriti in un database. MySQL è “multi - processo” in quanto può soddisfare contemporaneamente le interrogazioni (query) di più utenti; per lo stesso motivo è un software “multi - utente” dato che prevede di poter essere utilizzato da più utenti alla volta. Grazie a MySQL abbiamo la possibilità di gestire velocemente enormi quantità di informazioni sfruttando al minimo l’hardware disponibile anche in situazioni particolarmente critiche. 13.2 Connessione a MySQL da una pagina PHP Avvertenza: gli script di questo capitolo non sono stati creati da “root” (utente amministratore), ma da uno “user” MySQL creato appositamente per simulare al meglio il lavoro su uno spazio web (”hosting”) professionale. Se state lavorando con EasyPHP su Windows, copiate in “www” la cartella “phpmyadmin” che trovate nella directory principale di EasyPHP. A questo punto, digitando http://localhost/phpmyadmin/ aprirete la schermata principale di Phpmyadmin. Cliccate su “Utenti” o su “Privilegi” a seconda della versione e aggiungete un nuovo utente” cliccando sull’apposito link. I dati utilizzati per questo capitolo sono i seguenti: host = “localhost”; user = “webmaster”; password = “parolachiave”. Se state lavorando su Linux e avete installato phpmyadmin, copiate la cartella “phpmyadmin” da “/var/www/” a “/var/www/html” e seguite lo stesso procedimento. La connessione di PHP a MySQL richiede una sintassi molto semplice e sfrutta una funzione predefinita chiamata mysql_connect(). Questa funzione richiede il passaggio di tre parametri: il nome di “host“, cioè il nome dell’elaboratore su cui gira il server MySQL (ad esempio “localhost”); uno username, cioè il nome dell’utente che intende accedere alle informazioni conservate nel database; la password dell’utente. Quindi, un esempio di sintassi corretta per la connessione a MySQL potrebbe essere questo: mysql_connect(server, utente, password) Alla normale sintassi di “mysql_connect()”, è utile accompagnare un messaggio di errore che verrà visualizzato nel caso si verificassero problemi durante la connessione, per far questo utilizzeremo l’istruzione die (Rif. capitolo 5): mysql_connect(server, utente, password) or die (messaggio di errore) Facciamo un’esempio: $connessione = mysql_connect(’localhost’, ‘root, ‘root) or die (”Impossibile connettersi al server host.”); Naturalmente, i tre parametri da passare a “mysql_connect()” possono essere espressi anche sotto forma di variabili: // assegnamo i valori alle variabili $host = ‘localhost’; $user_name = ‘root’; $password = ‘root’; // stabiliamo la connessione $connessione = mysql_connect($host, $user, $password) or die (”Impossibile connettersi al server host.”); Una volta eseguite le nostre operazioni sul database, dovremo chiudere la connessione. Per far questo, utilizzeremo la funzione mysql_close() alla fine dei nostri script con questa sintassi: mysql_close($connessione) 13.3 Creazione di un database Una volta operata la connessione tra PHP e MySQL, possiamo scegliere tra lavorare con dei database creati in precedenza o realizzarne di nuovi. Per ordinare a PHP la creazione ex novo di un database si pò utilizzare la funzione mysql_create_db(), che accetta come parametro il nome della base di dati che vogliamo realizzare; ecco quindi la sua sintassi: mysql_create_db (”nome_database”) Per mostrare un esempio chiarificatore della funzione svolta da “mysql_create_db()” basteranno poche righe di codice: <?PHP /* creazione di un database con “mysql_create_db()” */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “user”, “parolachiave”) or die(”Impossibile connettersi al server host.”); // creiamo il database e introducoamo il costrutto // di controllo “if” per ottenere un messaggio di conferma if (mysql_create_db (”secrets”)) { print (”Database creato con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un errore nella creazione del database.”); } // chiudiamo la connessione mysql_close($connessione); ?> Avremmo ottenuto lo stesso risultato passando alla funzione “mysql_connect()” delle variabili come parametri; dato che non possono coesistere due database con lo stesso nome, per fare un esempio creeremo una nuova base di dati chiamata “secrets2″: <?PHP /* creazione di un database con “mysql_create_db()” */ // assegnamo i valori alle variabili $host=’localhost’; $user=’webmaster’; $password=’parolachiave’; // stabiliamo la connessione con MySQL // passando le variabili come parametri a mysql_connect() $connessione = mysql_connect($host, $user, $password) or die(”Impossibile connettersi al server host.”); // creiamo il database e introduciamo il costrutto // di controllo “if” per ottenere un messaggio di conferma if (mysql_create_db (”secrets2″)) { print (”Database creato con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un errore nella creazione del database.”); } // chiudiamo la connessione mysql_close($connessione); ?> Come avrete potuto notare “stabilire una connessione con MySQL” non significa stabilire una connessione con un database, ma col DBMS che lo gestisce; infatti è possibile connettersi anche in assenza di database e crearne uno nuovo; per “connessione di PHP a MySQL” si intende invece instaurare il “dialogo” tra i due software. Come vedremo tra poco, con l’avvento delle nuove versioni di PHP l’uso di “mysql_create_db()” per la creazione di database è stato sconsigliato, ma è rimasto perfettamente funzionante per questioni di compatibilità verso il basso, cioè per le versioni precedenti di PHP. Spiegheremo tra qualche paragrafo un’alternativa più “attuale” con la quale raggiungere lo stesso risultato. 13.4 Selezione di un database Stabilita la connessione tra PHP e MySQL grazie a “mysql_connect()”, dovremo selezionare un database con il quale operare; utilizzeremo quindi un’altra funzione nativa di PHP chiamata mysql_select_db() che necessita di questo tipo di sintassi: mysql_select_db(nome_database, connessione) Come avrete potuto notare, “mysql_select_db()” richiede il passaggio di due parametri: il database name, cioè la base di dati che ci interessa selezionare; la connessione creata attraverso “mysql_connect()” (”$connessione”). Per esempio, potremmo selezionare un database chiamato “secrets” in questo modo mysql_select_db(’secrets’, $connessione) or die (”Impossibile connettersi al database secrets”); Anche nel caso di “mysql_select_db()”, la funzione accetta variabili passate come parametri: // assegnamo i valori alle variabili $host = ‘localhost’; $user_name = ‘webmaster’; $password = ‘parolachiave’; $database = ’secrets’; // stabilamo la connessione $connessione = mysql_connect($host, $user, $password) or die (”Impossibile connettersi al server host.”); // selezioniamo il database mysql_select_db($database, $connessione) or die (”Impossibile connettersi al database $database”); 13.5 Lettura dei dati Un vota stabilita la connessione tra una pagina PHP e MySQL e selezionato la base di dati che ci interessa, vediamo come bisogna operare per recuperare le informazioni inserite nella nostra database. La lettura e il recupero dei dati da una database si ottiene formulando ed eseguendo una query, cioè un’ “interrogazione” (o una “richiesta”) rivolta al database. Per formulare una query di lettura su un database si utilizza il costrutto “select * from nome_database” dove “*” è un’indicazione generica del tipo di dato contenuto; nel caso del nostro database “secrets” potremmo formulare una query del genere: $query = “select * from secrets”; Dopo aver formulato la query, è necessario eseguirla utilizzando la funzione mysql_query() con la seguente sintassi: mysql_query(query, connessione) Avrete notato come questa funzione rchieda due specifici parametri: il risultato della formulazione della query; il risultato della connessione ottenuto tramite “mysql_connect()”. Quindi, un esempio completo di formulazione ed esecuzione di una query ad un database potrebbe essere questo: // formulazione di una query $query = “SELECT * FROM secrets”; // esecuzione di una query $risultato = mysql_query($query, $connessione) or die(”Impossibile eseguire la query”); La variabile $risultato, ottenuta attraverso il passaggio dei parametri alla funzione “mysql_query()”, sarà appunto il dato derivante dalla richiesta operata al database. 13.6 CREATE DATABASE come alternativa a mysql_create_db() Abbiamo già anticipato che l’uso di “mysql_create_db()” per la creazione di database viene sconsigliato, anche se funziona ancora correttamente per questioni di compatibilità con le versioni di PHP meno recenti. Ora che conosciamo il significato di una query e sappiamo utilizzare la funzione “mysql_query()”, possiamo introdurre un metodo alternativo per realizzare i nostri database attraverso PHP. A questo scopo sfrutteremo il comando SQL CREATE DATABASE dotato di una sintassi molto semplice: $query = “CREATE DATABASE nome_database”; Alla formulazione della query, faremo seguire la sua esecuzione attraverso la funzione “mysql_query()” alla quale verranno passati come parametri il risultato della query e quello della connessione ottenuto tramite “mysql_connect()”. Per fare un esempio, creeremo una database chiamato “secrets3″ utilizzando “CREATE DATABASE”: <?PHP /* creazione di un database con “CREATE DATABASE” */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die(”Impossibile connettersi al server host”); // formuliamo la query $query = “CREATE DATABASE secrets3″; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Database creato con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un errore nella creazione del database.”); } // chiudiamo la connessione mysql_close($connessione); ?> 13.7 Creazione di un tabella I database creati negli esempi precedenti, sono per ora “vuoti”, infatti non contengono ancora dati o informazioni; non è possibile lavorare su dei database vuoti, quindi dovremo creare almeno una semplice tabella in cui inserire alcuni dati. Per fare un esempio, fingiamo di dover inserire nel nostro database “secrets3″ una tabella (”pass”) destinata a contenere gli utenti di un nostro sito internet e le loro password; per fare questo useremo l’istruzione SQL CREATE TABLE introdotta dalla funzione “mysql_query()”. I campi creati, “utente” e “password”, avranno rispettivamente una lunghezza massima di 40 e 80 caratteri (”CHAR”) Ecco il codice dello script: <?PHP /* creazione di una tabella in un database con “CREATE TABLE” */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die(”Impossibile connettersi al server host”); // selezioniamo il database mysql_select_db(secrets3, $connessione) or die (”Impossibile selezionare il database.”); // formuliamo la query $query = “CREATE TABLE pass (utente CHAR(40), password CHAR(80))”; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Tabella creata con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un errore nella creazione della tabella.”); } // chiudiamo la connessione mysql_close($connessione); ?> Nell’ultimo script proposto, grazie al comando “SQL CREATE TABLE”, abbiamo inserito nel nostro database una tabella chiamata “pass” che ha il compito di contenere i campi “utente” e “password”. La funzione “mysql_query()” ci ha quindi restituito un recordset, cioè una struttura di dati che contiene il risultato di una query. 13.8 Inserimento ed estrazione dei dati Ora che abbiamo creato la nostra tabella “pass” non ci resta che vedere in che modo sia possibile scrivere (o meglio “inserire”) dati al suo interno attraverso PHP; anche in questo caso, formuleremo una richiesta al database (”query”), grazie al comando SQL INSERT. La sintassi da rispettare per rendere efficace il comando “INSERT” è questa: $query = “INSERT INTO tabella (campo1, campo2) VALUES(’valore1′, ‘valore2′)”; Dopo la formulazione della richiesta, bisogna passare il nome del database, il parametro ottenuto dalla query e il risultato di “mysql_connect()” come parametri alla funzione “mysql_query()”: mysql_query($query, $connessione) Vediamo un esempio di scrittura su database; inseriremo nella nostra tabella “pass” i nomi di due utenti con le loro relative password utilizzando il comando “INSERT”: <?PHP /* scrivere su un database con “INSERT” */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die(”Impossibile connettersi al server host”); // selezioniamo il database mysql_select_db(secrets3, $connessione) or die (”Impossibile selezionare il database.”); // formuliamo una prima query $query = “INSERT INTO pass (utente, password) VALUES (’magellano’, ‘12f456b’)”; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Dati inseriti con successo.” . “<br>”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un un errore nell’inserimento dei dati.” . “<br>”); } // formuliamo una seconda query $query = “INSERT INTO pass (utente, password) VALUES(’wonder’, ‘7t8t9r0′)”; // passiamo il risultato della seconda query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Dati inseriti con successo.” . “<br>”); // poniamo un’alternativa ad “if” con “else2 } else { print (”Si è verificato un errore nell’inserimento dei dati.” . “<br>”); } // chiudiamo la connessione mysql_close($connessione); ?> Nello script appena proposto, abbiamo inserito i nomi dei due utenti (”magellano” e “wonder”) e le loro rispettive password (”12f456b” per il primo e “7t8t9r0″ per il secondo), utilizzando i campi “utente” e “password” della tabella “pass” creata nell’esempio del paragrafo precedente utilizzando il comando SQL “CREATE TABLE”. Ora, se vogliamo estrarre questi dati e visualizzarli a video, ci basterà richiedere la loro lettura a PHP attraverso il comando “SELECT”; facciamo un esempio: <?PHP /* leggere ed estrarre dati con “SELECT” */ // stabiliamo la connessione $connessione = mysql_connect (”localhost” , “webmaster” , “parolachiave”) or die(”Connessione non riuscita”); { print “Connessione effettuata.”; } // selezioniamo il database mysql_select_db (”secrets3″) or die (”Selezione del database fallita”); // formuliamo la query utilizzando “SELECT” // con la sintassi “SELECT *FROM nome_tabella” $query = “SELECT * FROM pass”; // passiamo il risultato della query come // parametro a “mysql_query()” $risultato = mysql_query ($query, $connessione) or die(”Impossibile eseguire la query”); // stampiamo i risultati in una tabella con HTML // “mysql_fetch_array()” restituisce un array che corrisponde alla riga caricata // “MYSQL_ASSOC” è un valore che contiene il nome delle colonne print “<table>\n” ; while ($riga = mysql_fetch_array ($risultato, MYSQL_ASSOC)) { print “\t<tr>\n” ; foreach ($riga as $valore) { print “\t\t <td>$valore</td> \n”; } print “\t</tr>\n”; } print “</table>\n”; // liberiamo la memoria occupata dal risultato // con la funzione “mysql_free_result()” mysql_free_result ($risultato); // Chiudiamo la connessione mysql_close ($connessione); ?> 13.9 Aggiornamento dei dati Per aggiornare i dati presenti nel nostro database, useremo il comando SQL UPDATE; la sintassi di questo comando varia a seconda dei valori che vogliamo modificare, ma segue sempre la stessa logica. Nel prossimo esempio la query sarà espressa in questo modo: $query = “UPDATE tabella SET campo2 = ‘nuovo_valore’ WHERE campo1 = ‘valore1′ LIMIT n”; Una volta formulata la query, entra in gioco la funzione “mysql_query()” alla quale andranno passati i soliti parametri. Ecco un esempio di aggiornamento dei dati in un database; modificheremo la password dell’utente “magellano” <?PHP /* aggiornare i dati di un database con “UPDATE” */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die(”Impossibile connettersi al server host”); // selezioniamo il database mysql_select_db (”secrets3″) or die (”Selezione del database fallita”); // formuliamo la query $query = “UPDATE pass SET password = ‘aaaaaab’ WHERE utente = ‘magellano’ LIMIT 1″; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Dati aggiornati con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un un errore nell’aggiornamento dei dati.”); } // chiudiamoo la connessione mysql_close($connessione); ?> 13.10 Cancellazione dei dati Per cancellare dei dati dal database useremo il comando SQL DELETE dotato di questa sintassi: $query = “DELETE FROM tabella WHERE campo1 = ‘valore1′ AND campo2 = ‘valore1′ LIMIT n”; Ecco un esempio in cui elimineremo il nome dell’utente “Magellano” e la sua password dalla tabella “pass” del nostro database “secrets3″: <?PHP /* cancellare dati da un database con DELETE */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die(”Impossibile connettersi al server host”); // selezioniamo il database mysql_select_db (”secrets3″) or die (”Selezione del database fallita”); // formuliamo la query $query = “DELETE FROM pass WHERE utente = ‘magellano’ AND password = ‘12f456b’ LIMIT 1″; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Dati eliminati con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un un errore nell’eliminazione dei dati.”); } // chiudiamo la connessione mysql_close($connessione); ?> 13.11 Eliminare un database Per eliminare un database si utilizza il comando SQL DROP DATABASE dotato di una sintassi simile a quella di “CREATE DATABASE”: $query = “DROP DATABASE nome_database”; In pratica, uno script generato per eliminare un database si differenzia dallo script realizzato allo scopo di crearlo unicamente per il comando SQL che entra in gioco. Col prossimo esempio elimineremo definitivamente il database “secrets3″: <?PHP /* eliminare un database con “DROP DATABASE” */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die(”Impossibile connettersi al server host”); // selezioniamo il database mysql_select_db (”secrets3″) or die (”Selezione del database fallita”); // formuliamo la query $query = “DROP DATABASE secrets3″; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Database eliminato con successo.”); // poniamo un’alternativa ad if con else } else { print (”Si è verificato un errore durante l’eliminazione del database.”); } // chiudiamo la connessione mysql_close($connessione); ?> 13.12 Gestione degli errori In questo paragrafo tratteremo brevemente della gestione degli errori nell’interazione tra PHP e MySQL. Dato che come avrete certamente notato, in questo tipo di operazioni ci si può trovare a scrivere dei lunghi listati di codice, può essere utile impiegare una funzione in grado di restituirci a video gli errori causati da omissioni o sbagli in sede di scrittura e realizzazione degli script. Tra l’altro, gli errori che ritornano dal database MySQL alcune volte non visualizzano messaggi di avvertimento, ci si può quindi trovare nella condizione di dover lavorare alla cieca per identificare il frammento di codice contenente l’errore o la dimenticanza. Anche in questo caso PHP ci fornisce alcune funzioni di controllo predefinite: mysql_error(): restituisce il testo di un errore accorso dopo l’ultima funzione MySQL utilizzata, diversamente, non restituisce nulla se il codice è corretto; mysql_errno(): che restituisce il numero di errore accorso dopo l’ultima funzione MySQL utilizzata, diversamente, restituisce zero se il codice è corretto. Facciamo un esempio, cerchiamo di connetterci ad un database inesistente e di selezionare una tabella al suo interno: <?PHP /* Gestione degli errori MySQL con PHP */ // stabiliamo la connessione a MySQL mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die (”Impossibile stabilire la connessione.”); // selezioniamo il database mysql_select_db (”db_error”); echo mysql_errno() . ” = ” . mysql_error(). “<br>”; // selezioniamo la tabella mysql_select_db(”tb_error”); mysql_query (”SELECT * FROM tabella_inesistente”); echo mysql_errno() . ” = ” . mysql_error() . “<br>”; // chiudiamo la connessione mysql_close($connessione); ?> Un volta testato questo script, riceveremo a video un avvertimento contenente la segnalazione di due errori: l’errore “1049″, che si manifesta nel caso in cui si cerchi di selezionare un database inesistente; l’errore “1046″, che si manifesta nel caso in cui si cerchi di selezionare una tabella inesistente. 13.13 Tutorial: visualizzare il numero di utenti connessi ad un sito In questo tutorial, utilizzeremo congiuntamente PHP e MySQL per creare uno script in grado di contare e visualizzare in tempo reale il numero di utenti collegati contemporaneamente al nostro sito internet (users on-line). Innanzitutto dovremo creare un database da utilizzare per contenere i dati che ci interessano; chiameremo questa base di dati “utenti_connessi” e per crearla utilizzeremo il comando SQL “CREATE DATABASE”: <?PHP /* creiamo il database con “utenti_connessi” */ // stabiliamo la connessione con MySQL $connessione = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die(”Impossibile connettersi al server host”); // formuliamo la query $query = “CREATE DATABASE utenti_connessi”; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connessione)) { print (”Database creato con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un errore nella creazione del database.”); } // chiudiamo la connessione mysql_close($connessione); ?> Ora creiamo un file “riutilizzabile” in grado di connettersi al database “utenti_connessi” e di selezionarlo, questo script verrà richiamato grazie all’istruzione “include” ogni volta che ne avremo bisogno; chiameremo il file “connetti.php“: <?PHP /* creiamo il file di connessione */ // stabiliamo la connessione con MySQL $connetti = mysql_connect(”localhost”, “webmaster”, “parolachiave”) or die (”Impossibile connettersi al server host.”); // selezioniamo il database mysql_select_db(”utenti_connessi”) or die (”Impossibile selezionare il database.”); ?> E’ quindi arrivato il momento di realizzare una tabella destinata all’archiviazione dei dati all’interno del nostro database, quest’ultima comprenderà due campi: “utenti”, destinato a fungere da contatore (PRIMARY KEY), e “ip”, che archivierà l’IP fornito dai client dei visitatori. <?PHP /* creiamo la tabella “visite” nel database “utenti_connessi” */ // stabiliamo la connessione a Mysql include(”connetti.php”); // formuliamo la query per richiedere // la creazione di 3 campi “NOT NULL” // che cioè non dovranno mai essere vuoti $query = “CREATE TABLE visite ( utenti int(20) NOT NULL, ip char(20) NOT NULL, PRIMARY KEY (utenti))”; // passiamo il risultato della query alla funzione // e richiediamo un messaggio di conferma if (mysql_query($query, $connetti)) { print (”Tabella creata con successo.”); // poniamo un’alternativa ad “if” con “else” } else { print (”Si è verificato un errore nella creazione della tabella.”); } // chiudiamo la connessione mysql_close($connetti); ?> Passiamo ora alla parte operativa del nostro programmino, creeremo due files: il primo, “utenti.php”, destinato al conteggio dei visitatori in linea e alla conseguente archiviazione dei dati nella tabella; il secondo, “mostra_utenti.php”, avrà la funzione di mostrare i risultati rilevati attraverso il primo. Il primo file, “utenti.php“, è di semplice realizzazione: <?PHP /* contiamo gli utenti on-line e inseriamo i loro dati nel database */ // stabiliamo la connessione a Mysql include (”connetti.php”); // assegnamo i valori alle variabili $utenti = time(); $ip = $_SERVER["REMOTE_ADDR"]; // inseriamo i dati nei rispettivi campi $insert = mysql_query(”INSERT INTO visite VALUES (’$utenti’,'$ip’)”,$connetti); mysql_close($connetti); ?> Per la creazione del file di conteggio e archiviazione abbiamo innanzitutto incluso il file di connessione. In secondo luogo abbiamo assegnato alle variabili $utenti e $ip i loro rispettivi valori: alla prima abbiamo assegnato la funzione “time()” in modo da recuperare il “timestamp” preciso di ogni visita al nostro sito; alla seconda, invece, abbiamo attribuito il metodo $_SERVER a cui verrà passata la costante predefinita REMOTE_ADDR, in questo modo sarà possibile registrare un diverso IP per i client di ogni visitatore. Infine, attraverso un semplice comando SQL “INSERT” abbiamo predisposto una query in grado di registrare i dati delle diverse visite al nostro sito nella tabella “visite”. Ora, non dovremo far altro che includere il file appena creato in tutte le pagine del nostro sito in PHP ad esclusione di quella in cui intendiamo visualizzare il numero degli utenti connessi: include (”PERCORSO/utenti.php”); Passiamo quindi alla creazione del file di visualizzazione “mostra_utenti.php”; iniziamo subito con l’analisi del codice commentato: <?PHP /* visualizziamo i visitatori on-line */ // stabiliamo la connessione a Mysql include (”connetti.php”); // stabiliamo il tempo di visualizzazione per ogni visitatore // on-line, per esempio: 10 minuti $durata = “10″; // assegnamo il timestamp come valore alla variabile $utenti $utenti = time(); // calcoliamo la scadenza di ogni visiatatore in secondi $scadenza = $utenti-($durata*60); // ricaviamo l’IP dei visitatori tramite il metodo $_SERVER $ip = $_SERVER["REMOTE_ADDR"]; // inseriamo i dati nel database $on_line = mysql_query(”INSERT INTO visite VALUES (’$utenti’,'$ip’)”,$connetti); // stabiliamo la cancellazione dei dati dopo il tempo di scadenza prestabilito $on_line = mysql_query(”DELETE FROM visite WHERE utenti<’$scadenza’”,$connetti); // distinguiamo i diversi visitatori sulla base dei diversi IP $on_line = mysql_query(”SELECT DISTINCT ip FROM visite”,$connetti); // sommiamo i visitatori on-line $visitatori = mysql_numrows($on_line); // visualizziamo il risultato echo “Visitatori on-line: $visitatori”; // chiudiamo la connessione mysql_close(); ?> Come avrete potuto notare, anche “mostra_utenti.php” si basa su un codice semplice e di facile comprensione: in pratica, non abbiamo fatto altro che estrarre i dati contenuti nel nostro database, distinguerli per IP di ogni client e visualizzarli. Per evitare che le informazioni su i visitatori disconnessi si sommino a quelle degli utenti on-line è stato sufficiente stabilire un tempo di cancellazione calcolato a partire dal timestamp indicato nel campo “utenti” della nostra tabella. Utilizziamo l’istruzione “include” per inserire questo file nella pagina PHP in cui vogliamo che i risultati vengano visualizzati, naturalmente, testando questo script in locale l’unico client visualizzato sarà quello sul quale stiamo lavorando.