Upload
others
View
20
Download
0
Embed Size (px)
Citation preview
1
-lezione 17 -
Il linguaggio PHP
Linguaggi
Corso M-Z -
Laurea in Ingegneria Informatica
A.A. 2007-2008
Alessandro Longheuhttp://w
ww.diit.unict.it/users/alongheu
2
Generalità
sul PHP
�PH
P, che significa "PHP: H
ypertext Preprocessor", èun lin
guaggio
di scrip
ting general-p
urpose Open Source m
olto utilizzato, èspecialm
ente indicato per lo sviluppo Web e può essere integrato
nell'HTM
L. �
La sua sintassi èbasata su quella di C
, Java e Perl, ed èmolto
semplice da im
parare. �Story: PH
P succeeds an older product, named PH
P/FI. PHP/FI w
as created by R
asmus Lerdorf in 1995, initially as a sim
ple set of Perl scripts for tracking accesses to his online resum
e. He nam
ed this set of scripts 'Personal H
ome Page Tools'. As m
ore functionalitywas
required, Rasm
us wrote
a much
larger C implem
entation, which w
as able to communicate w
ith databases, and enabled users to develop sim
ple dynamic W
eb applications. PHP/FI, w
hich stood for Personal H
ome Page / Form
s Interpreter, included some of the
basic functionality of PHP as w
e know it today. It had Perl-like
variables, autom
atic interpretation
of form
variables
and HTM
L em
bedded syntax.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
3
Generalità
sul PHP
�Un prim
o esempio di utilizzo tipico di codice in php:
<htm
l>
<head>
<title>
Esempio<
/title>
</head>
<body>
<?php echo "Ciao, sono uno script PH
P!"; ?>
</body>
</htm
l>
�questo esem
pio èdifferente da uno script scritto in altri linguaggi
tipo Perl
o C:
invece di
scrivere un
programma
con parecchi
comandi
per produrre
HTM
L, si
scrive in
HTM
L con
qualche com
ando immerso per ottenere dei risultati (in questo sem
plice esem
pio, la visualizzazione di una frase). Il codice PHP è
delimitato
da speciali start ed end tag che ne indicano l'inizio e la fine e che consentono di passare dal m
odo HTM
L al modo PH
P. �
Ciò che distingue PHP da altri linguaggi di scripting del tipo client-
side (JavaScript) èche il codice viene eseguito nel server.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
4
Generalità
sul PHP
�Esistono tre
campi prin
cipaliin cui vengono usati gli scripts PH
P: �Lo scripting server-side. Q
uesto èil cam
po piùtradizionale ed il
maggiore obiettivo del PH
P. Per fare questo lavoro occorrono trecose. Il parser PH
P (CGI o server m
odule), un webserver ed un
browser w
eb. Occorre avviare il server w
eb con un'installazione di PH
P attiva. Si può accedere all'output del programma PH
P con un brow
ser web e vedere la pagina PH
P tramite il server. Tutto
ciò può
essere attivato
sul pc
di casa
se si
desidera sem
plicemente provare la program
mazione PH
P. �Lo scripting su riga di com
ando. Si può creare uno script PHP da
usare senza alcun server o browser. Per usarlo in questo m
odo, l'unica cosa necessaria è
un parser PHP. Q
uesto tipo di utilizzo èideale per gli scripts eseguiti con cron (sui sistem
i *nix o Linux) oppure il Task Scheduler (su W
indows).
�Scrittura
di applicazioni
desktop, anche
se PH
P non
èil
linguaggio piùadatto per scrivere tali applicazioni.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
5
Generalità
sul PHP
�PH
P può essere usato su tutti i principali sistemi operativi
�si
può anche
scegliere una
programmazione procedurale
oppure orie
ntata agli o
ggetti, o una com
binazione di entrambe.
�Con
PHP
non si
èlim
itati soltanto
ad un
output in
HTM
L. Le
possibilitàdi PH
P, infatti, includono l'abilitàdi generare im
magini,
files PDF e perfino film
ati Flash al volo (utilizzando libswf e M
ing). �
Una delle caratteristiche più
importanti e significative di PH
P èla
possibilitàdi s
upporta
re una completa gamma di d
atabase;
PHP
supporta anche
ODBC,
lo standard
di collegam
ento con
i database.
�PH
P fa
anche da
supporto per
dialogare con altri
servizi
utilizzando i protocolli del tipo LDAP, IM
AP, SNMP, N
NTP, PO
P3, HTTP, C
OM (in W
indows) e innum
erevoli altri. Si possono aprire sockets ed interagire usando qualsiasi altro protocollo.
�PH
P supporta l'installazione dei JavaObjects e l'utilizzo di questi
come
oggetti PH
P in
modo
trasparente. Si
può anche
usare l’estensione C
ORBA per accedere ad oggetti rem
oti.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
6
Delim
itazione del PHP
�La m
odalitàdi operare del php spesso si interfaccia con H
tml:
�A partire dal file php, eseguito dal lato server:<htm
l>
<head>
</head>
<body>
<?php echo "H
ello World!<
p>"; ?>
</body>
</htm
l>�
L'output di questo script saràil file H
tml, visualizzabile dal client:
<htm
l>
<head>
</head>
<body>
Hello W
orld!<p>
</body>
</htm
l>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
7
Delim
itazione del PHP
�Quando il PH
P inizia a esaminare un file, cerca i ta
g di apertu
ra e
di
chiusura,
che indicano
dove iniziare
e term
inare l'interpretazione
del codice.
Questa
tecnica perm
ette al
PHP
di essere incorporato in tutte le tipologie di docum
enti, ed ogni cosa esterna a tali tag viene ignorata, ovvero quando il PH
P trova iltag
di chiusura ?>, inizia a visualizzare tutto ciò che incontra sino a
quando non si raggiunge un'altro tag di apertura. �
Esistono 4 set d
i tag che possono essere utilizzati per delim
itare blocchi
di codice
PHP.
Soltanto due
di questi
(<?php.
. .?>
e
<script language=
"php">. . .<
/script>) sono sem
pre disponibili. Gli
altri due sono i tag brevi e i tag stile ASP e possono essere attivati o disattivati tram
ite il file di configurazione php.ini. Sebbenei tag
brevi o quelli in stile ASP possano essere pratici, questi sono meno
portabili e, in generale, sconsigliati. �
il PHP richiede che le istruzioni siano chiuse dal punto e virgola al
termine di ogni istruzione.
�Il PH
P supporta i commenti stile C e stile PER
L (con ‘#’).
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
8
Variabili in PHP
�Le
varia
bili in PH
P sono identificate da un nome case sensitive
preceduto da ‘$’�
Le variabili non hanno bisogno di essere dichiarate, la dichiarazione avviene quando alla variabile viene assegnato un valore, quindi una variabile che contiene un num
ero può essere interpretata sia come
numero che com
e testo. Qualche esem
pio:$variabile =
"1";$variabile =
1; le variabili sono valide in entram
bi i casiecho 234 +
"145"; �
In questo caso il PHP converte la stringa "145" in un num
ero intero, lo
somma
all’intero 234,
converte il
risultato in
stringa e
lo visualizza sulla pagina tram
ite la funzione echo().�
Il castin
gsi fa direttam
ente o con la funzione settype():$variabile =
(string) 234;$variabile =
12;settype($variabile, "double");
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
9
�In PH
P 3, variables are always assigned by value, As of PH
P 4, PHP
offers assign by reference. This m
eans that the new variable
simply references (in other w
ords, "becomes an alias for" or "points
to") the original variable. Changes to the new variable affect the
original, and vice versa. To assign by reference, simply prepend
an am
persand (&) to the beginning of the variable w
hich is being assigned (the source variable). <?php
$foo = 'Bob'; // Assign the value 'Bob' to $foo
$bar = &$foo; // Reference $foo via $bar.
$bar = "M
y name is $bar"; // Alter $bar...
echo $bar; echo $foo; // $foo is altered too. ?$bar =
&(24 * 7); // Invalid; references an unnam
ed expression. ?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
10
�PH
P supports eight p
rimitiv
e ty
pes.
�Four scalar types: boolean, integer, float (aka 'double'), string
�Tw
o compound types: array, object
�Tw
o special types: resource, NULL
�In particolare:
�To specify a b
ooleanliteral, use either TR
UE or FALSE. Both are case-
insensitive: <?php $foo =
True; // assign the value TRUE to $foo ?>
�Integerliterals: <
?php $a = 1234; // decim
al number $a =
-123; // a negative num
ber $a = 0123; // octal num
ber (equivalent to 83 decimal)
$a = 0x1A; // hexadecim
al number (equivalent to 26 decim
al) ?>; The
size of an integer is platform-dependent, although a m
aximum
value of about tw
o billion is the usual value (that's 32 bits signed). PHP does not
support unsigned integers. �
Floatin
g pointnum
bers (AKA "floats", "doubles" or "real numbers") can
be specified using any of the following syntaxes: <
?php $a = 1.234; $b =
1.2e3; $c =
7E-10; ?>; The size of a float is platform
-dependent, although a m
aximum
of ~1.8e308 w
ith a precision of roughly 14 decimal digits is a
common value (that's 64 bit IEEE form
at).
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
11
�A s
tringis series of characters. In PH
P, a character is the same as a byte,
that is,
there are
exactly 256
different characters
possible. This
also implies that PH
P has no native support of Unicode;
�It is no problem
for a string to become very large. There is no practical
bound to the size of strings imposed by PH
P, so there is no reason at all to worry about long strings.
�A string literal can be specified in th
ree diffe
rent w
ays: single quoted,
double quoted, heredoc syntax�
Single quote
is the easiest way, but variables and escape sequences for
special characters will not
be expanded: <?php echo 'this is a sim
ple string'; echo 'Arnold once said: "I\'ll be back"'; // O
utputs: Arnold once said: "I'll be back" echo 'You deleted C:\\*.*?'; // O
utputs: You deleted C:\*.*? 'This w
ill not expand: \n a newline';
// Outputs: This w
ill not expand: \n a newline echo
echo 'Variables do not $expand $either'; // O
utputs: Variables do not $expand $either ?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
12
�If the string is enclosed in d
ouble-quotes("), PH
P understands more escape sequences for special characters, as \n, \t, \\, \$, \”
�Again, if you try to escape any other character, the backslash w
ill be printed too, but the m
ost important feature of double-quoted
strings is the fact that variable names w
ill be expanded. �
Another way
to delim
it strings
is by
using heredoc syntax
("<<<"). O
ne should provide an identifier after <<<, then the
string, and then the same identifier to close the quotation. H
eredoc text behaves just like a double-quoted string, w
ithout the double-quotes. This m
eans that you do not need to escape quotes in yourhere docs, but you can still use the escape codes listed above. Variables are expanded <?php
$str = <<<EO
D
Example of string spanning m
ultiple lines using heredoc syntax. EO
D;
?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
13
Variabili in PHP
�Characters
within
strings may
be accessed
and modified
by specifying the zero-based offset of the desired character after the string in curly braces. <?php
$str = 'This is a test.';
$first = $str{0}; // G
et the first character of a string $last =
$str{strlen($str)-1}; // Get the last character of a string.
$str{strlen($str)-1} = 'e'; // M
odify the last character of a string ?>
�Ci
sono due
operatori
di strin
ga.
Il prim
o è
l'operatore di
concatenazione ('.'),
che restituisce
la concatenazione
dei suoi
argomenti
di destra
e di
sinistra. Il
secondo è
l'operatore di
assegnazione concatenata ('.='), che accoda l'argom
ento sul latodestro all'argom
ento sul lato sinistro. <?php
$a = "Ciao "; $b =
$a . "Mondo!"; // ora $b contiene "Ciao M
ondo!" $a .=
"Mondo!"; // ora $a contiene "Ciao M
ondo!" ?>
�There are a lot of useful functions, e.g. for advanced find&
replacing with ER
, functions for URL-strings, and to encrypt/decrypt.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
14
�Determ
ining a varia
ble’s ty
pe:
<?php
$bool = TRU
E; // a boolean $str =
"foo"; // a string $int =
12; // an integer echo gettype($bool); // prints out "boolean“echo gettype($str); // prints out "string" // If this is an integer, increm
ent it by four if (is_int($int)) { $int +
= 4; }
// If $bool is a string, print it out // (does not print out anything) if (is_string($bool)) { echo "String: $bool"; } ?>
�Automatic ty
pe conversio
n:
<?php
$foo = "0"; // $foo is string (ASCII 48)
$foo += 2; // $foo is now
an integer (2) $foo =
$foo + 1.3; // $foo is now
a float (3.3)$foo =
5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 +
"10 Small Pigs"; // $foo is integer (15) ?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
15
�An a
rray in PH
P is actually an ordered map. A m
ap is a type that maps values to keys. This type is optim
ized in several ways, so you
can use it as a real array, or a list (vector), hashtable (which
is an implem
entation of a map), dictionary, collection, stack, queue and
probably more. Because you can have another PH
P array as a value, you can also quite easily sim
ulate trees. <?php
$arr = array("foo" =
> "bar", 12 =
> true);
echo $arr["foo"]; // bar echo $arr[12]; // 1 ?>
�
A key may be an integer or a string, a value can be of any type:
<?php $arr =
array(“anarray" => array(6 =
> 5, 13 =
> 9, "a" =
>
42)); echo $arr[“anarray"][6]; // 5 echo $arr[“anarray"][13]; // 9 echo $arr[“anarray"]["a"]; // 42 ?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
16
�You can also m
odify an existing array by explicitly setting values <?php $arr =
array(5 => 1, 12 =
> 2);
$arr[] = 56; // sam
e as $arr[13] = 56; at this point of the script
$arr["x"] = 42; // This adds a new
element w
ith key "x" unset($arr[5]); // This rem
oves the element from
the array unset($arr); // This deletes the w
hole array ?>
�
The array type in PHP is very versatile:
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
17
<?php
$colors = array('red', 'blue', 'green', 'yellow
');foreach ($colors as $color) { echo "D
o you like $color?\n"; } ?>
�
Arrays are ordered. You can also change the order using various sorting functions.
�array assignm
ent always involves value copying. You need to
use the reference operator to copy an array by reference. <?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed, // $arr1 is still array(2, 3)
$arr3 = &$arr1; $arr3[] =
4; // now $arr1 and $arr3 are the
same
?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
18
Classi ed Oggetti in PH
P�
Una c
lasse è
una collezione di variabili e funzioni che utilizzano queste variabili. U
na classe si definisce usando la seguente sintassi: <?php
class Cart { var $item
s; // Articoli nel carrello // Aggiunge $num
articoli di $artnr nel carrello function add_item
($artnr, $num) { $this->
items[$artnr] +
= $num
; } // Prende $num
articoli di $artnr e li rimuove dal carrello
function remove_item
($artnr, $num) { if ($this->
items[$artnr] >
$num)
{ $this->
items[$artnr] -=
$num; return true;
} elseif ($this->item
s[$artnr] == $num
) { unset($this->
items[$artnr]); return true;
} else { return false; } } } ?>
�Il codice definisce una classe chiam
ata Cart composta da un array
associativo che archivia gli articoli nel carrello e due funzioni per aggiungere e rim
uovere gli articoli dal carrello stesso.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
19
�Costru
ttore
(in PHP5, __construct, prim
a il nome è
quello della classe):class Cart { var $todays_date;var $nam
e; var $item
s = array("VCR", "TV");
function Cart() { $this->
todays_date = date("Y-m
-d"); $this->
name =
$GLO
BALS['firstname']; /* etc ... */ }
�Per creare una variabile oggetto si usa l'o
peratore new.
<?php $cart =
new Cart;
$cart->add_item
("10", 1); $another_cart =
new Cart;
$another_cart->add_item
("0815", 3); ?>
�Supporto per e
redita
rietà: una classe estesa o derivata ha tutte le
variabili e le funzioni della classe di base piùtutto ciò che viene
aggiunto dall'estensione. Una sottoclasse può ridefinire variabili e
funzioni di una classe madre. L'eredità
multipla non è
supportata. Le classi si estendono usando la parola chiave 'extends'.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Classi ed Oggetti in PH
P
20
<?php class A {
function A() { echo "Sono il costruttore di A.<br />
\n"; } function
B() {
echo "Sono
una norm
ale funzione
di nom
e B.<
br>\n";
echo "Non sono il costruttore di A.<
br>\n"; } }
class B extends A { } // This w
ill call B() as a constructor. $b = new
B; ?>�
La funzione B() della classe A si trasform
erà
improvvisamente
in un costru
ttore per la classe B, anche se questo non era
previsto. PHP 4 non si preoccupa infatti se la funzione è
stata definita nella classe B o se è
stata ereditata. �
A volte èutile riferirsi alle funzioni ed alle variabili di classi base o
riferirs
i alle fu
nzioni di classi senza istanziarle. L'operatore ::
èusato
per questi
scopi, ad
esempio
A::example()
invoca la
funzione example senza che esista alcuna istanza di A
�Esiste la parola chiave p
arent, equivalente di super in Java, e la
self, indicata anche con this nelle versioni precedenti la 5
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Classi ed Oggetti in PH
P
21
�E’
supportata la
seria
lizzazione;
Se si
utilizzano le
sessioni e
session_register()per
registrare oggetti,
questi oggetti
vengono serializzati autom
aticamente alla fine di ogni pagina PH
P e sonodeserializzate autom
aticamente su ogni pagina della sessione. Ciò
significa che gli oggetti possono mostrarsi in ogni pagina e che
sono parte integrante della sessione. �
Si suggerisce tuttavia vivamente di includere le definizioni delle
classi degli oggetti registrati su tutte le pagine, anche se le classi non
sono usate
su tutte
le pagine.
Se un
oggetto viene
deserializzato senza
la relativa
definizione della
classe, perderà
l'associazione ad essa e si trasformerà
in in un oggetto della classe stdClass senza nessuna funzione disponibile, diventando inutile.
�Le funzioni m
agiche __sleepe __w
akeupsono invocate la prim
a prim
a della serializzazione e la seconda dopo la deserializzazione, al fine
di potere
garantire consistenza
all’oggetto (ad
esempio
chiudendo e riaprendo le connessioni ai db eventualmente presenti)
�Esistono altre funzioni m
agiche, ad esempio __toString
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Classi ed Oggetti in PH
P
22
�La
visibilità
di classi
e attributi/m
etodi può
essere impostata
tramite
private, protected,
public, parole
chiave con
identico significato rispetto a Java
�Sono supportati m
etodi e variabili statiche
�PH
P 5 introduces abstra
ct classes and m
ethods. It is not allowed
to create an instance of a class that has been defined as abstract. Any class that contains at least one abstract m
ethod must also be
abstract. Methods defined as abstract sim
ply declare the method's
signature they cannot define the implem
entation. When inheriting
from an abstract class, all m
ethods marked abstract in the parent's
class declaration must be defined by the child; additionally, these
methods m
ust be defined with the sam
e (or weaker) visibility.
�Object in
terfa
ces allow
you to create code which specifies w
hich methods
a class
must
implem
ent, without
any implem
entation. Interfaces are defined using interface, all m
ethods declared in an interface
must
be public,
and to
implem
ent it,
the implem
ents operator is used. Classes m
ay implem
ent more than one interface if
desired by separating each interface with a com
ma.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Classi ed Oggetti in PH
P
23
�In PH
P 5, object comparisonuses tw
o comparison operator:
�(=
=), w
here two object instances are equal if they have the
same attributes and values, and are instances of the sam
e class.�(=
==),
identity operator,
implies
that object
variables are
identical if and only if they refer to the same instance of the
same class.
�PH
P 5
has an
exceptio
n model
similar
to that
of other
programming
languages. An
exception can
be throw
n, try
and caught w
ithin PHP. A Try block m
ust include at least one catch block.
Multiple
catch blocks
can be
used to
catch different
classtypes; execution
will
continue after
that last
catch block
defined in sequence. Exceptions can be thrown w
ithin catch blocks. �
When an exception is throw
n, code following the statem
ent will not
be executed and PHP w
ill attempt to find the first m
atching catch block. If an exception is not caught a PH
P Fatal Error will be issued
with an U
ncaught Exception message, unless there has been a
handler defined with set_exception_handler().
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Classi ed Oggetti in PH
P
24
�Oltre array ed oggetti, esistono due tip
i speciali:
�resource, che può rappresentare una risorsa, ovvero un file bzip2, un riferim
ento COM, un file pdf, un link ad un
database, uno stream ftp, un link ad un server PO
P o IM
AP, una connessione LDAP ecc.
�The special N
ULL value represents that a variable has no
value. �PH
P provides a large number of p
redefin
ed varia
bles
to any
script which
it runs.
Many
of these
variables, how
ever, cannot
be fully
documented
as they
are dependent upon w
hich server is running, the version and setup of the server, and other factors. Som
e of these variables w
ill not be available when PH
P is run on the com
mand line.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili in PHP
25
�$G
LOBALS
-Contains a reference to every variable w
hich is currently available w
ithin the global scope of the script. The keys of this array are the nam
es of the global variables. $GLO
BALS has existed since PHP 3.
�$_SER
VER-Variables set by the w
eb server or otherwise directly related
to the execution environment of the current script. Analogous to
the old $H
TTP_SERVER
_VARS array (still available, but deprecated).
�$_G
ET-Variables provided to the script via U
RL query string. Analogous
to the old $HTTP_G
ET_VARS array (deprecated).
�$_PO
ST-Variables provided to the script via H
TTP POST. Analogous to
the old $HTTP_PO
ST_VARS array (deprecated).
�$_CO
OKIE
-Variables provided to the script via H
TTP cookies. Analogous to the old $H
TTP_COOKIE_VAR
S array (deprecated). �
$_FILES-Variables provided to the script via H
TTP post file uploads. Analogous to the old $H
TTP_POST_FILES array (deprecated).
�$_EN
V-Variables provided to the script via the environm
ent. Analogousto the old $H
TTP_ENV_VAR
S array (deprecated). �
$_REQ
UEST
-Variables provided to the script via the G
ET, POST, and
COOKIE input m
echanisms, and w
hich therefore cannot be trusted. �
$_SESSION-Variables w
hich are currently registered to a script's session.Analogous to the old $H
TTP_SESSION_VAR
S array.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili predefinite in PHP
26
Scope variabili in PHP
�Le variabili possono essere lo
caliquando definite dentro una funzione o
classe, o globali:
<?php $a =
1; /* global scope */ function Test() { echo $a; /* reference to local scope variable */ } Test(); ?>
�This script w
ill not produce any output because the echo statement refers
to a local version of the $a variable, and it has no value within this scope.
<?php $a =
1; $b = 2;
function Sum() { global $a, $b; $b =
$a + $b; }
Sum();
echo $b; ?>�
The above script will output "3". By declaring $a and $b global w
ithin the function, all references to either variable w
ill refer to the global version.<?php $a =
1; $b = 2;
function Sum() { $G
LOBALS['b'] =
$GLO
BALS['a'] + $G
LOBALS['b']; }
Sum(); echo $b; ?>
�The $G
LOBALS array is an associative array w
ith the name of the global
variable being the key $GLO
BALS exists in any scope, this is because $G
LOBALS is a superglobal
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
27
Variabili esterne in PHP
�When a fo
rm is submitte
d to
a PHP scrip
t, the information from
that form
is automatically m
ade available to the script. There are many w
ays to access this inform
ation, for example:
<form
action="foo.php" m
ethod="post">
Nam
e: <input type=
"text" name=
"username" />
<br />
Em
ail: <input type=
"text" name=
"email" />
<br />
<input type=
"submit" nam
e="subm
it" value="Subm
it me!" />
</form
>
<?php // Available since PH
P 4.1.0 echo $_PO
ST['username'];
echo $_REQUEST['usernam
e']; import_request_variables('p', 'p_');
echo $p_username;
// Available since PHP 3. As of PH
P 5.0.0, these long predefined// variables can be disabled w
ith the register_long_arrays directive. echo $H
TTP_POST_VARS['usernam
e']; // Available if the PH
P directive register_globals = on.
As of // PHP 4.2.0 the default value of register_globals =
off. // U
sing/relying on this method is not preferred.
echo $username; ?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
28
�bool im
port_
request_varia
bles( string tipo [, string prefisso] )
�Im
posta la
visibilitàdelle
variabili GET/PO
ST/Cookie a
globale. Tram
ite il parametro tip
o, si può specificare quale variabile rendere
visibile. I valori ammessi sono i caratteri 'G
', 'P' e 'C' rispettivamente
per GET,
POST
e Cookie.
POST
include le
informazioni
dei file
caricati. Occorre
prestare attenzione
all'ordine delle
lettere, ad
esempio usando "gp", le variabili PO
ST sovrascrivono le variabili GET con il m
edesimo nom
e. Il parametro p
refissoviene utilizzato
come prefisso nel nom
e della variabile, ovvero viene anteposto ai nom
i di tutte le variabili portate a visibilitàglobale. Q
uindi, se si ha una
variabile GET
chiamata
"userid", e
si è
passato il prefisso
"pref_", si otterràuna variabile globale chiam
ata $pref_userid. �
Using a G
ET form is sim
ilar except you'll use the appropriate GET
predefined variable
instead. GET
also applies
to the
QUER
Y_STRING (the inform
ation after the '?' in a URL). So, for
example,
http://www.exam
ple.com/test.php?id=
3 contains
GET
data which is accessible w
ith $_GET['id'].
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili esterne in PHP
29
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili esterne in PHP
30
�Cookiesare a m
echanism for storing data in the rem
ote brow
ser and thus tracking or identifying return users. You can set cookies using the setcookie()
function. Cookies are part of the H
TTP header, so the SetCookie function must be called
before any output is sent to the browser. Cookie data is then
available in
the appropriate
cookie data
arrays, such
as $_CO
OKIE, $H
TTP_COOKIE_VAR
S as well as in $_R
EQUEST.
<?php
if (isset($_COOKIE['count'])) {
$count = $_CO
OKIE['count'] +
1; } else { $count =
1; } setcookie('count', $count, tim
e()+3600);
setcookie("Cart[$count]", $item, tim
e()+3600); ?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili esterne in PHP
31
Operatori del PH
P�
Oltre gli operatori standard, esistono operatori specifici:
�PH
P supporta
un operatore di contro
llo dell'e
rrore:
il carattere at (@
). Quando prefisso ad una espressione in PH
P, qualunque m
essaggio di errore che potesse essere generato da quella espressione sarà
ignorato. �
PHP supporta un o
peratore di e
secuzione: backticks (``).
Notare
che quelli
non sono
apostrofi! PH
P cercherà
di eseguire il contenuto dei backticks com
e comando di shell;
saràrestituito l'output. L'uso dell'operatore backtick è
identico alla funzione shell_exec().
�<?php $output =
`ls -al`; �
echo "<pre>
$output</pre>
"; ?>�
PHP ha un unico operatore di tipo: instanceof. instanceof è
utilizzato per determinare se un dato oggetto appartiene ad
una data classe di oggetti
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
32
Istruzioni in PHP
�Le s
truttu
re di c
ontro
lloin PH
P sono if, while, do-w
hile, for,
foreach, sw
itch, break,
continue, tutte
con la
stessa sintassi del C/Java
�L'istruzione re
quire()
include e valuta il file specifico. �require()
e include()
sono identiche in ogni senso eccetto per
come
esse trattano
gli errori.
include()produce
un Warning
mentre require()
restituisce un Fatal Error. In altre parole, usare require()
se volete che un file mancante ferm
i l'esecuzione della pagina. include()
non si comporta in questo
modo, lo script continuerà
nonostante tutto. �
L'istruzione require_once()include e valuta il file specificato
durante l'esecuzione dello script. Èun com
portamento sim
ile all'istruzione require(), con la sola differenza che se il codice di
un file
èstato
giàincluso,
esso non
saràincluso
nuovamente.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
33
Sicurezza in PHP
�A com
pletely secure system is a virtual im
possibility, so an approach
often used
in the
security profession
is one
of balancing risk and usability. If every variable subm
itted by a user required tw
o forms of biom
etric validation (such as a retinal scan and a fingerprint), you w
ould have an extremely
high level of accountability. It would also take half an hour to
fill out a fairly complex form
, which w
ould tend to encourage users to find w
ays of bypassing the security. �
The best security is often unobtrusive enough to suit the requirem
ents without
the user
being prevented
from
accomplishing their w
ork, or over-burdening the code author with excessive com
plexity. Indeed, some security attacks are
merely exploits of this kind of overly built security, w
hich tends to erode over tim
e.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
34
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�A
phrase worth
remem
bering: A system is only as good as the
weakest lin
k in
a chain.If all transactions are heavily logged based on
time, location, transaction type, etc. but the user is only verified based on
a single cookie, the validity of tying the users to the transaction log is severely w
eakened. �
When testing, keep in m
ind that you will not be able to test allpossibilities
for even
the sim
plest of
pages. The
input you
may
expect will
becom
pletely unrelated to the input given by a disgruntled employee, a
cracker with m
onths of time on their hands, or a housecat w
alking across the keyboard. This is w
hy it's best to look at the code from a logical
perspective, to discern where unexpected data can be introduced,
and then follow
how it is m
odified, reduced, or amplified.
�The Internet is filled w
ith people trying to make a nam
e for themselves by
breaking your code, crashing your site, posting inappropriate content, and otherw
ise making your day interesting. It doesn't m
atter if you have a sm
all or large site, you are a target by simply being online, by
having a server that can be connected to. M
any cracking programs do not discern
by size, they simply traw
l massive IP blocks looking for victim
s. Try not to becom
e one.
Sicurezza in PHP
35
Autenticazione HTTP in PH
P�
I meccanism
i di Autenticazione HTTP sono disponibili in PH
P soloquando
questo viene usato come un m
odulo di Apache. In uno script PHP m
odulo di Apache, è
possibile usare la funzione header()per inviare un m
essaggio di
"Authentication Required" al
browser
dell'utente, provocando quindi l'apertura
di una
finestra contenente
una richiesta
di Nom
e utente/Passw
ord. Una volta che l'utente ha com
pilato i campi nom
e utente e passw
ord, l'URL contenente lo script PH
P verràrichiam
ato nuovamente
usando le
variabili predefinite,
PHP_AU
TH_U
SER,
PHP_AU
TH_PW
e
AUTH
_TYPE impostate con, rispettivam
ente: nome, passw
ord e tipo di autenticazione. Q
ueste variabili predefinite possono essere trovate negli array $_SER
VERe $H
TTP_SERVER
_VARS.
<?php
if (!isset($_SERVER['PHP_AU
TH_U
SER'])) {header('W
WW-Authenticate: Basic realm
="Il m
io realm"');
header('HTTP/1.0 401 U
nauthorized'); echo 'M
essaggio da inviare se si preme il tasto Cancel';
exit; } else { echo "<
p>Ciao {$_SERVER['PH
P_AUTH
_USER']}.<
/p>";
echo "<p>
La password è
{$_SERVER['PHP_AU
TH_PW
']}.</p>
"; } ?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
36
Gestione connessione in PH
P�
Internamente il PH
P mantiene lo stato della connessione. Si hanno 3
possibili stati: �
0 -NORMAL
�1 -
ABORTED
�2 -
TIMEO
UT
�Quendo uno script PH
P viene eseguito normalm
ente si trova nello stato NORMAL. Se il client rem
oto si disconnette viene attivato il flag ABORTED
. La
disconnessione di
un client
remoto
ègeneralm
ente causata
dalla pressione del tasto STO
P da parte dell'utente. Se invece si raggiunge il lim
ite di tempo im
posto dal PHP con set_tim
e_limit()
lo stato èTIM
EOUT.
�Si può decidere se la disconnessione del client debba fare abortire lo script o m
eno. In certi casi èpiù
pratico lasciare finire lo script anche se non c'èpiù
il browser rem
oto a ricevere i dati. Tuttavia il comportam
ento di default è
di fare abortire lo script quando il client remoto si disconnette.
Questo com
portamento può essere im
postato tramite la direttiva di php.ini
ignore_user_abort oppure tramite la corrispondente direttiva "php_value
ignore_user_abort" del
file .conf
di Apache
oppure con
la funzione
ignore_user_abort().
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
37
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Gestione connessione in PH
P
�Se
non si
segnala al
PHP
di ignorare
la disconnessione
dell'utente lo script saràinterrotto. U
nica eccezione si ha con la
registrazione di
una funzione
di chiusura
utilizzando register_shutdow
n_function(). Con una funzione di shutdown,
quando l'utente remoto prem
e il bottone di STOP, alla prim
a occasione in cui lo script tenterà
di produrre un output, il PHP
intercetteràche la connessione è
interrotta e richiamerà
la funzione di shutdow
n. Questa funzione sarà
richiamata anche
al normale term
ine dello script, pertanto per eseguire passi differenti in caso di disconnessione del client occorre utilizzare la funzione connection_aborted(). Q
uesta funzione restituisce TR
UE se la connessione è
stata interrotta.
38
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Gestione connessione in PH
P
�Uno script può essere ferm
ato dal timer incorporato nel PH
P. Per default il tim
eout èimpostato a 30 secondi. Tale lim
ite può essere variato agendo sulla direttiva m
ax_execution_time
nel php.ini
o nel
corrispondente param
etro php_value
max_execution_tim
e nella configurazione di Apache, oppure con la funzione set_tim
e_limit(). Q
uando termina il tem
po impostato lo script viene interrotto, se è
stata prevista una funzione di shutdow
n, questa verràeseguita. All'interno di
questa funzione si può discriminare se è
stata attivata per lo scadere
del tim
eout utilizzando
la funzione
connection_timeout(). Q
uesta restituisce 2 se la funzione di shutdow
n è
stata chiam
ata per
lo scadere
del tem
po a
disposizione.
39
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Gestione connessione in PH
P
�Un aspetto che occorre notare sui stati ABO
RTED
e TIMEO
UT
èche
possono essere
attivi contem
poraneamente.
Questo
può accadere
se si
èimpostato
il PH
P affinchè
ignori le
interruzioni da
parte dell'utente.
Infatti il PH
P continua
a tenere
traccia della
disconnessione dell'utente,
ma,
semplicem
ente, non viene interrotto lo script. Quindi, quando
termina il tem
po, lo script saràinterrotto e verrà
richiamata la
funzione di shutdown, se presente. In questa situazione si
avràche connection_status()
restituirà3.
40
File in PHP
�Per
Aprire un
File in
PHP
si utilizza
la fopen("nom
e_file","modalità"); le m
odalitàsono a=
apre il file in append, a+
=append e lettura, se il file non c’è
ne verràcreato
uno nuovo,
r=lettura,
r+=lettura
e scrittura
w=scrittura, sovrascrive eventuali dati esistenti, w
+=lettura e
scrittura con sovrascrittura�
E' importante verificare se un file è
stato aperto con un if:<?php
if(@!$file=
fopen("nomi.txt","r")){
echo "non posso aprire il file";exit;}?>
�Se
non si
può aprire
sul brow
ser si
vedràun
messaggio
d'errore. Per disabilitare i messaggi d'errore basta m
ettere all'inizio della stringa il carattere @
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
41
�Operazioni sui file:
�chiudere: fclose($file);
�scrivere:
fputs($file,"testo");(il file deve essere aperto)
�leggere: fgets($file,Byte da leggere);
(il file deve essere aperto)�
Quando si scrive la fine della stringa è
bene forzare a capo con \n, e per leggere una riga di file i byte sono 255
�Esempio di scrittu
ra su file
:<?php
$linea1="E questa è
la fine del file... per ora\n";if (!$p_file =
fopen("miofile.txt","w
")) {echo "Spiacente, non posso aprire m
iofile.txt";exit;}fputs($p_file,"Ecco il file appena creato!\n");fputs($p_file,$linea1);fclose($p_file);?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
File in PHP
42
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�Esempio di le
ttura del file
:<?php
if (!$p_file = fopen("m
iofile.txt","r")) {echo "Spiacente, non posso aprire m
iofile.txt";exit;}$linea=
(fgets($p_file,255));$linea2=
(fgets($p_file,255));echo "$linea<
BR>";
echo "$linea2<BR>
";fclose($p_file);?>
�Il risultato sarà:Ecco il file appena creato!E questa la fine del file...per ora
File in PHP
43
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�Esempio di append:
<?php
$inserisci_linea="\nRiga aggiunta";
if (!$p_file = fopen("/tm
p/miofile.txt","a")) {
echo "Spiacente, non posso aprire miofile.txt";
} else {fputs($p_file,$inserisci_linea);fclose($p_file);}?>
�I contenuti del file ora saranno:Ecco il file appena creato!E questa la fine del file...per oraRiga aggiunta
File in PHP
44
�Quando si hanno file è
buona cura proteggerli in modo da lim
itare l'accesso. Si usa la funzione flo
ck($puntatore_file, m
etodo), dove 1 oppure LO
CK_SH
condivide il file in modo che si può leggere m
a non
scrivere, 2
oppure LO
CK_EX fa
in modo
che nessun
altro utente può leggere o scrivere il file fino a quando il blocco non verrà
rilasciato, 3 oppure LOCK_U
N rilascia qualunque operazione
prima im
postata<?php
if (!$p_file = fopen("m
iofile2.txt","w")) {
echo "Spiacente, non posso aprire il file miofile2.txt";
exit;}flock($p_file,2);fputs($p_file,"Sto scrivendo su questo file\n");flock($p_file,3);fclose($p_file);?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
File in PHP
45
�Fare una ric
erca su un file
<?php
$ricerca=“stringa_da_cercare";
if (!$p_file = fopen("utenti.txt","r")) {
echo "Spiacente, non posso aprire il file utenti.txt";} else {while(!feof($p_file))
{$linea = fgets($p_file, 255);
$linea=(trim
($linea));if ( $linea =
= $ricerca )
echo "Trovato! $linea<BR>
";}fclose($p_file);}?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
File in PHP
46
�Altre funzioni utili per la gestione dei file:
�Ottenere le D
imensioni di un file
�Sintassi :
filesize(nome_file);
�Controllare se un file è
una cartella�
Sintassi :is_dir(nom
e_file);�
Controllare se un file èordinario
�Sintassi :
is_file(nome_file);
�Controllare se un file è
eseguibile�
Sintassi :is_executable(nom
e_file);�
Controllare se un file èleggibile
�Sintassi :
is_readble(nome_file);
�Controllare se un file è
scrivibile�
Sintassi :is_w
riteable(nome_file);
�Ottenere il tipo di file
�Sintassi :
filetype(nome_file);
�Se è
una cartella restituisce dir, se èun file restituisce file
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
File in PHP
47
�Esistono
funzioni per
le cartelle,
come
chdir(nome), opendir(nom
e), e readdir(nom
e). �
Esempio di le
ttura carte
lla:
�<HTM
L><BO
DY>
�<TABLE W
IDTH
=40%
ALIGN=CEN
TER BO
RDER
=3>
�<TR
><TH
>ELEN
CO DEI FILE<
/TH></TR
>�
<?php
�$cartella =
opendir('.');�
#creiam
o un ciclo che legga i contenuti e li metta nell'array
�while ($file =
readdir($cartella)) {$file_array[] =
$file;}
�foreach ($file_array as $file) {
�#tutti tranne quelli che iniziano per "." o per ".."
�if ( $file =
= ".." || $file =
= ".") {
continue;}
�#ogni elem
ento dell'array linkato al proprio nome
�echo "<
TR><TD
><CEN
TER>";
�echo "<
a href=\"$file\">
$file</a>
";�
echo "</CEN
TER></TD
></TR
>";}
�?>
�</TABLE>
</BO
DY>
</HTM
L>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
File in PHP
48
Form in PH
P�
Una form
è
una pagina web, realizzata in H
TML tram
ite il tag <form
>, tag che perm
ette alla pagina di diventare interattiva, ossia di contenere elem
enti (caselle di testo, di spunta o bottoni) ilcui
stato può essere comunicato ad un codice che lo elabora.
�Il
codice, specificato
come
attributo del
form, può
essere di
qualsiasi natura, nel nostro caso un file php (ma poteva essere un
cgi, asp, ecc)�
lo stato degli elementi di interattività
può essere comunicato in due
modi: G
ET e POST. N
el GET i valori sono passati insiem
e nella stringa dell’U
RL, nel PO
ST i valori sono passati separatamente e
quindi non sono immediatam
ente visibili. �
Notare
che il recupero
di dati
passati da
una form
è
possibile richiam
ando direttam
ente il
nome
della variabile
(con $nom
e) solam
ente se in php.ini la variabile register_globals èimpostata a
on cosa
che norm
almente
non è.
In caso
register_globals sia
impostato
a off
il recupero
èpossibile
solamente
nella form
a $_PO
ST[nome_variabile] o $_G
ET[nome_variabile]
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
49
�Esem
pio di form con diversi elem
enti di interattività:<htm
l><body>
<form
method=
get action="visualizza.php">
<center>
Inserisci il
tuo nom
e:<input
type="text"
name=
"nome"
size="30">
<br>
Inserisci cognom
e:<input
type="text"
name
="cognom
e" size=
"30"><br>
Inserisci la
tua e-m
ail:<input
type="text"
name
="em
ail" size=
"30"><br>
<br>
<br>
<br>
Scegli quale sezione vorresti che ci fosse nel sito:<br>
<input type=
"checkbox" name=
"sport" value="sport">
sport<input type=
"checkbox" name=
"cinema" value=
"cinema">
cinema
<input type=
"checkbox" name=
“donne" value=“donne">
donne<input
type="checkbox"
name=
"forum"
value="forum
" checked>
forum<br>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
50
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�…continua<br>
Scegli la connessione che usi<br>
<input type=
"radio" name=
"linea" value="56k" checked>
56k<input type=
"radio" name=
"linea" value="isdn">
isdn<input type=
"radio" name=
"linea" value="adsl">
adsl<input type=
"radio" name=
"linea" value="56k">
fastweb<
br><br>
Inserisci ora i tuoi commenti<
br><textarea nam
e="com
menti" row
s="7" cols=
"70"></textarea>
<br>
<br>
<br>
<input type=
"submit" value=
"invia i dati"><input type=
"reset" value="cancella">
</form
><hr>
</body>
</htm
l>
Form in PH
P
51
�Il risultato è
il seguente:
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
52
�Il m
etodo getimpostato nella form
prevede che i nomi ed i
valori da
associare siano
posti direttam
ente sul
link che
richiama la pagina.
La sintassi è: <a href=
"nome_pagina.php?nom
e=valore>
�
Se si vogliono inserire piùnom
i e valori, occorre & fra le
coppie di parametri, ad esem
pio:�
<a href=
"nome_pagina.php?nom
e=valore&
nome2=
valore2>�
eventuali spazi
nei valori
sono convertiti
in %20
o nel
carattere +�
Dopo aver inserito questa riga (che per convenzione si chiam
a query string) abbiam
o a disposizione un array di nome $_G
ET che contiene tutti i param
etri che abbiamo inserito nella query
string ed èvisibile anche dalla nuova pagina.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
53
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�Per chiarire, supponiam
o per esempio di scrivere una riga
come questa:
�<a href=
“index.php?ciao=2&
ciao2=4”>
�Quando il codice arriva al server abbiam
o a disposizione le variabili:
�$ciao=
2; $ciao2=4;
�E le possiam
o usare per generare la pagina index.php che vedrà
l'utente sul suo browser.
�Se
per motivi
di sicurezza
il server
ha impostato
register_globals su OFF non possiam
o usare direttamente le
variabili (con
il loro
nome)
se non
dopo averle
ricavate dall'array
$_GET
nel seguente
modo
(nella pagina
di destinazione,
nel nostro
esempio
index.php): $ciao=
$_GET['ciao']; $ciao2=
$_GET['ciao2'];
�Adesso possiam
o usare le due variabili $ciao=2 e $ciao2=
4
Form in PH
P
54
�Tornando
alla form
, il
codice di
visualizza.php (lato
“server”) potrebbe essere:<htm
l><body>
<center>
Riepilogo</center>
<?php
echo "Ciao <b>
$nome $cognom
e</b>
<br>
";echo "Q
uesta e la tua email <
b>$em
ail</b>
<br>
";echo
"<br>
Sezioni
che vorresti(puoi
anche non
sceglierne):<br>
"; echo "<
b>$sport $cinem
a $donne $forum</b>
<br>
";echo"<
br>
Tu navighi
con la
seguente connessione
:<b>
$linea</b>
<br>
";echo
"<br>
ecco i
tuoi com
menti:<
br><b>
$commenti<
/b>";
?></body>
</htm
l>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
55
�Una versione più
completa potrebbe essere:
<HTM
L><BO
DY>
<?php
$errore=false;
if ( ($nome =
= "") || ($cognom
e == "") || ($em
ail == "")) {
$errore=true;
echo "<
BR>Spiacente,
devi com
pilare tutti
i cam
pi<br>
";} else {
echo "Ciao $nome $cognom
e<br>
, la tua email è: $em
ail<br>
";}$pattern=
"^[^@ ]+
@[^@ ]+
\.[^@ \.]+
$";if (!ereg($pattern,$em
ail)) {echo "<
b>\"$em
ail\"</b>
non e un email valida";
}else{echo "Q
uesta e la tua email <
b>$em
ail</b>
<br>
";} if ( $errore) {echo
"<BR>
campi
incompleti,
devi tornare
al <A
HREF=
\"modulo.php\">
modulo<
/A> ";}
?></BO
DY>
</HTM
L>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
56
�I form
possono puntare anche a se stessi invece che puntare ad un'altra pagina: <HTM
L><BO
DY>
<CEN
TER><?php
echo "<
FORM
METH
OD=PO
ST ACTIO
N=\"$PH
P_SELF\">";
?><INPU
T TYPE="SU
BMIT" VALU
E="Invia le inform
azioni!"><INPU
T TYPE="RESET" VALU
E="Cancella!">
</FO
RM>
</BO
DY>
</HTM
L>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
57
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P�
Come usare però al m
eglio il PHP_SELF?. Possiam
o creare una pagina con un if. Cioè
se il contenuto di una variabile èvuoto allora m
ostra il form
altrimenti m
ostra un'altra cosa.<HTM
L><BO
DY>
<?php
if ( (empty($nom
e)) || (empty($cognom
e))) {# esegue questa parte perché
il form non è
stato ancora inviatoecho "<
FORM
METH
OD=PO
ST ACTION=\"$PH
P_SELF\">";
echo “Nom
e? <BR>
<INPU
T TYPE=\"TEXT\" N
AME=
\"nome\">
";echo "Cognom
e? <BR>
<INPU
T TYPE=\"TEXT\" N
AME=
\"cognome\">
";echo
"<BR>
<BR>
<INPU
T TYPE=
\"SUBM
IT\" NAM
E=\"subm
it\" VALU
E=\"Invia le inform
azioni!\">";
echo "<INPU
T TYPE=\"RESET\" VALU
E=\"Cancella!\">
";echo "<
/FORM
>";
} else {# il form
èstato inviato
echo "elaborazione...<BR>
";echo "Le inform
azioni sono... nome: $nom
e , cognome: $cognom
e";}?>
</BO
DY>
</HTM
L>�
Quindi se la variabile nom
e o cognome sono vuote m
ostra il form
58
�Per verificare che un form
èstato inviato si può anche usare un cam
po nascosto, com
e indicato nell’esempio seguente:
<HTM
L><BO
DY>
<?php
# m
etto tutto il form in una variabile
$form="<
FORM
METH
OD=\"G
ET\" ACTION=\"$PH
P_SELF\"><CEN
TER><B>
<H3>
Nuovo utente <
/H3>
</B>
</CEN
TER>Nom
e utente<BR>
<INPU
T TYPE=\"TEXT\" N
AME=
\"nome\" VALU
E=\"$nom
e\"><BR>
Indirizzo<BR>
<INPU
T TYPE=\"TEXT\" N
AME=
\"indirizzo\" VALUE=
\"$indirizzo\"><BR>
<BR>
# ecco il cam
po nascosto<INPU
T TYPE=\"H
IDDEN
\" NAM
E=\"stato\" VALU
E=\"inviato\">
<INPU
T TYPE=\"SU
BMIT\" N
AME=
\"submit\" VALU
E=\"Invia \">
<INPU
T TYPE=\"RESET\" VALU
E=\"Cancella!\">
</FO
RM>";
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
59
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P# inizio a controllare
$errore_nome=
0;$errore_indirizzo=
0;# il form
èstato inviato?
# se il cam
po nascosto non c'e mostra il form
if($stato!="inviato"){
echo "$form";
#ma se c'e controlli l'input
} else {if (em
pty($nome)) {
echo "<B>
Errore:</B>
Manca nom
e <BR>
"; $errore_nome=
1; }if (em
pty($indirizzo)) {echo "<
B>Errore:<
/B> Manca l'indirizzo <
BR>";$errore_indirizzo=
1; }if (($errore_nom
e) || ($errore_indirizzo)) {echo "$form
";} else {echo "elaborazione...<
BR>";
echo "<
B>$nom
e</B>
con
indirizzo <B>
$indirizzo</B>
è
stato aggiunto";
}}?></BO
DY>
</HTM
L>
60
�Si
possono realizzare
form a
piùpagine
con passaggi
di inform
azioni nei campi nascosti, ad esem
pio il primo form
chiedenom
e e indirizzo, il secondo chiede altre info e nasconde nome e
indirizzo e il terzo visualizza tutti i dati: <HTM
L><BO
DY>
<FO
RM METH
OD=GET ACTIO
N="due.php">
<HR>
<B>
Qual è
il tuo nome com
pleto?</B>
<BR>
<INPU
T TYPE="text"
NAM
E="nom
e" SIZE=20>
<BR>
<BR>
<B>
Qual è
il tuo indirizzo email?<
/B><BR>
<INPU
T TYPE="text"
NAM
E="em
ail" SIZE=20>
<BR>
<BR>
<B>
Qual
èil
tuo num
ero di
telefono?</B>
<BR>
<INPU
T TYPE=
"text" NAM
E="telefono" SIZE=
20><BR>
<BR>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
61
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
�…continua…
<B>
Come desideri effettuare il pagam
ento?</B>
<BR>
<SELECT N
AME=
"pagamento" >
<OPTIO
N SELECTED
>Carta di Credito
<OPTIO
N>Assegno
<OPTIO
N>Bonifico Bancario
<OPTIO
N>Contanti
</SELECT>
<HR>
<INPU
T TYPE="subm
it" VALUE=
"Pagina seguente"><INPU
T TYPE="reset" VALU
E="Cancella!">
</FO
RM>
</BO
DY>
</HTM
L>
62
�La seconda form
riceve i campi della prim
a sull’URL con il m
etodo GET, e li
propaga alla terza form tram
ite campi nascosti, cosi’
saranno insieme ai
campi non nascosti di questa seconda form
(quelli relativi alle informazioni
aggiuntive), tutti propagati con GET :
<HTM
L><BO
DY>
<CEN
TER><H2>
Seleziona le
opzioni di
consegna</H2>
</CEN
TER><FO
RM METH
OD=GET ACTIO
N="tre.php">
<B>
Tipo di servizio:</B>
<BR>
<SELECT N
AME=
"tipo_consegna" ><OPTIO
N SELECTED
>Gold Star
<OPTIO
N>Silver Star
<OPTIO
N>Piccione viaggiatore
</SELECT>
<BR>
<BR>
<B>
Giorno di ritiro del plico:<
/B><BR>
<SELECT N
AME=
"giorno"><OPTIO
N SELECTED
>Lunedì
<OPTIO
N>Martedì<
OPTIO
N>Mercoledì<
OPTIO
N>Giovedì
</SELECT>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
63
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
�…continua…
<?php
# innanzitutto codifica i tre valori nascosti
$nome=
(urlencode($nome));
$email=
(urlencode($email));
$telefono=(urlencode($telefono));
# ecco i cam
pi nascosti all'interno del formecho
"<INPU
T TYPE=
\"HIDDEN
\" NAM
E=\"nom
e\" value=
$nome>
";echo
"<INPU
T TYPE=
\"HIDDEN
\" NAM
E=\"em
ail\" value=
$email>
";echo "<
INPU
T TYPE=\"H
IDDEN
\" NAM
E=\"telefono\" value=
$telefono>";
echo "<
INPU
T TYPE=
\"HIDDEN
\" NAM
E=\"pagam
ento\" value=
$pagamento>
";?><HR>
<INPU
T TYPE="subm
it" VALUE=
"Pagina seguente"><INPU
T TYPE="reset" VALU
E="Cancella!">
</FO
RM></BO
DY>
</HTM
L>
64
�infine la terza form
riceve e stampa tutto:
<HTM
L><BO
DY>
<H2>
Consegne Spa ti ringrazia</B>
<TABLE BO
RDER=
6 WIDTH
=60%
COLS=
1><TR>
<TH
>Ecco le inform
azioni da te indicate</TH
></TR>
<TR>
<TD
><?php
$nome=
(urldecode($nome));
$email=
(urldecode($email));
$telefono=(urldecode($telefono));
echo "Il tuo nome è: <
B>$nom
e</B>
<BR>
";echo "Il tuo indirizzo em
ail è: <B>
$email<
/B><BR>
";echo "Il tuo num
ero di telefono è: <B>
$telefono</B>
<BR>
";echo "Il m
etodo di pagamento è: <
B>$pagam
ento</B>
<BR>
";echo "Il tipo di servizio selezionato è: <
B>$tipo_consegna<
/B><BR>
";echo "Ritirerem
o il plico di: <B>
$giorno</B>
<BR>
";echo "Il peso del plico è: <
B>$peso<
/B><BR>
";?></TD
></TR>
</TABLE>
</BO
DY>
</HTM
L>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Form in PH
P
65
�I Cookie sono il m
etodo piùcom
une per la mem
orizzazione dello stato nel web. Il cookie è
un piccolo file che contiene alcune informazioni e viene
mem
orizzato nella mem
oria del browser o sul disco. Per inviare cookie
devono essere attivati dal browser del client. Q
uando si invia un cookie lo possiam
o leggere solo quando l'utente torna sul sito. I cookie devono essere em
essi prima di qualsiasi codice php o htm
l. Questi non devono
superare le dimensioni di 4 Kb. I cookie possono contenere fino a sei
componenti: N
ome, Valore, Scadenza, Percorso, D
ominio, Sicurezza.
�La sintassi per em
ettere un cookie è:setcookie(nom
e, valore, tempo, percorso, dom
inio, sicurezza).<?phpsetcookie ("test_cookie","niente di particolare",tim
e()+43200,"/");
# cookie.php
echo "<HTM
L>";
echo "<BO
DY>
";if (isset($test_cookie)){echo "Ciao cookie, i tuoi contenuti sono: $test_cookie";} else {echo "N
on ho trovato alcun cookie con il nome test_cookie";
}echo "<
/BODY>
";echo "<
/HTM
L>";
?>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Cookie in PHP
66
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Cookie in PHP
�Per elim
inare un cookie possiamo fare in due m
odi:setcookie ("nom
e del cookie");oppure m
ettere un tempo di scadenza negativo
setcookie ( "nome","","tim
e()-43200,"/");�
Possiamo vedere tutti i cookie che corrispondono al nostro sito tram
ite la variabile $H
TTP_COOKIE_VAR
S["nome"];
�I cookie si possono usare ad esem
pio per personalizzare la pagina:<?php
#se c'e allora ciao
if (isset($nome)){
echo "Ciao $nome";
}else{#altrim
entiecho
"Non
ti conosco
:<a
href=\"inserisci.php\">
Inserisci il
tuo nom
e</a>
";}?>
67
Cookie in PHP
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Ecco la pagina dove si inserisce il nome:
<htm
l><body bgcolor=
"blue"><br>
<br>
<br>
<br>
<center>
<form
method=
get action="cookie2.php">
<input type=
"text" name=
"nome1">
<input type=
"submit" value=
"invia"></form
></body>
</htm
l>
Ecco la pagina che imposta il cookie (chiam
ata cookie2.php):
<?php
setcookie ("nome",$nom
e1,time()+
2592000,"/");echo "cookie im
postato <a href=
\"cookie1.php\"> VERIFICA<
/a>";
?>
68
Sessioni in PHP
�La sessione è
un supporto offerto dal PHP per perm
ettere di preservare
dei dati
fra più
pagine web,
perchéesse
costituiscono un
unico collegam
ento logico
(sessione, appunto) effettuato da un utente/client. Il supporto si rende indispensabile perché
il protocollo HTTP è
stateless, ossia non conserva inform
azioni sullo stato precedente, per cui passare da
una pagina
ad un’altra,
a livello di H
TTP, implica una
connessione nuova ogni volta.�
Il supporto
delle sessioni
permette
di registrare
numeri
arbitrari di variabili che vengono preservate secondo richiesta.Quando
un visitatore
accede al
sito, PH
P controllerà
automaticam
ente (se session.auto_start èsettato a 1) o su
richiesta (esplicitam
ente tram
ite session_start()
o implicitam
ente tramite session_register()) se uno specifico id
di sessione sia stato inviato con la richiesta. In questo caso, il precedente am
biente salvato viene ricreato.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
69
�Ci sono due m
etodi per propagare l'id di sessione: �
I Cookies �
Un param
etro dell'URL
�Il
modulo
di sessione
supporta entram
bi i metodi.
I cookies sono ottim
i, ma dal m
omento che possono non
essere a
disposizione (i
clients non
sono costretti
ad accettarli ), non possiam
o dipendere da questi. Il secondo metodo incorpora l'id di sessione direttam
ente negli URL,
cosa che
rende visibile
l’id (eventuale
problema
di sicurezza).
�La soluzione com
unemente adottata è
di propagare l’id sull’U
RL, garantendo l’indipendenza dal cookie, e operare
all’interno di
HTTPS,
protocollo sicuro
perchécripta
la com
unicazione
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
70
�La configurazione di track_vars
e register_globalsinfluenza com
e le variabili di sessione vengono m
emorizzate una e più
volte. �
Se track_vars
èattiv
a e re
gister_globalsnon è
attiv
a, solo i mem
bri dell'array
associativo globale
$HTTP_SESSIO
N_VAR
S possono essere registrati com
e variabili di sessione. Le variabili di sessione
ripristinate saranno
disponibili nell'array
$HTTP_SESSIO
N_VAR
S. �
Esempio: R
egistrare una variabile con track_varsattiva
<?php if (isset($H
TTP_SESSION_VARS['count'])) {
$HTTP_SESSIO
N_VARS['count']+
+; } else {
$HTTP_SESSIO
N_VARS['count'] =
0; } ?>�
L'uso di $_SESSION (o $H
TTP_SESSION_VAR
S con PHP 4.0.6 o
precedente) èraccom
andato per sicurezza e leggibilitàdel codice.
�Con $_SESSIO
N o $H
TTP_SESSION_VAR
S, non si devono usare le funzioni
session_register(), session_unregister(),
e session_is_registered(). G
li utenti devono accedere alla variabile di sessione com
e a una variabile normale.
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
71
Sessioni in PHP
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�Se re
gister_globalsèattiv
a, allora tutte le variabili globali possono
essere registrate
come
variabili di
sessione e
le variabili
di sessione
saranno ripristinate
in corrispondenza
delle variabili globali. Dal m
omento che PH
P ha bisogno di sapere quali variabili globali sono registrate com
e variabili disessione
, gli
utenti devono
registrare le
variabili con
la funzione session_register()
�Esem
pio: Registrare una variabile con register_globals
attiva <?php
if (!session_is_registered('count')) {session_register("count"); $count =
0; } else { $count+
+; } ?>
72
Sessioni in PHP
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�L'esem
pio seguente
dimostra
come
registrare una
variabile e
come
collegare una pagina all'altra correttamente usando la variabile
predefinita SID
per l’id di sessione. Esem
pio: Contare il numero di accessi di un singolo utente
<?php
if (!session_is_registered('count')) { session_register('count'); $count =
1; } else { $count+
+; } ?>
Salve visitatore , hai visitato questa pagina <?php echo $count; ?>
volte.<p>
; <!--
<?php echo SID
?> è
necessario per preservare l'id di sessione nel caso in cui l'utente abbia disattivato i cookies ?-->
Per continuare, <A H
REF="nextpage.php?<
?php echo SID?>
">clicca qui<
/A>�
Gli U
RL non relativi si presum
e che puntino a siti esterni e quindi non hanno il SID
, perchèsarebbe rischioso per la sicurezza propagare il SID
a un altro server.
73
�Funzioni e codici da usare nel caso che register_globals
sia attiva :�
session_start(); Funzione che apre una sessione.�
session_destroy(); Funzione che distrugge una sessione.�
session_register("..."); Salva una variabile nella sessione. (Siscrive
solo il nome senza $. Il valore della variabile va inserito nel codice
sottostante, in pratica la macchina lo salva da sola.)
�session_unset(); D
istrugge le variabile nella sessione.�
$PHPSESSID
Il nome della variabile globale che contiene il codice
univoco di 32 caratteri che distingue la sessione. (Se scriviamoecho
$PHPSESSID
; scriviamo 32 caratteri a a video se la sessione è
attiva.)�
Se per motivi di protezione non è
possibile utilizzare direttamente la
variabile $PHPSESSID
èpossibile inserire la funzione session_id();
esempio $PH
PSESSID=session_id();
�a seconda della versione del PH
P, viene usata $SID o SPH
PSESSID
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
74
�Solitam
ente una connessione si apre così:<?
session_start();//Apriamo la sessione
session_register("nomevariabile");//Salviam
o una
variabile nella sessione
...//Calcoli con la sessione...session_register("nom
evariabile2");//Salviamo
una variabile
nella sessione$nom
evariabile=...;//D
efiniamo la variabile
$nomevariabile2=
...;//Definiam
o la variabile2...//Calcoli con la sessione...?>
�Il codice per aprire una sessione va inserito prim
a del codice HTM
L (prima del tag <
HTM
L>).
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
75
�Nel
caso si
voglia distruggere
una sessione
e riaprirne
un'altra, magari
perchèalcuni
dati non
influenzino la pagina corrente si può scrivere così:<?
session_start();//Distruggo
la vecchia
sessionesession_unset();session_destroy();session_start();//Apro
una nuova
sessione...
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
76
�Esem
pio di
form con
sessioni: il
primo
(ss1.php) crea
una sessione e registra il nom
e e il dipartimento, il secondo (ss2.php)
registra indirizzo e numero di telefono e il terzo (ss3.php) m
ostra le inform
azioni e le manda per em
ail<?php
# ss1.php
session_start();$num
_impiegato =
session_id();session_register("nom
e","dipartimento"); ?>
<HTM
L><BO
DY>
<?php
$form="<
CENTER>
<H2>
Nuovo Im
piegato</H2>
</CEN
TER><FO
RM ACTIO
N=\"ss2.php\" M
ETHOD=\"PO
ST\"><B>
Nom
e impiegato:<
/B><BR>
<INPU
T TYPE=\"text\" N
AME=
\"nome\" SIZE=
20><BR>
<B>
Dipartim
ento</B>
<BR>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
77
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
<SELECT N
AME=
\"dipartimento\" >
<OPTIO
N SELECTED
>Autista consegne
<OPTIO
N>Magazzino
<OPTIO
N>Vendite
<OPTIO
N>Am
ministrazione
</SELECT>
<BR>
<INPU
T TYPE=\"subm
it\" VALUE=
\"Pagina seguente\"><INPU
T TYPE=\"reset\" VALU
E=\"Cancella!\">
</FO
RM>";
?></BO
DY>
</HTM
L><?php
echo $form;
?>
78
ss2.php<?php
session_start();session_register("indirizzo","telefono"); ?><HTM
L><BO
DY>
<?php
$form="<
CENTER>
<H2>
Nuovo Im
piegato</H2>
</CEN
TER><FO
RM ACTIO
N=\"ss3.php\" M
ETHOD=\"PO
ST\"><B>
Indirizzo impiegato:<
/B><BR>
<INPU
T TYPE=\"text\" N
AME=
\"indirizzo\" SIZE=30>
<BR>
<BR>
<B>
Num
ero telefono impiegato:<
/B><BR>
<INPU
T TYPE=\"text\" N
AME=
\"telefono\" SIZE=30>
<BR>
<HR>
<INPU
T TYPE=\"subm
it\" VALUE=
\"Pagina seguente\"><INPU
T TYPE=\"reset\" VALU
E=\"Cancella!\">
</FO
RM>";?>
</BO
DY>
</HTM
L><?php
echo "$form";
?> A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
79
ss3.php<?php
session_start();?>
<HTM
L><BO
DY>
<CEN
TER><H3>
informazioni sul nuovo im
piegato</H3>
</CEN
TER><?php
$visualizza="<
PRE>
Nom
e impiegato: $nom
e<BR>
Dipartim
ento: $dipartimento<
BR>Livello retributivo: $stipendio<
BR>Sede: $sede<
BR>Indirizzo casa: $indirizzo<
BR>Telefono: $telefono<
BR>ID im
piegato: $num_im
piegato<BR>
</PRE>
";?></body>
</htm
l>
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
80
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Sessioni in PHP
ss3.php continuo<?echo "$visualizza";
$destinatario="vostraem
$header="Inserim
ento nuovo impiegato";
$info="Ecco le inform
azioni...NOME: $nom
eDIPARTIM
ENTO
: $dipartimento
LIVELLO RETRIBU
TIVO: $stipendio
INDIRIZZO
CASA: $indirizzoNUM TELEFO
NO: $telefono
ID IM
PIEGATO
: $num_im
piegato";mail($destinatario,$header,$info);
session_destroy();?>
81
�Le
principali variabili
predefinite secondo
il protocollo
CGI
(Common G
ateway Interface) sono:
�Inform
azioni del server
�SER
VER_SO
FTWAR
E, il server�
SERVER
_NAM
E, nome del server
�SCR
IPT_FILENAM
E, percorso e nome dello script
�SCR
IPT_NAME, nom
e dello script�
Inform
azioni del Client
�REM
OTE_H
OST, nom
e del computer (ad esem
pio, dell’ISP)�
REM
OTE_U
SER, nom
e dell'utente (se èpresente l’autenticazione)
�REQ
UEST_M
ETHOD, get o post
�REM
OTE_A
DDR, indirizzo del brow
ser che fa la richiesta�
Inform
azioni passate dal client a
l server
�QUER
Y_STRING, è
la parte dell'url dopo il punto interrogativo�
CONTEN
T_LENGTH
, lunghezza dei dati inviati�
HTTP_U
SER_AG
ENT, nom
e del browser e sistem
a operativo
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili predefinite in PHP
82
�Altre
(utili) v
aria
bili p
redefin
ite di php
�HTTP_AU
TH_U
SER, nom
e dell'utente(se c'e autenticazione)�
HTTP_AU
TH_PW
, password(se c'e autenticazione)
�PH
P_SELF, nome dello script
�HTTP_PO
ST_VARS, array con coppie chiave-valore (post)
�HTTP_G
ET_VARS, array con coppie chiave-valore (get)
�HTTP_CO
OKIE_VAR
["PHPSESSID
"]�
Contiene il valore dell' ID di sessione
�HTTP_SER
VER_VAR
["HTTP_CO
OKIE"]
�Contiene il valore di tutti i cookie
�HTTP_SER
VER_VAR
["HTTP_H
OST"]
�Contiene il nom
e dell'host su quale risiede il server web
�HTTP_SER
VER_VAR
["REM
OTE_AD
DR"]
�Contiene l'indirizzo rem
oto del browser
�HTTP_SER
VER_VAR
["SCRIPT_FILEN
AME"]
�Contiene il nom
e e il percorso completo dello script corrente
�HTTP_SER
VER_VAR
["SERVER
_NAM
E"]�
Contiene il nome del server w
eb�
HTTP_SER
VER_VAR
["SERVER
_SOFTW
ARE"]
�Contiene il nom
e del server web
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Variabili predefinite in PHP
83
�L'upload
di file
si fa
con un
semplice
form con
una dicitura in più
che permette a php di capire che si tratta
di un invio di file con post. Occorre tuttavia controllare
l’impostazione dei perm
essi sul file system�<form
method=
postaction=
"uploadit.php" EN
CTYPE="m
ultipart/form-data">
�L'input che perm
ette di sfogliare (file dialog) èdel tipo:
<input type=
file name=
"uploadfile">�Quando si invia il file (uploadfile) php crea delle variabili
utili:�$uploadfile_nam
e(nom
e e percorso)�$uploadfile_size
(dimensioni)
�$uploadfile_tupe
(tipo)�$uploadfile
(nome del file creato dopo l'invio)
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Upload di file in PH
P
84
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Upload di file in PH
P�il form
d'invio può essere come segue:
<HTM
L><BO
DY>
<FO
RM
METH
OD=PO
ST ACTIO
N="uploadit.php
"ENCTYPE=
"multipart/form
-data" ><B>
Inserisci il nome del file da inviare <
/B><INPU
T TYPE=FILE N
AME=
"uploadfile"><BR>
<BR>
<INPU
T TYPE="SU
BMIT" VALU
E="Invia le inform
azioni!"><INPU
T TYPE="RESET" VALU
E="Cancella!">
</FO
RM></BO
DY>
</HTM
L>
�Una volta inviato ecco com
e si potrebbe accedere alle variabili:<HTM
L><BO
DY>
<?php
echo "nome del file locale creato dopo l'invio: $uploadfile\n";
echo "nome originale del file rem
oto: $uploadfile_name\n";
echo "dimensioni del file in byte: $uploadfile_size\n";
echo "tipo di file: $uploadfile_type\n";echo "<
HR>
";
85
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Upload di file in PH
P# Altri esem
pi di controlli…# abbiam
o veramente un file?
if ( $uploadfile == "none" ) {
echo "Non è
stato inviato alcun file<BR>
";echo "<
A HREF=
\"upload.html\">
Ritorna al form </A>
";exit;}# controlla innanzitutto le dim
ensioni del file (se èmeno di 3 KB)
if ($uploadfile_size < 3072 ) {
# lo copia in una nuova posizione
if (copy($uploadfile,"/home/httpd/docs/$uploadfile_nam
e")){echo "Invio del file riuscito";# cancella il file tem
poraneounlink($uploadfile);} else {
echo "Invio del file fallito";}
} else {echo "il file non deve superare 3 KB<
BR>";
}?>Ritorna al form
per inviare il <A H
REF="upload.htm
l">file<
/A></BO
DY>
</HTM
L>
86
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Dow
nload di file in PHP
�Quando vogliam
o fare il download dobbiam
o mandare il
contenuto direttam
ente agli
Header
specificando il
contenuto MIM
E. Nell'header ci devono essere:
�Content-type (tipo di docum
ento)�Content-D
isposition (destinazione del contenuto)�Content-D
escription (descrizione del contenuto )�Content-Length
(lunghezza del contenuto)�Content-type Application/octet-stream
costringe il browser
ad aprire la finestra di salvataggio file; Content-Disposition
ha il
valore “attachm
ent”, Content-D
escription per
esempio D
ownload e Content-Length la lunghezza del file
che stiamo per scaricare.
87
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Dow
nload di file in PHP
�Ecco una pagina di esem
pio:<HTM
L><BO
DY>
<b>
Fai clic per scaricare i file</b>
<?
# elenco dei contenuti di una cartella con link
$cartella = opendir('docs');
while ($file =
readdir($cartella)) {$array_file[] =
$file;}
foreach ($array_file as $file) {if ( $file =
= ".." || $file =
= ".") {
continue;}
$dim_f=
filesize("docs/".$file); echo "<
a href=\"
downloadit.php?nom
e_f=$file&
dim_f=
$dim_f\">
$file</a>
”;echo “<
BR>”;
}?>
</BO
DY>
</HTM
L>
88
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Dow
nload di file in PHP
�Quando si clicca su un file, si va su dow
nloadit.php:<?php
header("Content-type: Application/octet-stream");
header("Content-Disposition: attachm
ent; filenam
e=$nom
e_file");header("Content-D
escription: Dow
nload PHP");
header("Content-Length: $dimensioni_file");
readfile($nome_file);
?>�Questa pagina non fa altro che ricevere le inform
azioni e fare scaricare il file
89
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Connessione database in PHP
�Sovente
il php
opera con
un database
per reperire
le inform
azioni che rendono dinamiche le pagine w
eb�Per utilizzare una connessione dobbiam
o avere alcuni dati:<?
$db_host = "localhost";
$db_user = "nostro nom
e";$db_passw
ord = "nostra passw
ord";$db_database =
"nome nostro database";
?>�Per connetterci ad un database M
ySql :$xxx =
mysql_connect($db_host,$db_user,$db_passw
ord);$yyy=
mysql_db_query($db_database,"query",$xxx);
�La prim
a per ottenere il valore della variabile resource, con laquale ci potrem
o riferire alla connessione da altre query, la seconda
dove specificare
il nom
e del
database al
quale ci
vogliamo connettere.
90
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
Connessione database in PHP
�Vediam
o le query fondamentali :
�Inserire
una riga:
mysql_db_query($db_database,"insert
into ".$db_tabella."(nom
e, em
ail) values('".$nom
e."', '".$em
ail."')",$xxx);�La riga verrà
aggiunta dopo l'ultima riga della tabella.
�Elim
inare una riga: mysql_db_query($db_database,"delete from
".$db_tabella." w
here id=5 and....",$xxx);
�Modificare
una riga:
mysql_db_query($db_database,"update
".$db_tabella." set nome=
'".$nome."', em
ail='".$em
ail."' where
id=5 and....",$xxx);
�Interrogare una tabella: m
ysql_db_query($db_database,"select nom
e, email from
".$db_tabella." where id=
5 ",$xxx);�Nel caso che all'interno di una query si utilizzi una variabile
stringa si deve operare nel seguente modo:
�mysql_db_query($db_database,"select
nome,
from
".$db_tabella." where cognom
e=‘“.$cogn.”
' ",$xxx);
91
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�Lavorando con PH
P e MySql possiam
o utilizzare alcune funzioni da abbinare con le query:
�mysql_affected_row
s();Questa funzione restituisce il num
ero di righe della tabella m
odificate dalla query.�mysql_num
_rows($query);
Questa
funzione restituisce
il num
ero di righe dopo una ricerca con 'select‘, ad esempio:
$query=mysql_db_query($db_database,"select
nome,
from ".$db_tabella." w
here id=5 ",$xxx);
$num=mysql_num
_rows($query);
$abc=0;
while ( $abc<
$num ){
$caso = m
ysql_result($query,$abc,"nome");
$caso2 = m
ysql_result($query,$abc,"email");
echo $caso." = ".$caso2."<
br>";
$abc++;
} Connessione database in PHP
92
A. Longheu –Linguaggi M
-Z –Ing. In
f. 2007-2008
�Abbiam
o fatto una ricerca, poi abbiamo trovato il num
ero di righe
dei risultati
trovati, abbiam
o impostato
una variabile
($abc) a zero, ed infine con un ciclo while abbiam
o scritto il nom
e e
la mail
dei risultati
trovati.Il risultato potrebbe essere:gigi =
�mysql_result(xxx,yyy,"zzz");
Questa
funzione (com
e visto
nell'esempio
precedente) restituisce
il valore
di una
cella della
tabella conoscendo:
xxx = La
variabile associata
alla query
di ricerca
(select).yyy
=
La variabile
associata al
numero
di riga.
zzz = Il nom
e della colonna da cui prelevare il dato.
Connessione database in PHP