Programmazione Web Approfondimenti di PHP. Gestione dello stato.

84
Programmazione Web Approfondimenti di PHP

Transcript of Programmazione Web Approfondimenti di PHP. Gestione dello stato.

Page 1: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

Programmazione WebApprofondimenti di PHP

Page 2: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

Gestione dello stato

Page 3: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

3

Cookie

I cookie possono essere utilizzati per memorizzare informazioni sul client su richiesta di uno script (max 4KB)

Una volta creato, il cookie è accessibile solo dal server che lo ha richiesto  Possibile configurare il browser per:

• notificare l’utente della ricezione dei cookie• rifiutare la ricezione di cookie

 Possibile analizzare/rimuovere i cookie memorizzati dal browser 

Programmazione Web - PHP: approfondimenti

Page 4: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

4

Struttura di un cookie

Cookie = (Nome, Valore, Scadenza, …)

Nome = identificatore di accesso al dato memorizzato (il solo obbligatorio)

Valore = informazione memorizzata nel cookie (se è null il cookie è

cancellato dal client)

Scadenza = data in cui il cookie viene “dimenticato” (rimosso) dal browser

secondo il formato timestamp Unix (ottenuto tramite la

funzione time())

Cookie variabile persistente (tra diverse sessioni) con scadenza stabilita

Programmazione Web - PHP: approfondimenti

Page 5: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

5

Uso di un cookie

• Uso della funzione PHP setcookie() chiamata prima di qualsiasi altra istruzione

• Negli script si accede ai cookie mediante l’array superglobale $_COOKIE, dove sono

registrati solo i cookie già ricevuti dal client

Programmazione Web - PHP: approfondimenti

Page 6: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

6

Sessioni

I cookie presentano problemi evidenti• di sicurezza (sono memorizzati sul client)• hanno una dimensione limitata (max 4KB)• possono essere cancellati o disabilitati sul client

Le sessioni permettono la memorizzazione di variabili “persistenti” sul server in un file di testo

Programmazione Web - PHP: approfondimenti

Page 7: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

7

Creazione di una sessione

Una sessione viene invocata tramite la funzione session_start()

Dopo che è stata invocata la funzione session_start(), l'interprete PHP crea un nuovo file di testo sul server contenente i dati della sessione

• associa alla sessione un identificatore univoco, accessibile tramite la funzione session_id()

• costruisce un array associativo superglobale $_SESSION dove le informazioni sono caricate e accessibili direttamente

Nell’array associativo è possibile salvare tutte le informazioni desiderate come coppie <chiave, valore>

Programmazione Web - PHP: approfondimenti

Page 8: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

8

Memorizzazione di session_idQualora i cookie siano abilitati sul browser, l’identificatore della sessione viene passato al client attraverso un cookie

In caso contrario, è comunque possibile utilizzare le sessioni utilizzando il meccanismo dell’url rewriting, cioè affiancando una variabile agli URL che compaiono nella pagina restituita all’utente

Il nome del cookie e della variabile passata via URL viene di default impostato a PHPSESSID all’interno del file php.ini e si può gestire sia agendo direttamente sul file oppure utilizzando la funzione session_name()

Programmazione Web - PHP: approfondimenti

Page 9: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

9

Caricamento della sessionePer riesumare una sessione, si usa sempre la funzione session_start()

Dopo che è stata invocata la funzione session_start(), l'interprete PHP riconosce l’utente dall’ID della sessione, recuperandolo dal cookie o dall’URL

L'interprete PHP carica quindi i dati dal file di testo presente sul server, associato all’ID della sessione, e li mappa nell’array associativo $_SESSION

Tutte le modifiche apportate a $_SESSION vengono poi riportate nel file di testo al termine dell’esecuzione dello script

Programmazione Web - PHP: approfondimenti

Page 10: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

10

Esempio

Programmazione Web - PHP: approfondimenti

Page 11: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

11

…e le successive!

Programmazione Web - PHP: approfondimenti

Page 12: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

12

