Tecnologie lato Server: PHP: Hypertext Preprocessor Stefano Clemente [email protected] © 2005 Stefano Clemente I lucidi sono in parte realizzati con materiale tratto dal libro di testo adottato tradotto in italiano: © 2002 Prentice Hall H. M. Deitel, P. J. Deitel, T. R. Nieto Internet & World Wide Web – How To Program (Second Edition) Riferimenti bibliografici • H. M. Deitel, P. J. Deitel, T. R. Nieto Internet & World Wide Web – How To Program (Second Edition) ed. Prentice Hall 2002 Capitolo 29 • http://www.php.net 24 Novembre 2005 Stefano Clemente 2 Introduzione • PHP: PHP Hypertext Preprocessor – Linguaggio di scripting per creazione di pagine web a contenuto dinamico • Creato nel 1994 da Rasmus Lerdorf per tenere traccia degli utenti del proprio sito web • Nel 1995 rilascio di un pacchetto denominato “Personal Home Page Tools” • PHP2: ha incluso il supporto per i DB e per la gestione dei form • PHP3: riscrittura del parser e incremento performance – esplosione degli utilizzatori • PHP4: Zend Engine – più velocità e più potenza 24 Novembre 2005 Stefano Clemente 3 Introduzione • PHP è una tecnologia open-source • È platform-independent − UNIX − Linux − Windows • Include il supporto per la maggior parte dei DB incluso MySQL • Il codice − è incluso direttamente nei documenti XHTML − è inserito tra due delimitatori <?php e ?> − può essere in qualsiasi parte del documento purché racchiuso dai due delimitatori 24 Novembre 2005 Stefano Clemente 4 Esempio 1 24 Novembre 2005 Stefano Clemente 5 Esempio 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Fig. 29.1: first.php --> <!-- Our first PHP script --> <?php $name = "Paul"; ?> // declaration 1 <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>A simple PHP document</title> </head> <body style = "font-size: 2em"> <p> <strong> <!-- print variable name’s value --> Welcome to PHP, <?php print( "$name" ); ?>! </strong> </p> </body> </html> 24 Novembre 2005 Stefano Clemente 2 6 Osservazioni sull’Esempio 1 • Script 1 − dichiara la variabile $name assegnandole la stringa "Paul" − le variabili precedute dal $ sono create la prima volta che l’interprete PHP le incontra − le istruzioni PHP sono terminate da un “;” − accanto alla dichiarazione c’è un commento su singola linea • inizia con “//” e tutto ciò che compare alla destra dei due slash è ignorato dall’interprete • i commenti possono cominciare anche con un “#” • I commenti su righe multiple sono racchiusi dai delimitatori /* e */ 24 Novembre 2005 Stefano Clemente 7 Osservazioni sull’Esempio 1 • Script 2 − stampa il valore della variabile $name attraverso la funzione print e non "$name" − quando l’interprete incontra una variabile tra gli apici doppi, esegue un’interpolazione, vale a dire inserisce il valore della variabile nel punto della stringa in cui appare il nome della stessa • se la variabile compare in una stringa racchiusa tra apici singoli, l’interprete non effettua l’interpolazione 24 Novembre 2005 Stefano Clemente 8 Installazione 24 Novembre 2005 Stefano Clemente 9 Installazione 24 Novembre 2005 Stefano Clemente 10 Installazione 24 Novembre 2005 Stefano Clemente 11 Installazione 24 Novembre 2005 Stefano Clemente 12 Installazione 24 Novembre 2005 Stefano Clemente 13 Installazione 24 Novembre 2005 Stefano Clemente 14 Installazione 24 Novembre 2005 Stefano Clemente 15 Configurazione IIS 24 Novembre 2005 Stefano Clemente 16 Configurazione IIS 24 Novembre 2005 Stefano Clemente 17 Configurazione IIS 24 Novembre 2005 Stefano Clemente 18 Configurazione Apache • Aggiungere al file httpd.conf le seguenti righe ScriptAlias /php/ "c:/php/“ AddType application/x-httpd-php .php Action application/x-httpd-php "/php/php.exe" 24 Novembre 2005 Stefano Clemente 19 File .php 24 Novembre 2005 Stefano Clemente 20 Tipi di dati e variabili • Le variabili PHP sono multitipo – possono contenere diversi tipi di dato in diversi momenti • Tipi di dati − Integer – numeri interi − Double – numeri reali − String – testo racchiuso tra apici singoli (' ') o doppi (" ") − Boolean – true o false − Array – gruppo di elementi dello stesso tipo − Object – gruppo di dati e metodi associati − Resource – sorgente esterna di dati − Null – nessun valore 24 Novembre 2005 Stefano Clemente 21 Esempio 2 24 Novembre 2005 Stefano Clemente 22 Esempio 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.3: data.php --> <!-- Demonstration of PHP data types --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>PHP data types</title> </head> <body> <?php ?> // declare a string, double and integer $testString = "3.5 seconds"; $testDouble = 79.2; $testInteger = 12; <!-- print each variable’s value --> <?php print( $testString ) ?> is a string.<br /> <?php print( $testDouble ) ?> is a double.<br /> <?php print( $testInteger ) ?> is an integer.<br /> 24 Novembre 2005 Stefano Clemente 23 Esempio 2 <br /> Now, converting to other types:<br /> <?php // call function settype to convert variable // testString to different data types print( "$testString" ); settype( $testString, "double" ); print( " as a double is $testString <br />" ); print( "$testString" ); settype( $testString, "integer" ); print( " as an integer is $testString <br />" ); settype( $testString, "string" ); print( "Converting back to a string results in $testString <br /><br />" ); $value = "98.6 degrees"; // use type casting to cast variables to a // different type print( "Now using type casting instead: <br /> As a string - " . (string) $value . "<br />As a double - " . (double) $value . "<br />As an integer - " . (integer) $value ); ?> </body> </html> 24 Novembre 2005 Stefano Clemente 24 Conversione tra tipi di dati • Può essere necessaria per eseguire operazioni aritmetiche con le variabili • Si può usare la funzione settype i cui argomenti sono − la variabile della quale si vuole cambiare il tipo di dato − il nuovo tipo di dato della variabile • Può comportare perdita di dati − double troncati se convertiti in interi • Se si converte un stringa in numero − viene usato il numero all’inizio della stringa − altrimenti vale 0 24 Novembre 2005 Stefano Clemente 25 Conversione tra tipi di dati • Un altro modo per eseguire la conversione è il casting • Si antepone tra parentesi il tipo di dato alla variabile − Es: (double) $variabile • A differenza della settype il casting non cambia il contenuto della variabile • Il casting crea una copia temporanea della variabile in memoria • Utile quando uno specifico tipo di dato è richiesto in un’operazione aritmetica 24 Novembre 2005 Stefano Clemente 26 print • Esegue la stampa sul documento XHTML delle stringhe • Può stampare una o più stringhe concatenate attraverso l’operatore "." • Un comando print può essere suddiviso su più righe − tutto ciò che è compreso tra le parentesi "(" e ")" e seguito da ";" viene inviato al client 24 Novembre 2005 Stefano Clemente 27 Esempio 3 24 Novembre 2005 Stefano Clemente 28 Esempio 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <!-- Fig. 29.4: operators.php --> <!-- Demonstration of operators --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Using arithmetic operators</title> </head> <body> <?php $a = 5; print( "The value of variable a is $a <br />" ); 24 Novembre 2005 Stefano Clemente 29 Esempio 3 // define constant VALUE define( "VALUE", 5 ); // add constant VALUE to variable $a $a = $a + VALUE; print( "Variable a after adding constant VALUE is $a <br />" ); // multiply variable $a by 2 $a *= 2; print( "Multiplying variable a by 2 yields $a <br />" ); // test if variable $a is less than 50 if ( $a < 50 ) print( "Variable a is less than 50 <br />" ); // add 40 to variable #a $a += 40; print( "Variable a after adding 40 is $a <br />" ); // test if variable $a is 50 or less if ( $a < 51 ) print( "Variable a is still 50 or less<br />" ); 24 Novembre 2005 Stefano Clemente 30 Esempio 3 // test if variable $a is between 50 and 100, inclusive elseif ( $a < 101 ) print( "Variable a is now between 50 and 100, inclusive<br />“); else print( "Variable a is now greater than 100 <br />" ); // print an uninitialized variable print( "Using a variable before initializing: $nothing <br />" ); // add constant VALUE to an uninitialized variable $test = $num + VALUE; print( "An uninitialized variable plus constant VALUE yields $test <br />" ); // add a string to an integer $str = "3 dollars"; $a += $str; print( "Adding a string to an integer yields $a <br />" ); ?> </body> </html> 24 Novembre 2005 Stefano Clemente 31 Osservazioni sull’Esempio 3 • define − definisce una costante − richiede due argomenti • nome della costante • valore della costante − è previsto un terzo argomento booleano che indica se la costante è case-insensitive (true) • le costanti sono case-sensitive per default • Abbreviazioni sintattiche per l’assegnamento − +=, -=, *=, /= • Le variabili non inizializzate valgono undef, che ha diversi significati a seconda del contesto − numeri → 0 − stringhe → "" • Le stringhe sono convertite automaticamente in valori aritmetici quando sono usate in operazioni aritmetiche 24 Novembre 2005 Stefano Clemente 32 PHP keywords PHP keywords and break case class continue default 24 Novembre 2005 do else elseif extends false for foreach function global if include list new not or Stefano Clemente require return static switch this true var virtual xor while 33 Array • Gli elementi di un array sono acceduti attraverso un indice racchiuso tra parentesi quadre $nome_array [ indice ] • Un array viene creato quando si assegna un valore a un array che non esiste • Se si assegna un valore a un array senza specificarne l’indice, viene automaticamente aggiunto un elemento alla fine dell’array • Il primo elemento di un array ha indice 0 • Si può creare un array anche attraverso la funzione array, che restituisce un array i cui elementi contengono i valori passati come argomenti alla funzione array ( valore_1, .. , valore_n) 24 Novembre 2005 Stefano Clemente 34 Array • Un array può avere anche indici non numerici (es. stringhe) • PHP fornisce funzioni che consentono l’iterazione sugli elementi di un array • Ogni array ha un puntatore interno che ad ogni istante punta a un elemento dell’array − reset – setta il puntatore al primo elemento dell’array − key – restituisce l’indice dell’elemento a cui punta il puntatore − next – sposta il puntatore all’elemento successivo • se non esiste un elemento successivo restituisce false 24 Novembre 2005 Stefano Clemente 35 Array • La funzione array può essere utilizzata anche per creare un array con indici non numerici • In questo caso viene usato l’operatore => per impedire la creazione automatica di indici numerici array ( indice_1 => valore_1, .. , indice_n => valore_n ) • Un’altra struttura di iterazione utilizzabile con gli array è il foreach foreach ( $array as $elemento => $variabile ) <istruzione>; estrae ad ogni ciclo un elemento e ne salva l’indice in $elemento e il valore in $variabile 24 Novembre 2005 Stefano Clemente 36 Esempio 4 24 Novembre 2005 Stefano Clemente 37 Esempio 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <!-- Fig. 29.6: arrays.php --> <!-- Array manipulation --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Array manipulation</title> </head> <body> <?php // create array first print( "<strong>Creating the first array</strong> <br />" ); 24 Novembre 2005 Stefano Clemente 38 Esempio 4 $first[ 0 ] = "zero"; $first[ 1 ] = "one"; $first[ 2 ] = "two"; $first[] = "three"; // print each element’s index and value for ( $i = 0; $i < count( $first ); $i++ ) print( "Element $i is $first[$i] <br />" ); print( "<br /><strong>Creating the second array </strong><br />" ); ); 24 Novembre 2005 // call function array to create array second $second = array( "zero", "one", "two", "three" for ( $i = 0; $i < count( $second ); $i++ ) print( "Element $i is $second[$i] <br />" ); Stefano Clemente 39 Esempio 4 print( "<br /><strong>Creating the third array </strong><br />" ); // assign values to non-numerical indices $third[ "Harvey" ] = 21; $third[ "Paul" ] = 18; $third[ "Tem" ] = 23; // iterate through the array elements and print each // element’s name and value for ( reset( $third ); $element = key( $third ); next( $third ) ) print( "$element is $third[$element] <br />" ); print( "<br /><strong>Creating the fourth array </strong><br />" ); // call function array to create array fourth using // string indices $fourth = array( "January" => "first", "February" => "second", "March" => "third", "April" => "fourth", "May" => "fifth", "June" => "sixth", "July" => "seventh", "August" => "eighth", "September" => "ninth", "October" => "tenth", "November" => "eleventh","December" => "twelfth" ); // print each element’s name and value foreach ( $fourth as $element => $value ) print( "$element is the $value month <br />" ); ?> </body> </html> 24 Novembre 2005 Stefano Clemente 40 Manipolazione di Stringhe ed Espressioni Regolari • L’elaborazione delle stringhe è facile, efficiente con la possibilità di eseguire la ricerca di sottostringhe, la sostituzione, la concatenazione e l’estrazione • La manipolazione di stringhe viene fatta attraverso le espressioni regolari − serie di caratteri che servono come criterio di ricerca (patternmatching) in stringhe, file di testo e DB • Si può eseguire il confronto di due stringhe attraverso gli operatori relazionali (==, !=, <, <=, >, >=) • È possibile confrontare due stringhe attraverso la funzione strcmp che accetta due stringhe come argomenti e restituisce − -1 – se la prima stringa precede la seconda in ordine alfabetico − 0 – se le stringhe sono uguali − 1 – se la prina stringa segue la seconda in ordine alfabetico 24 Novembre 2005 Stefano Clemente 41 Esempio 5 24 Novembre 2005 Stefano Clemente 42 Esempio 5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.7: compare.php --> <!-- String Comparison --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>String Comparison</title> </head> <body> <?php // create array fruits $fruits = array( "apple", "orange", "banana" ); // iterate through each array element for ( $i = 0; $i < count( $fruits ); $i++ ) { // call function strcmp to compare the array element 24 Novembre 2005 Stefano Clemente 43 Esempio 5 // to string "banana" if ( strcmp( $fruits[ $i ], "banana" ) < 0 ) print( $fruits[ $i ]." is less than banana " ); elseif ( strcmp( $fruits[ $i ], "banana" ) > 0 ) print( $fruits[ $i ]. " is greater than banana " ); else print( $fruits[ $i ]." is equal to banana " ); // use relational operators to compare each element // to string "apple" if ( $fruits[ $i ] < "apple" ) print( "and less than apple! <br />" ); elseif ( $fruits[ $i ] > "apple" ) print( "and greater than apple! <br />" ); elseif ( $fruits[ $i ] == "apple" ) print( "and equal to apple! <br />" ); } ?> </body> </html> 24 Novembre 2005 Stefano Clemente 44 Manipolazione di Stringhe ed Espressioni Regolari • Per confronti più sofisticati ci sono le funzioni ereg e preg_match − usano le espressioni regolari • ereg usa Portable Operating System Interface (POSIX) extended regular expressions • preg_match usa Perl-compatible regular expressions − cercano una sottostringa in una stringa secondo il criterio specificato • Le espressioni regolari di PHP si riferiscono allo standard POSIX per cui esamineremo solo ereg • ereg accetta due parametri: − l’espressione regolare che indica il criterio (pattern) − la stringa dentro la quale effettuare la ricerca 24 Novembre 2005 Stefano Clemente 45 Manipolazione di Stringhe ed Espressioni Regolari • Se la ricerca ha esito positivo restituisce true • ereg esegue una ricerca case sensitive • PHP fornisce una versione case insensitive: eregi • Caratteri speciali della stringa pattern (metacaratteri) − ^ – cerca all’inizio della stringa − $ – cerca alla fine della stringa − . – qualsiasi singolo carattere 24 Novembre 2005 Stefano Clemente 46 Manipolazione di Stringhe ed Espressioni Regolari • Espressioni con parentesi − liste di caratteri racchiuse tra [ ] – eseguono il confronto di un singolo carattere della lista − gli intervalli di caratteri possono essere specificati indicando gli estremi separati da un trattino – es. [ a – z ] − espressioni con parentesi speciali • [[:<:]] – confronta l’inizio delle parole • [[:>:]] – confronta la fine delle parole − character class • • • • • • [[:alnum:]] [[:alpha:]] [[:digit:]] [[:space:]] [[:lower:]] [[:upper:]] 24 Novembre 2005 – – – – – – qualsiasi carattere alfanumerico qualsiasi carattere alfabetico numeri spazi lettere minuscole lettere maiuscole Stefano Clemente 47 Manipolazione di Stringhe ed Espressioni Regolari • Quantificatori – eseguono il confronto del pattern che li precede − {n} – n volte − {m,n} – tra m e n volte (estremi inclusi) − {n,} – n o più volte − + – una o più volte ({1,}) − * – zero o più volte ({0,}) − ? – zero o una volta ({0,1}) 24 Novembre 2005 Stefano Clemente 48 Manipolazione di Stringhe ed Espressioni Regolari • Per effettuare delle sostituzioni all’interno di una stringa in base a un criterio di ricerca si usa la funzione ereg_replace i cui argomenti sono − il pattern − la stringa che rimpiazza la sottostringa corrispondente al pattern − la stringa dentro la quale eseguire la ricerca e l’eventuale sostituzione • ereg_replace può anche essere usata per trovare tutte le occorrenze di un pattern 24 Novembre 2005 Stefano Clemente 49 Esempio 6 24 Novembre 2005 Stefano Clemente 50 Esempio 6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <!-- Fig. 29.8: expression.php --> <!-- Using regular expressions --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Regular expressions</title> </head> <body> <?php 24 Novembre 2005 Stefano Clemente 51 Esempio 6 $search = "Now is the time"; print( "Test string is: '$search'<br /><br />" ); // call function ereg to search for pattern ’Now’ // in variable search if ( ereg( "Now", $search ) ) print( "String 'Now' was found.<br />" ); // search for pattern ’Now’ in the beginning of // the string if ( ereg( "^Now", $search ) ) print( "String 'Now' found at beginning of the line.<br />" ); // search for pattern ’Now’ at the end of the string if ( ereg( "Now$", $search ) ) print( "String 'Now' was found at the end of the line.<br />" ); // search for any word ending in ’ow’ if ( ereg( "[[:<:]]([a-zA-Z]*ow)[[:>:]]", $search, $match ) ) print( "Word found ending in 'ow': " . $match[ 1 ] . "<br />" ); // search for any words beginning with ’t’ print( "Words beginning with 't' found: "); 24 Novembre 2005 Stefano Clemente 52 Esempio 6 while ( eregi( "[[:<:]](t[[:alpha:]]+)[[:>:]]", $search, $match ) ) { print( $match[ 1 ] . " " ); // remove the first occurrence of a word beginning // with ’t’ to find other instances in the string $search = ereg_replace( $match[ 1 ], "", $search ); } print ( "<br />" ); print( "<br />" ); print ( "$search" ); print( "<br />" ); ?> </body> </html> 24 Novembre 2005 Stefano Clemente 53 Variabili d’ambiente • Poter conoscere l’ambiente del client è utile per personalizzare le sessioni in base a informazioni specifiche • Le variabili d’ambiente contengono le informazioni sul browser del client, il server HTTP e la stessa connessione HTTP • PHP memorizza le variabili d’ambiente e i relativi valori nell’array $GLOBALS • Le singole variabili possono essere accedute usando le chiavi degli elementi di $GLOBALS 24 Novembre 2005 Stefano Clemente 54 Esempio 7 24 Novembre 2005 Stefano Clemente 55 Esempio 7 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.11: globals.php --> <!-- Program to display environment variables --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Environment Variables</title> </head> <body> <table border = "0" cellpadding = "2" cellspacing = "0" width = "100%"> <?php // print the key and value for each element in the // in the $GLOBALS array foreach ( $GLOBALS as $key => $value ) print( "<tr><td bgcolor = \"#11bbff\"> <strong>$key</strong></td> <td>$value</td></tr>" ); ?> </table> </body> </html> 24 Novembre 2005 Stefano Clemente 56 Elaborazione delle Form • Quando si esegue l’azione di POST o GET dei dati della form, questi vengono inviati al web server • Per ogni campo della form che viene inviato a uno script PHP, PHP crea una variabile globale avente lo stesso nome del campo 24 Novembre 2005 Stefano Clemente 57 Esempio 8 24 Novembre 2005 Stefano Clemente 58 Esempio 8 24 Novembre 2005 Stefano Clemente 59 Esempio 8 24 Novembre 2005 Stefano Clemente 60 Esempio 8 24 Novembre 2005 Stefano Clemente 61 Esempio 8: form.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.13: form.html --> <!-- Form for use with the form.php program --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Sample form to take user input in XHTML</title> </head> <body> <h1>This is a sample registration form.</h1> Please fill in all fields and click Register. <!-- post form data to form.php --> <form method = "post" action = "form.php"> <img src = "images/user.gif" alt = "User" /><br /> <span style = "color: blue"> Please fill out the fields below.<br /> 24 Novembre 2005 Stefano Clemente 62 Esempio 8: form.html </span> <!-- create four text boxes for user input --> <img src = "images/fname.gif" alt = "First Name" /> <input type = "text" name = "fname" /><br /> <img src = "images/lname.gif" alt = "Last Name" /> <input type = "text" name = "lname" /><br /> <img src = "images/email.gif" alt = "Email" /> <input type = "text" name = "email" /><br /> <img src = "images/phone.gif" alt = "Phone" /> <input type = "text" name = "phone" /><br /> <span style = "font-size: 10pt"> Must be in the form (555)555-5555</span> <br /><br /> <img src = "images/downloads.gif" alt = "Publications" /><br /> 24 Novembre 2005 Stefano Clemente 63 Esempio 8: form.html <span style = "color: blue"> Which book would you like information about? </span><br /> <!-- create drop-down list containing book names --> <select name = "book"> <option>Internet and WWW How to Program 2e</option> <option>C++ How to Program 3e</option> <option>Java How to Program 4e</option> <option>XML How to Program 1e</option> </select> <br /><br /> <img src = "images/os.gif" alt = "Operating System" /> <br /><span style = "color: blue"> Which operating system are you currently using? <br /></span> <!-- create five radio buttons --> <input type = "radio" name = "os" value = "Windows NT" checked = "checked" /> 24 Novembre 2005 Stefano Clemente 64 Esempio 8: form.html Windows NT <input type = "radio" name = "os" value = "Windows 2000" /> Windows 2000 <input type = "radio" name = "os" value = "Windows 98" /> Windows 98<br /> <input type = "radio" name = "os" value = "Linux" /> Linux <input type = "radio" name = "os" value = "Other" /> Other<br /> <!-- create a submit button --> <input type = "submit" value = "Register" /> </form> </body> </html> 24 Novembre 2005 Stefano Clemente 65 Esempio 8: form.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.14: form.php --> <!-- Read information sent from form.html --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Form Validation</title> </head> <body style = "font-family: arial,sans-serif"> <?php // determine if phone number is valid and print // an error message if not if ( !ereg( "^\([0-9]{3}\)[0-9]{3}-[0-9]{4}$", $phone ) ){ 24 Novembre 2005 Stefano Clemente 66 Esempio 8: form.php print( "<p><span style = \"color: red; font-size: 2em\"> INVALID PHONE NUMBER</span><br /> A valid phone number must be in the form <strong>(555)555-5555</strong><br /> <span style = \"color: blue\"> Click the Back button, enter a valid phone number and resubmit.<br /><br /> Thank You.</span></p></body></html>" ); ?> } die(); // terminate script execution <p>Hi <span style = "color: blue"> <strong> <?php print( "$fname" ); ?> </strong> </span>. 24 Novembre 2005 Stefano Clemente 67 Esempio 8: form.php Thank you for completing the survey.<br /> You have been added to the <span style = "color: blue"> <strong> <?php print( "$book " ); ?> </strong> </span> mailing list. </p> <strong>The following information has been saved in our database:</strong><br /> <table border = "0" <tr> <td bgcolor = <td bgcolor = <td bgcolor = <td bgcolor = </tr> 24 Novembre 2005 cellpadding = "0" cellspacing = "10"> "#ffffaa">Name </td> "#ffffbb">Email</td> "#ffffcc">Phone</td> "#ffffdd">OS</td> Stefano Clemente 68 Esempio 8: form.php <tr> <?php ?> </tr> </table> // print each form field’s value print( "<td>$fname $lname</td> <td>$email</td> <td>$phone</td> <td>$os</td>" ); <br /><br /><br /> <div style = "font-size: 10pt; text-align: center"> This is only a sample form. You have not been added to a mailing list. </div> </body> </html> 24 Novembre 2005 Stefano Clemente 69 Gestione dei file • Un file viene aperto attraverso la funzione fopen che assegna un file-handle, vale a dire un numero attraverso il quale il web server identificherà il file • fopen accetta due argomenti − il nome del file − la modalità con cui aprire il file • read • write • append • Una volta aperto il file si può leggere o scrivere rispettivamente attraverso le funzioni fgets e fputs 24 Novembre 2005 Stefano Clemente 70 Gestione dei file • fgets − accetta come parametri un file-handle e opzionalmente la lunghezza della stringa da leggere − se si omette la lunghezza legge la linea fino al raggiungimento del new-line o dell’EOF − in caso di errore restituisce false • fputs − accetta come parametri un file-handle, la stringa da scrivere e opzionalmente la lunghezza massima della stringa da scrivere − restituisce il numero di byte scritti o false in caso di errore 24 Novembre 2005 Stefano Clemente 71 Gestione dei file • Alla fine dell’utilizzo il file deve essere chiuso attraverso la funzione fclose • fclose accetta come argomento il filehandle • Restituisce true in caso di successo e false altrimenti 24 Novembre 2005 Stefano Clemente 72 Esempio 9 24 Novembre 2005 Stefano Clemente 73 Esempio 9 24 Novembre 2005 Stefano Clemente 74 Esempio 9 24 Novembre 2005 Stefano Clemente 75 Esempio 9 24 Novembre 2005 Stefano Clemente 76 Esempio 9 24 Novembre 2005 Stefano Clemente 77 Esempio 9 24 Novembre 2005 Stefano Clemente 78 Esempio 9 24 Novembre 2005 Stefano Clemente 79 Esempio 9 24 Novembre 2005 Stefano Clemente 80 Esempio 9 24 Novembre 2005 Stefano Clemente 81 Esempio 9 24 Novembre 2005 Stefano Clemente 82 Esempio 9: password.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.15: password.html --> <!-- XHTML form sent to password.php for verification --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Verifying a username and a password.</title> <style type = "text/css"> td { background-color: #DDDDDD } </style> </head> <body style = "font-family: arial"> <p style = "font-size: 13pt"> Type in your username and password below. <br /> 24 Novembre 2005 Stefano Clemente 83 Esempio 9: password.html <span style = "color: #0000FF; font-size: 10pt; font-weight: bold"> Note that password will be sent as plain text </span> </p> <!-- post form data to password.php --> <form action = "password.php" method = "post"> <br /> <table border = "0" cellspacing = "0" style = "height: 90px; width: 123px; font-size: 10pt" cellpadding = "0"> <tr> <td colspan = "3"> <strong>Username:</strong> </td> </tr> 24 Novembre 2005 Stefano Clemente 84 Esempio 9: password.html <tr> <td colspan = "3"> <input size = "40" name = "USERNAME" style = "height: 22px; width: 115px" /> </td> </tr> <tr> <td colspan = "3"> <strong>Password:</strong> </td> </tr> <tr> <td colspan = "3"> <input size = "40" name = "PASSWORD" style = "height: 22px; width: 115px" type = "password" /> 24 Novembre 2005 Stefano Clemente 85 Esempio 9: password.html <br/></td> </tr> <tr> <td colspan = "1"> <input type = "submit" name = "Enter" value = "Enter" style = "height: 23px; width: 47px" /> </td> <td colspan = "2"> <input type = "submit" name = "NewUser" value = "New User" style = "height: 23px" /> </td> </tr> </table> </form> </body> </html> 24 Novembre 2005 Stefano Clemente 86 Esempio 9: password.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.16: password.php --> <!-- Searching a database for usernames and passwords. --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <?php // check if user has left USERNAME // or PASSWORD field blank if ( !$USERNAME || !$PASSWORD ) { fieldsBlank(); die(); } // check if the New User button was clicked if ( isset( $NewUser ) ) { 24 Novembre 2005 Stefano Clemente 87 Esempio 9: password.php // open password.txt for writing using append mode if ( !( $file = fopen( "password.txt", "append" ) ) ) { } // print error message and terminate script // execution if file cannot be opened print( "<title>Error</title></head><body> Could not open password file </body></html>" ); die(); // write username and password to file and // call function userAdded fputs( $file, "$USERNAME,$PASSWORD\n" ); userAdded( $USERNAME ); } else { 24 Novembre 2005 Stefano Clemente 88 Esempio 9: password.php // if a new user is not being added, open file // for reading if ( !( $file = fopen( "password.txt", "read" ) ) ) { print( "<title>Error</title></head> <body>Could not open password file </body></html>" ); die(); } $userVerified = 0; // read each line in file and check username // and password while ( !feof( $file ) && !$userVerified ) { // read line from file $line = fgets( $file, 255 ); 24 Novembre 2005 Stefano Clemente 89 Esempio 9: password.php // remove newline character from end of line $line = chop( $line ); // split username and password $field = split( ",", $line, 2 ); // verify username if ( $USERNAME == $field[ 0 ] ) { $userVerified = 1; } 24 Novembre 2005 } // call function checkPassword to verify // user’s password if ( checkPassword( $PASSWORD, $field ) == true ) accessGranted( $USERNAME ); else wrongPassword(); Stefano Clemente 90 Esempio 9: password.php // close text file fclose( $file ); } // call function accessDenied if username has // not been verified if ( !$userVerified ) accessDenied(); // verify user password and return a boolean function checkPassword( $userpassword, $filedata ) { if ( $userpassword == $filedata[ 1 ] ) return true; else return false; } 24 Novembre 2005 Stefano Clemente 91 Esempio 9: password.php // print a message indicating the user has been added function userAdded( $name ) { print( "<title>Thank You</title></head> <body style = \"font-family: arial; font-size: 1em; color: blue\"> <strong>You have been added to the user list, $name. <br />Enjoy the site.</strong>" ); } // print a message indicating permission // has been granted function accessGranted( $name ) { print( "<title>Thank You</title></head> <body style = \"font-family: arial; font-size: 1em; color: blue\"> <strong>Permission has been granted, $name. <br /> 24 Novembre 2005 Stefano Clemente 92 Esempio 9: password.php } Enjoy the site.</strong>" ); // print a message indicating password is invalid function wrongPassword() { print( "<title>Access Denied</title></head> <body style = \"font-family: arial; font-size: 1em; color: red\"> <strong>You entered an invalid password.<br />Access has been denied.</strong>" ); } // print a message indicating access has been denied function accessDenied() { print( "<title>Access Denied</title></head> <body style = \"font-family: arial; 24 Novembre 2005 Stefano Clemente 93 Esempio 9: password.php } font-size: 1em; color: red\"> <strong> You were denied access to this server. <br /></strong>" ); // print a message indicating that fields // have been left blank function fieldsBlank() { print( "<title>Access Denied</title></head> <body style = \"font-family: arial; font-size: 1em; color: red\"> <strong> Please fill in all form fields. <br /></strong>" ); } ?> </body> </html> 24 Novembre 2005 Stefano Clemente 94 Esempio 10 24 Novembre 2005 Stefano Clemente 95 Esempio 10 24 Novembre 2005 Stefano Clemente 96 Esempio 10 24 Novembre 2005 Stefano Clemente 97 Esempio 10 24 Novembre 2005 Stefano Clemente 98 Esempio 10 24 Novembre 2005 Stefano Clemente 99 Esempio 10: data.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Fig. 29.18: data.html --> <!-- Querying a MySQL Database --> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Sample Database Query</title> </head> <body style = "background-color: #F0E68C"> <h2 style = "font-family: arial color: blue"> Querying a MySQL database. </h2> <form enctype="multipart/form-data" method = "post" action = "database.php"> <p>Select a field to display: 24 Novembre 2005 Stefano Clemente 100 Esempio 10: data.html <!-- add a select box containing options --> <!-- for SELECT query --> <select name = "select"> <option selected = "selected">*</option> <option>ID</option> <option>Title</option> <option>Category</option> <option>ISBN</option> </select> </p> <input type = "submit" value = "Send Query" style = "background-color: blue; color: yellow; font-weight: bold" /> </form> </body> </html> 24 Novembre 2005 Stefano Clemente 101 Esempio 10: database.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Search Results</title> </head> <body style = "font-family: arial, sans-serif" style = "background-color: #F0E68C"> <?php $db = 'C:\\web\\html\\books.mdb'; $conn = new COM('ADODB.Connection'); $conn->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$db"); 24 Novembre 2005 Stefano Clemente 102 Esempio 10: database.php $sql = "SELECT $select FROM books ORDER BY ID"; $rs = $conn->Execute($sql); ?> <table border = "1" cellpadding = "3" cellspacing = "2" style = "background-color: #ADD8E6"> <?php print("<tr>"); if ( $select == "*" ) { print("<th>ID</th>"); print("<th>Title</th>"); print("<th>Category</th>"); print("<th>ISBN</th>"); 24 Novembre 2005 Stefano Clemente 103 Esempio 10: database.php } else print("<th>$select</th>"); print("</tr>"); $count = 0; while (!$rs->EOF): print("<tr>"); if ( $select == "*" ) { print("<td>" . $rs->Fields['ID']->Value . "</td>"); print("<td>" . $rs->Fields['Title']->Value . "</td>"); print("<td>" . $rs->Fields['Category']->Value . "</td>"); print("<td>" . $rs->Fields['ISBN']->Value . "</td>"); } else print("<td>" . $rs->Fields[$select]->Value . "</td>"); print("</tr>"); $rs->MoveNext(); $count++; 24 Novembre 2005 Stefano Clemente 104 Esempio 10: database.php endwhile; ?> </table> <br />Your search yielded <strong> <?php $i = $rs->RecordCount(); print(" $count results.<br /><br /></strong>"); $rs->Close(); $conn->Close(); ?> <h5>Please email comments to <a href = "mailto:[email protected]"> Deitel and Associates, Inc. </a> </h5> </body> </html> 24 Novembre 2005 Stefano Clemente 105 Cookie • Per inviare i cookie al client PHP dispone della funzione setcookie • setcookie deve essere richiamata prima di qualsiasi tag XHTML • argomenti − il nome del cookie − il valore (opzionale) − la data di expire (opzionale) 24 Novembre 2005 Stefano Clemente 106 Cookie • I cookie memorizzati sul client, vengono inviati al server insieme a ogni richiesta • Analogamente ai dati inviati con le form, PHP crea le variabili relative ai cookie non appena li riceve • Inoltre php crea l’array $HTTP_COOKIE_VARS indicizzato in base ai nomi dei cookie 24 Novembre 2005 Stefano Clemente 107 Esempio 11 24 Novembre 2005 Stefano Clemente 108 Esempio 11 24 Novembre 2005 Stefano Clemente 109 Esempio 11 24 Novembre 2005 Stefano Clemente 110 Esempio 11: cookies.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Writing a cookie to the client computer</title> </head> <body style = "font-family: arial, sans-serif; background-color: #99CCFF"> <h2>Click Write Cookie to save your cookie data.</h2> <form method = "post" action = "cookies.php" style = "font-size: 10pt"> <strong>Name:</strong><br /> <input type = "text" name = "NAME" /><br /> <strong>Height:</strong><br /> <input type = "text" name = "HEIGHT" /><br /> <strong>Favorite Color:</strong><br /> <input type = "text" name = "COLOR" /><br /> <input type = "submit" value = "Write Cookie" style = "background-color: #F0E86C; color: navy; font-weight: bold" /></p> </form> </body> </html> 24 Novembre 2005 Stefano Clemente 111 Esempio 11: cookies.php <?php // Fig. 29.21: cookies.php // Program to write a cookie to a client's machine ?> // write each form field’s value to a cookie and set the // cookie’s expiration date setcookie( "Name", $NAME, time() + 60 * 60 * 24 * 5 ); setcookie( "Height", $HEIGHT, time() + 60 * 60 * 24 * 5 ); setcookie( "Color", $COLOR, time() + 60 * 60 * 24 * 5 ); <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>Cookie Saved</title> </head> 24 Novembre 2005 Stefano Clemente 112 Esempio 11: cookies.php <body style = "font-family: arial, sans-serif"> <p>The cookie has been set with the following data:</p> <!-- print each form field’s value --> <br /><span style = "color: blue">Name:</span> <?php print( $NAME ) ?><br /> <span style = "color: blue">Height:</span> <?php print( $HEIGHT ) ?><br /> <span style = "color: blue">Favorite Color:</span> <span style = "color: <?php print( "$COLOR\">$COLOR" ) ?> </span><br /> <p>Click <a href = "readCookies.php">here</a> to read the saved cookie.</p> </body> </html> 24 Novembre 2005 Stefano Clemente 113 Esempio 11: readCookies.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head><title>Read Cookies</title></head> <body style = "font-family: arial, sans-serif"> <p> <strong> The following data is saved in a cookie on your computer. </strong> </p> <table border = "5" cellspacing = "0" cellpadding = "10"> <?php // iterate through array $HTTP_COOKIE_VARS and print // name and value of each cookie foreach ( $HTTP_COOKIE_VARS as $key => $value ) print( "<tr> <td bgcolor=\"#F0E68C\">$key</td> <td bgcolor=\"#FFA500\">$value</td> </tr>" ); ?> </table> </body> </html> 24 Novembre 2005 Stefano Clemente 114