PHP - SisInfLab
Transcript
PHP - SisInfLab
Corso di Laurea Magistrale in Ingegneria Gestionale Corso di Sistemi Informativi: II Modulo A. A. 2014 - 2015 PHP: Hypertext Preprocessor 1 Contenuti • Introduzione: caratteristiche del linguaggio ed installazione • Basi di PHP – Variabili – Array – Funzioni – Connessione a database Sistemi Informativi: II Modulo -A.A. 2014-2015 2 PHP: Hypertext Preprocessor • PHP è un linguaggio di programmazione che consente di realizzare in modo semplice e rapido pagine web dinamiche • PHP è un linguaggio di server-side scripting – il codice PHP (script) è inserito in un documento HTML o XHTML – un interprete in esecuzione sul server esegue il codice PHP e produce la pagina da inviare al client • L'interprete PHP ha bisogno di un Web server dotato di supporto per PHP (e.g. Apache con modulo PHP) • Per facilitare la memorizzazione dei dati, può essere necessario un DBMS (MySQL, PostgreSQL, ADODB, etc) • Ci riferiremo alla versione corrente del linguaggio PHP, la 5 Sistemi Informativi: II Modulo -A.A. 2014-2015 3 Installare PHP - software autoinstallanti • Zend server ((http://www.zend.com/en/products/server-ce/index) ) – la versione gratuita (Disponibile per Windows, Linux e Mac OS X) è la community edition e permette l’installazione di PHP (5.2 e 5.3) su Apache o IIS, MySQL (solo su Windows e Mac OS X), Zend Java bridge, driver per Oracle, Zend Framework, Zend Optimizer+ e Zend Debugger. La gestione dello Zend Server e la configurazione di tutte le sue componenti avviene attraverso una comoda interfaccia web. • XAMPP (http://www.apachefriends.org/en/index.html) è una distribuzione gratuita di Apache 2.2, MySQL 5., PHP 5.3 e Perl 5.10 disponibile per Windows, Linux, Mac OS X e Solaris. • EasyPHP (http://www.easyphp.org/) è una distribuzione di PHP 5.3, Apache 2.2, MySQL 5.1 e PhpMyAdmin 3.3 per Windows. Attraverso un sistema di moduli è possibile installare facilmente anche le più diffuse applicazioni web, tra cui Joomla, Wordpress, Drupal, phpBB, ecc.. Sistemi Informativi: II Modulo -A.A. 2014-2015 4 Verifica della corretta installazione • Scrivere in un file di testo la seguente riga <?php phpinfo(); ?> e salvare il file con nome info.php nella cartella htdocs di Apache • Aprire il browser e digitare il seguente indirizzo: http://localhost/info.php Sistemi Informativi: II Modulo -A.A. 2014-2015 5 Hello world PHP! hello.php <html> <head> <title>Hello world PHP</title> </head> <body> Il nostro primo documento PHP. <?php echo "Hello World PHP!"; ?> </body> </html> sorgente PHP Interprete PHPPHP output <html> <head> <title>Hello world PHP</title> </head> <body> Il nostro primo documento PHP. Hello World PHP! </body> </html> Sistemi Informativi: II Modulo -A.A. 2014-2015 6 Integrare PHP in HTML • PHP è un linguaggio HTML embedded, perché può essere incorporato in un documento HTML (o XHTML) • Tre modalità: 1. Processing instruction php (di gran lunga la modalità più comune) <?php echo "<h1>Hello world PHP!</h1>"; ?> 2. Tag script <script language="php"> echo "<h1>Hello world PHP!</h1>"; </script> 3. Tag in stile ASP (poco usato) <% echo "<h1>Hello world PHP!</h1>"; %> Sistemi Informativi: II Modulo -A.A. 2014-2015 7 Variabili • Il nome di una variabile deve obbligatoriamente iniziare con il simbolo $; e.g. $a, $A_1, $counter, $x1 • Al contrario di altri linguaggi (e.g. C, Java), per creare una variabile è sufficiente assegnarle un valore – Si parla, dunque, di dichiarazione implicita • Le variabili PHP non hanno alcun controllo di tipo – – – – Boolean: tipo logico, può assumere solo il valore true o false Integer: numero intero positivo o negativo Float: numero in virgola mobile String: sequenza di caratteri delimitata da ' ' oppure da " " • Una variabile può cambiare tipo durante l'esecuzione • Una variabile PHP può essere inserita in una stringa e valutata (e.g. $str = "Benvenuto $utente"; ) Sistemi Informativi: II Modulo -A.A. 2014-2015 8 Array • Un array in PHP può corrispondere – ad un vettore, cioè una struttura dati in cui ogni elemento è individuato da un indice numerico – ad una tabella di hash, cioè una collezione di coppie nome/valore (tale struttura dati è anche chiamata dizionario o array associativo) • Un array può essere creato esplicitamente con il costrutto array() oppure implicitamente // Questo è un array di numeri interi $pari = array( 2, 4, 6, 8, 10 ); // Questo è un array creato implicitamente $primi[0] = 2; $primi[1] = 3; // Questo è un array associativo $bookmark["username"] = "Pippo" $bookmark["userid"] = "123456" Sistemi Informativi: II Modulo -A.A. 2014-2015 9 Istruzioni e operatori • La sintassi di molte istruzioni PHP è uguale al linguaggio C – assegnazioni, blocchi di istruzioni, if, for, do ... while, while, switch ... case, break, continue, return • Anche la sintassi dei commenti e di quasi tutti gli operatori (aritmetici, logici, di confronto, etc.) è uguale al C • L'operatore . permette di concatenare due stringhe • Iterazioni sugli array foreach ($array as $key => $value) { echo "$key : $value <br/>"; } • Costrutto list() per l'assegnazione simultanea di più variabili $info = array( "alfa", "beta", "gamma" ); list($val1, $val2, $val3) = $info; Sistemi Informativi: II Modulo -A.A. 2014-2015 10 Dichiarazione di funzioni • Avviene tramite la parola chiave function function nome-funzione( ...parametri... ) { ... Istruzioni ... } /* Funzione somma */ function somma($a, $b) { return $a + $b; } • E' possibile indicare un valore predefinito per uno o più parametri: in tal caso la chiamata alla funzione può omettere il passaggio del parametro function saluta($utente, $msg = "Ciao") { return $msg . " " . $utente; } $s1 = saluta("Pippo","Salve"); // $s1 vale "Salve Pippo" $s2 = saluta("Pippo"); // $s2 vale "Ciao Pippo" Sistemi Informativi: II Modulo -A.A. 2014-2015 11 Funzioni principali – 1 • phpinfo() genera dinamicamente un documento contenente informazioni sulla versione di PHP installata e sull'ambiente di esecuzione – Può essere utile per controllare quali variabili predefinite sono messe a disposizione del programmatore dall'ambiente PHP • echo() scrive una stringa nel documento che viene inviato al client – può essere usata anche senza parentesi, essendo non una funzione vera e propria ma un costrutto del linguaggio PHP • exit() e die() arrestano l'esecuzione dello script e consentono la stampa di un messaggio facoltativo (può essere usata per segnalare un errore) Sistemi Informativi: II Modulo -A.A. 2014-2015 12 Funzioni principali – 2 • isset() controlla se la variabile contiene o no un valore • unset() cancella una variabile • isnull() verifica se la variabile è di tipo NULL • Il valore speciale NULL indica che una variabile non ha valore. Una variabile si considera NULL se: – le è stata assegnata la costante NULL – non le è stato ancora assegnato alcun valore – è stata cancellata mediante la funzione unset() Sistemi Informativi: II Modulo -A.A. 2014-2015 13 Visibilità delle variabili • Le variabili globali sono quelle definite all'esterno di una funzione, nella parte principale dello script • Le variabili locali sono quelle definite all’interno di una funzione • Per accedere ad una variabile globale dall'interno di una funzione bisogna dichiararla esplicitamente mediante la parola chiave global /** $base e' una variabile globale */ $base = 14; function normalizza( $val ) { // si dichiara di utilizzare una variabile globale global $base; return $val/$base; } Sistemi Informativi: II Modulo -A.A. 2014-2015 14 La variabile $GLOBALS • In alternativa all'uso di global è possibile accedere ad una variabile globale dall'interno di una funzione utilizzando l'array associativo $GLOBALS /** $base e' una variabile globale */ $base = 14; function normalizza( $val ) { return $val/$GLOBALS["base"]; } Sistemi Informativi: II Modulo -A.A. 2014-2015 15 Inclusione di file esterni • PHP consente di includere ed eseguire degli script contenuti in file esterni. Essi potranno essere dei frammenti di HTML o una libreria PHP. Due primitive: – include: include un file generando un warning se non è disponibile – require: include un file generando un errore (e quindi bloccando l’esecuzione) se non è disponibile /* Inclusione di una libreria */ include("libreria.php"); • Le primitive include_once e require_once evitano di includere un file se è già stato incluso dal documento corrente, evitando così errori dovuti alla doppia dichiarazione di funzioni Sistemi Informativi: II Modulo -A.A. 2014-2015 16 Variabili predefinite – 1 • Esistono alcune variabili automaticamente definite dall'interprete PHP e quindi disponibili in ogni script • $_SERVER: array associativo che contiene informazioni fornite dal web server all'interprete PHP, tra cui – – – – – "PHP_SELF": nome dello script PHP in esecuzione "SERVER_NAME": hostname del server "SERVER_ADDR": indirizzo IP del server "REMOTE_ADDR": indirizzo IP del client informazioni contenute nell'header della richiesta HTTP del client, ad esempio • "HTTP_USER_AGENT": user agent (browser) usato dal client • "HTTP_REFERER": URL della pagina che ha portato il client alla pagina corrente Sistemi Informativi: II Modulo -A.A. 2014-2015 17 Variabili predefinite – 2 • $_SESSION: array associativo che contiene informazioni sulle sessioni • $_COOKIE: array associativo contenente le variabili passate allo script tramite i cookie HTTP • $_GET: array associativo contenente le variabili passate dal client tramite il metodo GET • $_POST: come sopra, ma riferito al metodo POST • E' da ricordare che queste variabili sono disponibili solo se è stato abilitato il tracking delle variabili nel file di configurazione php.ini (track_vars=On) oppure all'interno dello script con la direttiva "php_track_vars" Sistemi Informativi: II Modulo -A.A. 2014-2015 18 Uso dei form • Il programmatore usando le variabili $_GET o $_POST può accedere ai dati inviati allo script mediante il metodo corrispondente • A seconda delle impostazioni del modulo PHP, l’interprete può rendere tali valori immediatamente disponibili nello script di destinazione sotto forma di variabili globali. • extract_globals() genera delle variabili globali, contenenti i dati inviati dal client via GET o POST, che hanno lo stesso nome impostato nel form Sistemi Informativi: II Modulo -A.A. 2014-2015 19 Uso dei form - POST <form name="form1" method="post" action="prova.php"> <p>Inserisci il tuo nome: </p> <p> <input type="text" name="nome_utente"> <input type="submit" value="Invia"> </p> </form> prova.php <?php echo('Il tuo nome è ' . $_POST['nome_utente']); ?> Sistemi Informativi: II Modulo -A.A. 2014-2015 20 Uso dei form - GET • Ipotizzando che l'utente abbia immesso i dati tramite il seguente form HTML <form method="get" action="http://www.example.com/a.php"> <br/><label for="nome">Nome:</label> <input type="text" name="nome" /> <br/><label for="cognome">Cognome:</label> <input type="text" name="cognome" /> <br/><input type="submit" name="submit" value="OK" /> <input type="reset" name="cancel" value="Annulla" /> </form> l'URI di destinazione è del tipo http://www.example.com/a.php?nome=Pinco&cognome=Pallino a.php ... <?php echo('Benvenuto ' . $_GET["nome"] . ' ' . $_GET["cognome"]) ?> ... e si ha risorsa inviata ... Benvenuto Pinco Pallino ... Sistemi Informativi: II Modulo -A.A. 2014-2015 21 Codifica dei dati • Le funzioni urlencode() e urldecode() rispettivamente codificano e decodificano le sequenze di escape • Le funzioni htmlentities() e html_entities_decode() rispettivamente codificano una stringa come entità HTML e decodificano una stringa riottenendo il testo originale Sistemi Informativi: II Modulo -A.A. 2014-2015 22 Connessione ad un DBMS • L’accesso ad un DBMS avviene in tre fasi: 1. Autenticazione: Si effettua l’autenticazione al DBMS mediante delle credenziali di accesso. Se questa operazione termina con successo, viene instaurata una connessione con il DBMS 2. Comunicazione: Si effettuano una o più operazioni con il DBMS, mediante l’esecuzione di statement SQL. In generale il primo passo della comunicazione prevede la selezione del database 3. Rilascio connessione: Si rilasciano le risorse allocate e si chiude la comunicazione con il DBMS Sistemi Informativi: II Modulo -A.A. 2014-2015 23 Autenticazione ad un DBMS (MySQL) • Le informazioni di cui bisogna disporre sono: – il nome dell'host su cui è in esecuzione il DBMS server – le credenziali di accesso al DBMS – il nome del database da utilizzare $dbhost $dbuser $dbpass $dbname = = = = "localhost"; "admin"; "secret"; "test"; // // // // Host su cui è in esecuzione MySQL Il nome utente (username) La nostra password Il nome del database da usare // Instaurazione della connessione $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die("Impossibile collegarsi al server MySQL. Assicurarsi di possedere i diritti necessari."); // Scelta del database mysql_select_db($dbname, $conn) or die("Impossibile accedere al DB. Assicurarsi di possedere i diritti necessari."); Sistemi Informativi: II Modulo -A.A. 2014-2015 24 Comunicazione con il DBMS (MySQL) • L’interazione col DB avviene mediante istruzioni SQL. In particolare è possibile effettuare: – query di inserimento/aggiornamento – query di selezione • Per gestire eventuali situazioni di errore è possibile far precedere il comando dal carattere @. In questo modo non sarà terminata l’esecuzione, ma sarà possibile riconoscere l’errore mediante opportune funzioni (per MySQL possono essere usate le funzioni mysql_errno() e mysql_error() ) Sistemi Informativi: II Modulo -A.A. 2014-2015 25 Query di creazione (MySQL) • La funzione mysql_query() invia al DBMS una query in SQL, passata come variabile stringa $sql = "CREATE TABLE impiegati( id int PRIMARY KEY AUTO_INCREMENT, nome varchar(40), cognome varchar(40), stipendio int )"; $result = mysql_query( $sql, $conn ) or die( "Errore: " . mysql_error() ); Ipotizzando di aver ricevuto i dati attraverso un form con metodo HTTP POST: $nome = $_POST["nome"]; $cognome = $_POST["cognome"]; $stip = $_POST["stipendio"]; $sql = "INSERT INTO impiegati(nome, cognome, stipendio) VALUES ( $nome, $cognome, $stip )"; $result = mysql_query( $sql, $conn ) or die( "Errore: " . mysql_error() ); Sistemi Informativi: II Modulo -A.A. 2014-2015 26 Query di aggiornamento (MySQL) • La funzione mysql_affected_rows() restituisce il numero di tuple modificate dall'ultima query di aggiornamento inviata al DBMS $sql = "UPDATE impiegati SET nome='Mario' WHERE cognome='Rossi'"; $result = mysql_query( $sql, $conn ) or die( "Errore: " . mysql_error() ); $num = mysql_affected_rows(); echo "Modificate $num righe"; Sistemi Informativi: II Modulo -A.A. 2014-2015 27 Query di selezione (MySQL) – 1 • Per inviare la query si usa sempre mysql_query() • La funzione mysql_rows() restituisce il numero di tuple selezionate dall'ultima query inviata al DBMS • mysql_fetch_assoc() restituisce il risultato di una query di selezione, una tupla alla volta, sotto forma di un array associativo costituito da coppie campo-valore* • mysql_fetch_row() restituisce invece la prossima tupla del risultato della query sotto forma di insieme dei valori dei campi*, assegnabili ad un insieme di variabili in un'unica istruzione con il costrutto list *nell'ordine specificato dalla query Sistemi Informativi: II Modulo -A.A. 2014-2015 28 Query di selezione (MySQL) – 2 rubrica id 1 2 3 4 nome Giulio Massimo Giorgio Sergio cognome Chierchini De Vita Cavazzano Asteriti telefono 12345 45678 98765 34567 La rubrica contiene 4 numeri Id Nome Cognome Tel. 4 Sergio Asteriti 34567 3 Giorgio Cavazzano 98765 1 Giulio Chierchini 12345 2 Massimo De Vita 45678 // Query $sql = "SELECT * FROM rubrica ORDER BY cognome, nome"; $result = mysql_query( $sql, $conn ) or die( "Errore: " . mysql_error() ); // Creiamo una tabella: in testa il numero di tuple $num = mysql_num_rows(); echo "La rubrica contiene $num numeri<br/> <pre>Id \t Nome \t Cognome \t Tel. \n"; // Prendiamo una tupla alla volta e stampiamo i valori in una riga della tabella while ($data = mysql_fetch_assoc($result)){ foreach ($data as $key => $value){ echo "$value \t"; } echo "\n"; } echo "</pre>"; Sistemi Informativi: II Modulo -A.A. 2014-2015 29 Query di selezione (MySQL) – 3 <table> <tr> <th>Cognome</th> <th>Stipendio</th> </tr> <?php $result = mysql_query( "SELECT id, cognome, stipendio FROM impiegati", $conn ); while(list($id,$cogn,$stip) = mysql_fetch_row($result)) { echo ("<tr> <td><a href=\"info.php?id=$id\"> $cogn</a></td> <td>$stip</td> </tr>\n"); } ?> </table> Sistemi Informativi: II Modulo -A.A. 2014-2015 30 Query di selezione (MySQL) – 3 <table> <tr> <th>Cognome</th> <th>Stipendio</th> </tr> <?php $result = mysql_query( "SELECT id, cognome, stipendio FROM impiegati", $conn ); while(list($id,$cogn,$stip) = mysql_fetch_row($result)) { echo ("<tr> <td><a href=\"info.php?id=$id\"> $cogn</a></td> <td>$stip</td> </tr>\n"); } ?> </table> Sistemi Informativi: II Modulo -A.A. 2014-2015 31 Rilascio della connessione • Il rilascio della connessione avviene mediante la primitiva mysql_close • Tutte le connessioni lasciate aperte vengono chiuse automaticamente alla fine dello script // Rilascio della connessione mysql_close($conn); Sistemi Informativi: II Modulo -A.A. 2014-2015 32 Riferimenti • Gruppo di Documentazione PHP, PHP Manual, http://www.php.net/manual/en/, 1997-2008 • T. Converse, J. Park, Guida a PHP 2/ed - Handbook, Mc-Graw Hill, 2004 • E. L. Thompson, S. D. Nowicki, T. Myer, PHP6 - Guida per lo sviluppatore, Hoepli, 2009 • P. B. MacIntyre, PHP – Le tecniche per scrivere il codice migliore, Hops, 2010. • Tutorial: http://www.phpknowhow.com/ Sistemi Informativi: II Modulo -A.A. 2014-2015 33