Distruzione di una sessione (I)Di norma, una sessione ha validità finché il browser è attivo. Per distruggere esplicitamente la sessione si usa la funzione session_destroy()

Le variabili di sessione sono tuttavia ancora accessibili nello script che ha distrutto la sessione

Per rimuovere tutte le variabili di sessione si usa la funzione unset

<?php

session_start(); $_SESSION['nome'] = ‘Devis'; session_destroy(); echo $_SESSION['nome']; ?>

<?php

session_start(); $_SESSION['nome'] = ‘Devis'; session_destroy(); unset($_SESSION['nome']); echo $_SESSION['nome']; ?>

Devis

Programmazione Web - PHP: approfondimenti

Page 13: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

13

Distruzione di una sessione (II)La distruzione di una sessione supportata da cookie implica la rimozione (anche) del cookie

• nome del cookie relativo all’identificatore della sessione: session_name()

Procedura (completa) di distruzione della sessione: • rimozione di tutte le variabili di sessione• se esiste un cookie di sessione, viene rimosso• distruzione della sessione

Programmazione Web - PHP: approfondimenti

Page 14: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

14

Esempio: gestione del login utentelogin.php

Programmazione Web - PHP: approfondimenti

Page 15: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

15

Esempio: gestione del login utentelogin.php

Programmazione Web - PHP: approfondimenti

Page 16: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

16

Esempio: gestione del login utentehomePage.php

Programmazione Web - PHP: approfondimenti

Page 17: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

17

homePage.php

Programmazione Web - PHP: approfondimenti

Page 18: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

18

Esempio: gestione del login utenteofferte.php

Programmazione Web - PHP: approfondimenti

Page 19: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

19

Esempio: gestione del login utenteofferte.php

Programmazione Web - PHP: approfondimenti

Page 20: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

20

Esempio: gestione del login utentelogout.php

Programmazione Web - PHP: approfondimenti

Page 21: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

21

logout.php

Programmazione Web - PHP: approfondimenti

Page 22: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

22

Gestione della scadenza delle sessioniDue gli elementi che tengono in vita una sessione

• l’id della sessione fornito dal client (per esempio tramite i cookie)• il file con i dati della sessione sul server

Il client smette di trasmettere l’id quando scade il cookie di sessione• la scadenza è regolata dalla funzione session_set_cookie_param() e

dalla direttiva session.cookie_lifetime del file php.ini• di default è impostata a 0, vale a dire i cookie scadono alla chiusura del

browser

Il file dei dati di sessione scade dopo un numero di secondi impostato nella direttiva session.gc_maxlifetime nel file php.ini (default 24 minuti)

• dopo tale scadenza, il file verrà eliminato con una probabilità impostata dalle direttive session.gc_probability e session.gc_divisor (default 1%)

Programmazione Web - PHP: approfondimenti

Page 23: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

23

Uso dell'URL rewriting

Le informazioni sulle sessioni sono salvate direttamente nei link presenti nella pagina restituita all’utente:

• Esplicitamente• Ogni URL nella pagina restituita all’utente sarà impostato come

• Automaticamente (previsto da PHP4 in poi)• Va riconfigurato php.ini

• L'URL rewriting (automatico o esplicito) è sconsigliato per motivi di sicurezza (l’id della sessione appare in chiaro negli URL della pagina)

script.php?<session-name>=<session-id>

ini_set('session.use_trans_sid', false);

Programmazione Web - PHP: approfondimenti

Page 24: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

Upload di file

Page 25: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

25

Gestione dell’upload di file Input di file mediante: <input type="file" name="fileupload"/>  Attributo enctype nel form: enctype="multipart/form-data" Informazioni relative al file caricato disponibili nell’array associativo $_FILES, indicizzato dal valore dell’attributo name specificato nel form di upload Ogni elemento di $_FILES è un array associativo di 4 elementi:

Programmazione Web - PHP: approfondimenti

Page 26: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

26

Form di upload del file (I)

Programmazione Web - PHP: approfondimenti

Page 27: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

27

Form di upload del file (II)

