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