Programmazione Web - PHP: approfondimenti

Page 28: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

28

Gestione del form di upload del file

Programmazione Web - PHP: approfondimenti

Page 29: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

29

Gestione del form di upload del file

Programmazione Web - PHP: approfondimenti

Page 30: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

30

Funzioni di manipolazione dei file (I)

Test di esistenza di un file: file_exists()      Test della natura di un file: is_file(), is_dir()

if(file_exists("grano.jpg")) echo "Il file esiste!"else echo "Il file non esiste!"

if(is_file($nome)) echo "$nome è un file!";else if(is_dir($nome)) echo "$nome è una directory!";else echo "$nome non è un file/directory!";

Programmazione Web - PHP: approfondimenti

Page 31: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

31

Funzioni di manipolazione dei file (II)Test di manipolabilità: is_readable(), is_writable(), is_executable()        

Dimensione di un file: filesize() (restituisce false se ci sono problemi)     Cancellazione di un file: unlink()

if(is_readable($nome)) echo "Il file $nome è leggibile!";if(is_writable($nome)) echo "Il file $nome è scrivibile!";if(is_executable($nome)) echo "Il file $nome è eseguibile!";

echo "La dimensione del file $nome è di " . filesize($nome) . " byte";

unlink($nome);echo "Il file $nome è stato rimosso";

Programmazione Web - PHP: approfondimenti

Page 32: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

32

Funzioni di manipolazione delle directoryCreazione di una directory: mkdir()      

Rimozione di una directory: rmdir()

mkdir("upload", 0755);

rmdir("upload");

Programmazione Web - PHP: approfondimenti

Page 33: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

33

Funzioni di manipolazione delle directory

Apertura di una directory (per poter leggerla): opendir()

Lettura di una directory: readdir()

$dir = opendir("upload");

<?php

$dir = opendir($nomedir); if($dir == false) echo "Errore: impossibile aprire la directory $nomedir"; else { while(!(($file = readdir($dir)) === false)) { if(is_dir("$nomedir/$file")) echo "(D)"; echo $file . br(); } closedir($dir); }?>

Programmazione Web - PHP: approfondimenti

Page 34: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

Intestazione HTTP

Page 35: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

35

Gli header HTTP

• Normalmente, PHP è usato per costruire il corpo della risposta HTTP del server, che per default presenta un’intestazione HTTP standard contenente, tra gli altri, il tipo MIME del file HTML (text/html)

• Talvolta è necessario gestire le intestazioni del protocollo HTTP (headers) •Due tipologie di headers

• request headers: inviati dal browser verso il server quando viene generata una richiesta HTTP (per esempio, tramite il click su un link)

• response headers: inviati dal server al browser in risposta ad una determinata richiesta (per esempio, sotto forma di comune pagina HTML)

Programmazione Web - PHP: approfondimenti

Page 36: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

36

Headers inviati nella richiesta

• Per visualizzare gli headers inviati nella richiesta si può usare la funzione getallheaders() che produce un array contenente tutte le informazioni relative agli headers inviati in input (alias di apache_request_headers())

Programmazione Web - PHP: approfondimenti

Page 37: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

37

Headers inviati nella risposta

• Esiste un’analoga funzione apache_response_headers() per visualizzare gli headers nella risposta HTTP

• Talvolta è necessario modificare/aggiungere altre intestazioni• per re-dirigere il browser su un’altra pagina (eventualmente dopo un

certo tempo)• per evitare il caching della pagina• per modificare il content type della pagina• ...

• A tale scopo esiste la funzione header()• La funzione header()deve essere invocata prima di qualsiasi altro output, di qualunque elemento HTML o di qualunque spazio

Programmazione Web - PHP: approfondimenti

Page 38: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

38

Page 39: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

39

Page 40: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

40

Buffering

• Le intestazioni devono precedere qualunque contenuto, perché una volta che la pagina inizia ad essere inviata non è più possibile modificare l’intestazione della risposta HTTP

• Questo vincolo può essere aggirato con il meccanismo del buffering• la funzione ob_start() viene posta immediatamente prima del

contenuto della pagina, compresi eventuali spazi bianchi• in tal modo, lo script non inizia ad inviare la pagina fino a quando

non ha terminato la sua esecuzione• si può ripristinare il consueto meccanismo di emissione immediata

dell’output invocando la funzione ob_end_flush()

Programmazione Web - PHP: approfondimenti

Page 41: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

Approfodimento sull'uso di array e stringhe

Page 42: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

42

Array

Array = variabile che contiene un insieme (indicizzato) di elementi

• Elemento: scalare (semplice) o un altro array• Individuazione degli elementi mediante indicizzazione

associativa

numerica

Programmazione Web - PHP: approfondimenti

Page 43: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

43

Array indicizzati numericamente

Creazione di array mediante enumerazione dei suoi elementi:  

Creazione di array mediante assegnamento con un altro array: 

  Creazione di array mediante caricamento da database

$strumenti = array('flauto', 'violino', 'oboe', 'liuto');

$a = $strumenti;

$numeri = range(1, 10); $numeri = array(1,2,3,4,5,6,7,8,9,10);

$lettere = range('a', 'z'); $lettere = array('a','b', ..., 'z');

Programmazione Web - PHP: approfondimenti

Page 44: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

44

Array indicizzati associativamente

Indice rappresentato da un nome (chiave):   

$prezzi = array('flauto'=>2500, 'violino'=>8000, 'oboe'=>5400, 'liuto'=>11000);

Programmazione Web - PHP: approfondimenti

Page 45: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

45

Operatori per array

$a = array(1,2,3);$b = array(4,5,6,7,8);$c = array('1','2','3');

$a + $b: (1,2,3,7,8)$a == $b: false$a == $c: true$a === $c: false

Programmazione Web - PHP: approfondimenti

Page 46: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

46

Array multidimensionali (I)

Indicizzazione numerica:   

$articoli = array(array('FLT','flauto', 2500), array('VLN', 'violino', 8000), array('OBO', 'oboe', 5400), array('LUT', 'liuto',11000));

Programmazione Web - PHP: approfondimenti

Page 47: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

47

Array multidimensionali (II)

Accesso mediante ciclo for:   

for($riga=0; $riga<4; $riga++){ for($colonna=0; $colonna<3; $colonna++) echo $articoli[$riga][$colonna] . ' '; echo '<br/>';}

FLT flauto 2500 VLN violino 8000 OBO oboe 5400 LUT liuto 11000

Programmazione Web - PHP: approfondimenti

Page 48: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

48

Array multidimensionali (III)

Indicizzazione mista:   

$articoli = array(array('codice'=>'FLT', 'strumento'=>'flauto', 'prezzo'=>2500), array('codice'=>'VLN', 'strumento'=> 'violino', 'prezzo'=>8000), array('codice'=>'OBO', 'strumento'=>'oboe', 'prezzo'=>5400), array('codice'=>'LUT', 'strumento'=>'liuto', 'prezzo'=> 11000));

Programmazione Web - PHP: approfondimenti

Page 49: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

49

Array multidimensionali (IV)

Accesso mediante ciclo foreach:   

foreach($articoli as $articolo){ foreach($articolo as $indice => $contenuto) echo "$indice: $contenuto "; echo '<br/>';}

codice: FLT strumento: flauto prezzo: 2500 codice: VLN strumento: violino prezzo: 8000 codice: OBO strumento: oboe prezzo: 5400 codice: LUT strumento: liuto prezzo: 11000

$articoli

Programmazione Web - PHP: approfondimenti

Page 50: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

50

Ordinamento di array (I)

Ordinamento di array indicizzati numericamente: sort()   $strumenti = array('flauto', 'violino', 'oboe', 'liuto');sort($strumenti);

Programmazione Web - PHP: approfondimenti

Page 51: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

51

Ordinamento di array (II)

Ordinamento di array indicizzati associativamente: ksort() e asort() $prezzi = array('flauto'=>2500, 'violino'=>8000, 'oboe'=>5400, 'liuto'=>11000);

ksort($prezzi);

asort($prezzi);

Programmazione Web - PHP: approfondimenti

Page 52: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

52

Ordinamento di array (III)

Ordinamento di array in ordine inverso: rsort(), krsort() e arsort()   

rsort($strumenti);

krsort($prezzi);

arsort($prezzi);

Programmazione Web - PHP: approfondimenti

Page 53: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

53

Riordinamento casuale di array

Programmazione Web - PHP: approfondimenti

Page 54: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

54

Inversione di arrayarray_reverse($a): genera un array inverso di $a   

$inv_str = array_reverse($strumenti);

$inv_art = array_reverse($articoli);

Programmazione Web - PHP: approfondimenti

Page 55: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

55

Conteggio di elementi negli arraycount($a): restituisce il numero di elementi dell’array $a

array_count_values($a): restituisce un array associativo che indica la frequenza di ogni elemento nell’array $a (gli elementi di $a devono esserescalari)

Programmazione Web - PHP: approfondimenti

Page 56: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

56

Conversione di array associativi in variabili scalari

extract(array a [, int tipologia [, string prefisso]]): genera un insieme di variabili omonime delle chiavi di a

Parametri opzionali:• tipologia: tipologia di gestione delle collisioni (default: sovrascrittura)• prefisso: rilevante per certe tipologie di collisione

extract($prezzi);echo "$flauto $violino $oboe $liuto"

Programmazione Web - PHP: approfondimenti

Page 57: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

57

Caricamento di array da file

Programmazione Web - PHP: approfondimenti

Page 58: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

58

Navigazione di array

Array: ha un puntatore interno che punta all’elemento corrente dell’array(creazione array punta al primo elemento)• current($a) restituisce elemento corrente• each($a) restituisce elemento corrente; incrementa puntatore• next($a) incrementa puntatore; restituisce elemento corrente• reset($a) posiziona puntatore al primo elemento (e lo restituisce)• end($a) posiziona puntatore all’ultimo elemento (e lo restituisce)• prev($a) decrementa puntatore; restituisce elemento corrente

$a = array("alfa", "beta", "gamma");$stringa = end($a);while($stringa){ echo "$stringa <br/>"; $stringa = prev($a);}

gamma beta alfa

Programmazione Web - PHP: approfondimenti

Page 59: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

59

Pulitura di stringhestring trim(string stringa): rimozione di spaziatura intorno a stringa

Spazio bianco ‘ ‘Newline "\n" Carriage return "\r"Tab orizzontale "\t"Tab verticale "\x0B"Fine stringa "\0"

string ltrim(string stringa): pulitura solo a sinistra string rtrim(string stringa): pulitura solo a destra

$nome = trim($_POST['nome']);$email = trim($_POST['email']);

Programmazione Web - PHP: approfondimenti

Page 60: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

60

Rendering dei Newlinestring nl2br(string stringa): sostituzione di "\n" con "<br/>”

Programmazione Web - PHP: approfondimenti

Page 61: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

61

Formattazione di stringhe per la stampavoid printf(string formato [, mixed args ...])string sprintf(string formato [, mixed args ...])

formato: specifica del formato della stringa di output mediante codiciargs: variabili che istanziano i codici nel formato

Specifiche di conversione multiple:

echo "Il costo totale è $costo_totale";

printf("Il costo totale è %s", $costo_totale)";

printf("Il costo totale è %.2f", $costo_totale)";

Il costo totale è 83,8

Il costo totale è 83,80

printf("Il costo totale è %.2f (con spedizione %.2f)",

$costo_totale, $costo_con_spedizione);

Il costo totale è 83.80 (con spedizione 88.80)

Programmazione Web - PHP: approfondimenti

Page 62: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

62

Formattazione di stringhe per la stampa

Sintassi specifica di conversione: %['carattere-riempimento] [-] [larghezza] [.precisione] codice

Programmazione Web - PHP: approfondimenti

Page 63: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

63

Formattazione di stringhe per la stampaCambiamento del case (maiuscola-minuscola) di stringhe:

Utile nel confronto tra stringhe:

$subject = 'Feedback dal sito web';

if(strtolower($email) == '[email protected]') $to = '[email protected]';else $to = '[email protected]';

Programmazione Web - PHP: approfondimenti

Page 64: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

64

Formattazione di stringhe per la memorizzazione

Problemi nella memorizzazione di stringhe nel database: apici, \, NULLInibizione dei metacaratteri mediante backslash: \', \", \\

string addslashes(string stringa)string stripslashes(string stringa)

$feedback = addslashes(trim($_POST['feedback'])); $feedback = stripslashes($feedback);

Programmazione Web - PHP: approfondimenti

Page 65: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

65

Esplosione ed implosione di stringhearray explode(string separatore, string input [, int limite])  

string implode(array input, string separatore)  

string strtok(string input, string separatore): preleva da input un token alla volta

$email_array = explode('@', $email); if(strtolower($email_array[0] == 'luigi.rossi') $to = '[email protected]';else $to = [email protected]';

$email = implode($email_array, '@');

$token = strtok($feedback, ' ');do{ echo "$token <br />"; $token = strtok(' ');} while($token != '');

Prima call due parametri

Successive call un solo parametro (separatore)

Programmazione Web - PHP: approfondimenti

Page 66: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

66

Prelievo di sottostringhestring substr(string stringa, int inizio [, int lung])

inizio: indice da cui prelevare la sottostringa (se negativo dalla fine)

lung: numero di caratteri da prelevare (se non specificato fino alla fine)

$feedback = 'Il vostro servizio clienti è eccellente';

Programmazione Web - PHP: approfondimenti

Page 67: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

67

Confronto di stringheint strcmp(string stringa1, string stringa2)

stringa1 == stringa2 risultato = 0stringa1 > stringa2 risultato > 0stringa1 < stringa2 risultato < 0

 int strnatcmp(string stringa1, string stringa2):confronto sulla base di un criterio 'naturale' (http://www.naturalordersort.org) 

Versioni non sensibili alle maiuscole/minuscole (case insensitive): strcasecmp()strnatcasecomp()

echo strcmp('15', '2');

echo strnatcmp('15', '2');

-1

1

Programmazione Web - PHP: approfondimenti

Page 68: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

68

Ricerca di sottostringhestring strstr(string pagliaio, string ago)

se ago trovato nel pagliaio sottostringa dall’inizio di agose ago non trovato nel pagliaio falsese più occorrenze di ago nel pagliaio prima occorrenza di ago

Assegnamento del destinatario in base a parole chiave nel feedback:

       

Varianti:stristr(): case insensitivestrrchr() sottostringa partendo dall’ultima occorrenza di ago

$to = '[email protected]'; // defaultif(strstr($feedback, 'negozio')) $to = '[email protected]';elseif(strstr($feedback, 'consegna')) $to = '[email protected]';elseif(strstr($feedback, 'fattura')) $to = '[email protected]';

Programmazione Web - PHP: approfondimenti

Page 69: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

69

Ricerca posizione di sottostringheint strpos(string pagliaio, string ago [ , int offset ])

restituisce la posizione della prima occorrenza di ago in pagliaiooffset: punto in pagliaio da cui iniziare a cercarese ago non si trova nel pagliaio falsepiù veloce di strstr()

Se ago non si trova nel pagliaio false: strpos() rimane non definito

$saluto = 'Hello world';echo strpos($saluto, 'world');

echo strpos($saluto, 'l', 5);

$pos = strpos($saluto, 'Hello');if($pos === false) echo 'Non trovato';else echo "Trovato alla posizione $pos";

Trovato alla

posizione 0

6

9

Programmazione Web - PHP: approfondimenti

Page 70: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

70

Sostituzione di sottostringhe (I)mixed str_replace(mixed ago, mixed nuovo, mixed pagliaio [ , int &tot ])

sostituisce tutte le occorrenze di ago in pagliaiorestituisce il nuovo pagliaiose specificato, assegna a tot il numero di sostituzioni effettuate

     Possibile passare array invece di stringhe:

$saluto = 'Hello world, wonderful world!';$tot = 0;echo str_replace('world', 'people', $saluto, $tot)."($tot)";

$feedback = 'Questo negozio fa schifo! Veramente schifo!';

$censurate = array('schifo', ...);

echo str_replace($censurate, '***', $feedback);

Programmazione Web - PHP: approfondimenti

Page 71: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

71

Sostituzione di sottostringhe (I)mixed str_replace(mixed ago, mixed nuovo, mixed pagliaio [ , int &tot ])

sostituisce tutte le occorrenze di ago in pagliaiorestituisce il nuovo pagliaiose specificato, assegna a tot il numero di sostituzioni effettuate

     Possibile passare array invece di stringhe:

$saluto = 'Hello world, wonderful world!';$tot = 0;echo str_replace('world', 'people', $saluto, $tot)."($tot)";

$feedback = 'Questo negozio fa schifo! Veramente schifo!';

$censurate = array('schifo', ...);

echo str_replace($censurate, '***', $feedback);

Hello people, wonderful people! (2)

Questo negozio fa ***! Veramente ***!

Programmazione Web - PHP: approfondimenti

Page 72: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

72

Sostituzione di sottostringhe (III)string substr_replace(string stringa, string sostituto, int inizio [ , int lung ])

sostituisce una parte di stringa con sostitutoinizio: posizione di stringa in cui inizia la sostituzione (se negativo,

posizione dalla fine)lung positiva o nulla numero di caratteri sostituiti lung negativa posizione (dalla fine) su cui terminare la sostituzione

$saluto = 'Hello world';echo substr_replace($saluto, 'people', 6, 5);

echo substr_replace($saluto, 'people ', 6, 0);

echo substr_replace($saluto, 'people ', 6, -2);

Hello people

Hello people world

Hello people ld

Programmazione Web - PHP: approfondimenti

Page 73: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

73

Espressioni regolari

Pattern matching complessi (non semplicemente uguaglianze di stringhe)

Due possibili stili: POSIX, Perl (PCRE)

• Espressione regolare = notazione per specificare un pattern in un testo

• Uso di metacaratteri per specificare particolari pattern

Programmazione Web - PHP: approfondimenti

Page 74: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

74

Insiemi di caratteri (I)Un qualsiasi carattere diverso da \n: . 

Classe di caratteri: [ lista-di-caratteri ]

.emo

[aeiou]

[a-z]

[a-zA-Z]

[^a-z]

[^aeiou]

compatibile con remo, temo, memo, …

vocali

range delle lettere alfabetiche minuscole

range delle lettere alfabetiche

qualsiasi carattere che non sia una lettera alfabetica minuscola

qualsiasi carattere che non sia una lettera vocale

Programmazione Web - PHP: approfondimenti

Page 75: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

75

Insiemi di caratteri (II)Classi di caratteri predefinite:

Programmazione Web - PHP: approfondimenti

Page 76: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

76

Ripetizione e alternativaRipetizione zero o più volte del pattern: *

Ripetizione una o più volte del pattern: +

Opzionalità: ?

Alternativa: |

[aeiou]*

[[:alpha:]][[:alnum:]]*

[[:digit:]]+

[[:digit:]]+,[[:digit:]]+

[[:digit:]]+[aeiou]?

org|net|com

Zero o più vocali

Lettera seguita da zero o più caratteri alfanumerici (identificatore)

Una o più cifre decimali (numero intero)

Numero reale con parte decimale

Numero eventualmente seguito da una vocale

Programmazione Web - PHP: approfondimenti

Page 77: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

77

SottoespressioniPossibile raggruppare sottoespressioni mediante parentesi:

Ripetizione di un pattern un numero vincolato di volte: { limiti }

(molto )*grandegrande

molto grande

molto molto grande …

[[:digit:]]{16}

(molto ){1,3}grande

(molto ){2,}grande

Numero intero di 16 cifre decimali

molto grande

molto molto grande

molto molto molto grande

molto molto grande

molto molto molto grande

molto molto molto molto grandeProgrammazione Web - PHP: approfondimenti

Page 78: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

78

AncoraggioPossibile specificare la posizione di una sottostringa:

^Hello

world$

^[[:alpha:]][[:alnum:]]*$

[[:<:]][[:digit:]]+[[:>:]]

Hello world

Hello people

Hello everybody

Hello world

Beutfiful worldBest world

Stringa costituita unicamente da un identificatore

123 alfa25 460

Programmazione Web - PHP: approfondimenti

Page 79: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

79

Caratteri speciali

Per inibire i caratteri speciali al di fuori di [ ], è necessario precederli con \

Meglio inserire il pattern tra apici singoli (non doppi):

Se pattern tra apici doppi parsing della stringa necessari ulteriori \

'[[:digit:]]+\.[[:digit:]]+'12.0

0.14

13.156

"[[:digit:]]+\\.[[:digit:]]+"

Programmazione Web - PHP: approfondimenti

Page 80: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

80

Applicazione del modulo di feedback

Rilevazione di particolari termini nel feedback del cliente:  

Controllo nome del cliente:  

 Controllo formato indirizzo di email:

negozio|consegna|fattura

Luigi Rossi

G. Luigi Rossi

G.C. Luigi Rossi

^(([[:upper:]]\.)+ )?[[:upper:]][[:lower:]]+ [[:upper:]][[:lower:]]+$

[email protected]

^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9_.-]+$

Programmazione Web - PHP: approfondimenti

Page 81: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

81

Ricerca di sottostringhe con espressioni regolari

bool ereg(string pattern, string stringa)• stabilisce se stringa contiene una sottostringa compatibile con

pattern• case-sensitive

Variante case-insensitive: eregi()

Programmazione Web - PHP: approfondimenti

Page 82: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

82

Ricerca di sottostringhe con espressioni regolari

string ereg_replace(string pattern, string sostituto, string stringa)

sostituisce con sostituto tutte le sottostringhe di stringa compatibili con pattern

restituisce il risultato della sostituzione (funzionale: stringa non cambia!)Variante case-insensitive: eregi_replace()

$transazione = 'Carta di credito: 4367-2234-1245-3200';

$pattern = '[[:digit:]]{4}(-[[:digit:]]{4}){3}';

echo ereg_replace($pattern, 'xxxx-xxxx-xxxx-xxxx', $transazione);

$stringa = 'alfa 23beta gamma48 125';

$pattern = '[[:<:]][[:digit:]]+[[:>:]]';

echo ereg_replace($pattern, 'NUM', $stringa);

Carta di credito: xxxx-xxxx-xxxx-xxxx

alfa 23beta gamma48 NUM

Programmazione Web - PHP: approfondimenti

Page 83: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

83

Dividere stringhe con espressioni regolari

array split(string pattern, string stringa [, int max])• restituisce l’array di stringhe ottenuto dividendo stringa limitata dai confini

compatibili con pattern• max: numero massimo di elementi nell’array risultante

$email = '[email protected]';

$a = split('\.|@', $email);

$espressione = '3*52+24/5-12';

$operandi = split('[-+*/]', $espressione);

Programmazione Web - PHP: approfondimenti

Page 84: Programmazione Web Approfondimenti di PHP. Gestione dello stato.

84

Funzioni deprecatedereg(‘pattern’,’stringa’) sostituito da

preg_match(‘/pattern/’,’stringa’)

eregi(‘pattern’,’stringa’) sostituito da preg_match(‘/pattern/i’,’stringa’)

ereg_replace(‘pattern’,’sostituto’,’stringa’) sostituito da preg_replace(‘/pattern/’,’sostituto’,’stringa’)

uso di ‘/pattern/i’ in caso di eregi_replace

split(‘pattern’,’stringa’) sostituito da preg_split(‘/pattern/’,’stringa’)

Programmazione Web - PHP: approfondimenti