WEP WEb Programming. 4 PHP: dati e form



Documenti analoghi
Basi di Dati-XII. PHP e MySQL. Perché? Come? Corso di Laurea in Informatica Anno Accademico 2013/2014

Laboratorio Progettazione Web PHP e FORMs HTML. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2013/2014

1) Il client(browser utilizzato) invia al server i dati inseriti dall utente. Server

04/05/2011. Lezione 6: Form

Interazione con l utente : i moduli.

PHP. A. Lorenzi, R. Giupponi, D. Iovino LINGUAGGI WEB. LATO SERVER E MOBILE COMPUTING Atlas. Copyright Istituto Italiano Edizioni Atlas

Metodologie Informatiche Applicate al Turismo

PHP e MySQL. Scripting server-side per accesso a DB MySQL

Lezione 6: Form 27/04/2012

BASI DI DATI Cos è il PHP. Cos è il PHP. Esercitazione su PHP & MySQL

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment

ESEMPI DI FORM (da

DURANTE LA NAVIGAZIONE NEI SITI WEB I VISITATORI NON SOLO POSSONO CONSULTARE INFORMAZIONI STATICHE

Progettazione Web Applicazioni client-server

Dott.ssa Adriana Pietramala

Corso di PHP. Prerequisiti. 6.1 PHP e il web 1. Conoscenza HTML Tecnica della programmazione Principi di programmazione web

Strumenti a disposizione

Esercitazione 8. Basi di dati e web

Lavorare con MySQL Parte Seconda.

I FORM. L'attributo action contiene l'url del file php a cui devono essere inviati i file per essere elaborati.

Il linguaggio HTML - Parte 3

RELAZIONE SCRITTA RELATIVA AL PROGRAMMA DI GESTIONE SITO E-COMMERCE

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6


Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

Applicazioni Web: meccanismi per il passaggio di informazioni tramite HTTP Corso di Applicazioni Telematiche

PHP E MYSQL CREAZIONE DI UN NUOVO DATABASE DAL PHPMYADMIN

Web Programming. Lezione 4: Cookie e Sessioni. Giulio Rossetti 14/04/2011. Guru@Work

Dott.ssa Adriana Pietramala. Dott.ssa Maria Vittoria Avolio

Indice Configurazione di PHP Test dell ambiente di sviluppo 28

MySQL Database Management System

19. LA PROGRAMMAZIONE LATO SERVER

MySQL Database Management System

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Architettura a tre livelli (1)

bool mysql_select_db([string database_name [,resource link_identifier]]) Connessione ad un server MySQL vuole conettere

Corso di Informatica. Prerequisiti. Modulo T3 B3 Programmazione lato server. Architettura client/server Conoscenze generali sui database

I Tag dell html. Parte quarta

Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2011/2012

Il Protocollo HTTP e la programmazione di estensioni Web

Corso di Sicurezza Informatica. Sicurezza del software. Ing. Gianluca Caminiti

PHP e MySQL. Guida scaricata da

MODULO 1 PARTE 3. Programmazione (scripting) server-side con PHP 3.a HTTP request e HTTP response (form e link)

Scrivere uno script php che, dato un array associativo PERSONE le cui chiavi sono i

HTML HTML. HyperText Markup Language. Struttura di un documento. Gli elementi essenziali di un documento HTML sono i seguenti TAG: <HTML>...

Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2012/2013

Lezione III: Oggetti ASP e interazione tramite form HTML

Laboratorio di Tecnologie Web Laurea in Scienze e Tecnologie Multimediali

GRUPPO DOMANDE N. 1. Quesito n. 1 Descrivere sinteticamente le finalità e le modalità d uso dei seguenti comandi UNIX / LINUX: LS, KILL, PS.

Form Editor. Dove NomeProfilo è personalizzabile.

DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER

PHP e Structured Query Language

Gestione Orario Lezioni: Schema del Database

Sicurezza Informatica: Tecniche di SQL INJECTION

Introduzione ai database relazionali

La principale particolarità del web dinamico è la possibilità di variare i contenuti delle pagine in base alle richieste degli utenti.

PHP - Storia. Inizialmente sviluppato da Rasmus Lerdorf come serie di script CGI

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

Capitolo 13. Interrogare una base di dati

Dispensa di database Access

Le Basi di Dati. Le Basi di Dati

Esercitazione sulle libpq - libreria C per PostgreSQL

<?php include './include/page.php';

Utilizzare PHP 5. Le variabili GET e POST

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Lezione nr. 5. Per creare un modulo è necessario avere delle conoscenze di base del linguaggio HTML. Niente di difficile ovviamente!

Lezione 9. Applicazioni tradizionali

CONCETTO DI ANNIDAMENTO

Appunti su ASP (Active Server Pages)

Università degli Studi di Cagliari Corso di Laurea in Ingegneria delle Telecomunicazioni.

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

Applicazione ASP di esempio

Facoltà di Farmacia - Corso di Informatica

Una metodologia di progettazione di applicazioni web centrate sui dati

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

PYTHON Inviare dati con i form A cura di Silvio Bonechi [sabandini_at_tiscali_dot_it] per

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

Progettazione di un Database

Laboratorio Progettazione Web PHP e MySQL. Andrea Marchetti IIT-CNR 2013/2014

Azioni. Select e join non consentono di modificare il contenuto del DB. Inserzione di nuovi dati. Azioni desiderate. Aggiornamento di dati

Obiettivo dell esercitazione

MODULO 1 PARTE 3. Programmazione (scripting) server-side con PHP 3.c Cookies e sessioni. Goy - a.a. 2012/2013 Programmazione Web 1

GERARCHIE RICORSIVE - SQL SERVER 2008

Procedure memorizzate SQL-2003/PSM. Forma base di PSM. Parametri in PSM

Tecnologie e Programmazione Web

Il Web Server e il protocollo HTTP

L aspetto dei file HTML

GESGOLF SMS ONLINE. Manuale per l utente

ISTRUZIONI INSTALLAZIONE PMANGO

MANUALE DI INTEGRAZIONE API SMSSmart (v 2.2)

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

Lezione nr. 8. Allora ecco come fare per recuperare le ultime tre tipologie di campo che ci sono rimaste da vedere.

Esercitazione PAM. (Php Apache MySQL)

SQL Server Integration Services. SQL Server 2005: ETL - 1. Integration Services Project

Concetti fondamentali dei database database Cos'è un database Principali database

Procedura SMS. Manuale Utente

connessioni tra i singoli elementi Hanno caratteristiche diverse e sono presentati con modalità diverse Tali relazioni vengono rappresentate QUINDI

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

Istruzioni DML di SQL

Cookie e Webstorage. Vediamo ora i metodi dell oggetto localstorage. Per memorizzare un valore si utilizza il metodo setitem:

Transcript:

WEP WEb Programming 4 Lucidi per il corso di Basi di Dati tenuto da Paolo Baldan presso l Università di Padova, anno accademico 2008/09 1

PHP e MySQL 2

Perché? 3 Le applicazioni hanno bisogno di operare su dati persistenti... e per gestire moli significative di dati (condivisi) la soluzione ovvia è un DB È opportuno separare logicamente (e fisicamente) la logica dell applicazione, dalla gestione dei dati (cfr. Architetture software, es: Architettura three-tier, MVC (model-viewcontrol,...) 3

Come? 4 L accesso a un server MySQL da PHP tramite un API La sequenza dei passi da effettuare è Effettuare una connessione al server Selezionare il DB o crearlo se non esiste Eseguire la/le query (creare tabelle, inserire o selezionare dati ) Nel caso di una select, elaborazione dei dati recuperati - con logica a cursore - memorizzandoli in un array 4

Connessione 5 Attiva una connessione e restituisce un identificatore per questa o una segnalazione di errore (FALSE) l identificatore della connessione sarà usato in tutti gli accessi successivi /* parametri per la connessione */ $host="localhost"; /* server MySQL */ $user="fabio"; /* utente */ $pwd= "xxxxx"; /* password */ /* connessione al server */ $conn=mysql_connect($host, $user, $pwd) or die($_server['php_self']. "Connessione fallita!"); 5

Messaggi di errore 6 Può essere comodo definire una funzione che dia informazioni dettagliate e personalizzate sull errore function fail($msg) { die($_server['php_self']. ": $msg<br />"); } da includere nei vari script require('errors.php');...... /* connessione al server */ $conn=mysql_connect($host, $user, $pwd) or fail("connessione fallita!"); 6

Esecuzione di una query 7 /* seleziona il database da usare */ $dbname="univ"; mysql_select_db($dbname); /* prepara lo statement: media dei voti degli studenti di una data provincia */ $prov="sp"; $query="select s.matricola, s.nome, s.cognome, ROUND(AVG(e.Voto)) AS Media FROM Studenti s JOIN ESAMI e ON (s.matricola=e.candidato) WHERE s.provincia=\"$prov\" GROUP BY s.matricola, s.nome, s.cognome"; 7

Esecuzione di una query 8 /* Stampa la query a video... utile per debug */ echo "<B>Query</B>: $query <BR />"; /*... e la esegue, ottenendo un handler per i risultati */ $studenti = mysql_query($query,$conn) or die("query fallita". mysql_error($conn)); 8

Qualche risultato? 9 Si può controllare la dimensione della tabella restituita dalla query eseguita con mysql_num_rows($risultato) Continuando l esempio... /* numero di righe nel risultato */ $num_righe=mysql_num_rows($studenti); if (! $num_righe) echo "<P>Nessuno studente della provincia di $prov ha fatto esami.</p>"; else { /* gestione del risultato non vuoto */ } 9

Recuperare i risultati 10 Il risultato di una query SELECT si elabora con una logica a cursore Per leggere la riga corrente in un array e posizionarsi sulla prossima $row = mysql_fetch_row($result) ritorna la riga corrente come un array enumerativo ($row[0] = primo campo, $row[1] secondo campo, etc.) $row = mysql_fetch_assoc($result) ritorna la riga corrente come un array associativo, indicizzato dai nomi dei campi $row = mysql_fetch_array($result) ritorna un array enumerato e associativo 10

Recuperare i risultati: enum 11 if (! $num_righe)... else { echo "<P>Trovati $num_righe studenti di $prov che hanno fatto esami.<br />"; echo "Ecco le loro medie:<br />"; while ($row = mysql_fetch_row($studenti)) { $matricola=$row[0]; /* primo campo */ $nome=$row[1]; /* secondo campo */ $cognome=$row[2]; /*... */ $media=$row[3]; /*... */ echo "$matricola - $nome $cognome - $media<br />"; }; echo "</P>"; MySQL1.php 11

Recuperare i risultati: assoc 12 if (! $num_righe)... else { echo "<P>Trovati $num_righe studenti di $prov che hanno fatto esami.<br />\n"; echo "Ecco le loro medie:<br />"; while ($row = mysql_fetch_assoc($studenti)) { $matricola=$row['matricola']; $nome=$row['nome']; $cognome=$row['cognome']; $media=$row['media']; echo "$matricola - $nome $cognome - $media<br />"; }; echo "</P>"; 12

Recuperare i risultati: array 13 if (! $num_righe)... else { echo "<P>Trovati $num_righe studenti di $prov che hanno fatto esami.<br />\n"; echo "Ecco le loro medie:<br />"; while ($row = mysql_fetch_array($studenti)) { $matricola=$row['matricola']; $nome=$row[1]; $cognome=$row['cognome']; $media=$row[3]; echo "$matricola - $nome $cognome - $media<br />"; }; echo "</P>"; 13

Visualizzare i risultati in una tabella HTML 14 /* funzione per stampare un array, come riga di tabella html */ function echo_row($row) { echo "<TR>"; foreach ($row as $field) echo "<TD>$field</TD>"; echo "</TR>"; };... /* Intestazione della tabella */ echo <TABLE border=\"1\"> <TR> <TH>Matricola</TH> <TH>Nome</TH> <TH>Cognome</TH> <TH>Media</TH> </TR> ; 14

Visualizzare i risultati in una tabella HTML 15 /* funzione per stampare un array, come riga di tabella html */ function echo_row($row) { echo "<TR>"; foreach ($row as $field) echo "<TD>$field</TD>"; echo "</TR>"; };... /* Intestazione della tabella con here document */ echo <<<END <TABLE border="1"> <TR> <TH>Matricola</TH> <TH>Nome</TH> <TH>Cognome</TH> <TH>Media</TH> </TR> END; 15

Visualizzare i risultati in una tabella HTML 16 /* stampa le righe della tabella */ while ($row = mysql_fetch_row($studenti)) echo_row($row); echo "</TABLE>"; MySQL2.php Nota: L uso di mysql_fetch_row è importante per il funzionamento di echo_row 16

LIMIT 17 Talvolta interessa un numero limitato di record come risposta da una select Questo può essere ottenuto con il costrutto SQL LIMIT start, max SELECT * FROM Studenti LIMIT 0,9; Il primo argomento della LIMIT è l offset ( la riga di partenza) l altro è il massimo numero di righe da ritornare Restituisce solo i record dal primo (indice 0) al decimo 17

Altre interrogazioni 18 Con lo stesso meccanismo si possono eseguire altri statement SQL /* inserimento... */ $query="insert INTO Docenti VALUES (\"MM1\", \"Mino\",\"Monti\")"; $ins=mysql_query($query,$conn) or die("inserimento fallito". mysql_error($conn)); /*... e la esegue, ottenendo un handler per i risultati */ $query="delete FROM Docenti WHERE CodDoc=\"MM1\""; $del=mysql_query($query,$conn) or die("cancellazione fallita". mysql_error($conn)); 18

Interazione con l utente 19

Form 20 L interazione con l utente avviene principalmente mediante l uso di form HTML HTML fornisce vari tag per visualizzare e formattare opportunamente le FORM Quando l utente conferma i dati nella form, le informazioni vengono codificate e inviate al server tramite HTTP Il server elabora i dati e li gestisce (nel nostro caso tramite PHP) <FORM action= pagina.php method= GET POST > <INPUT type= text name= username /> <INPUT type= radio name= color value= Rosso > <INPUT type= submit /> 20

Form 21 Una form ha in generale la seguente struttura <FORM action="manage_form.php" method="get POST"> input_1: <INPUT type="..." name="campo_1">... input_n: <INPUT type="..." name="campo_n"> <INPUT type="submit" value="procedi"> <INPUT type="reset" value="cancella"> </FORM> 21

Input 22 L input può essere di vari tipi Text Password Textarea Radio Checkbox Selection/Option (menù)... 22

Text, password, textarea 23 <FORM method="get" action="manage.php"> Nome <INPUT type="text" name="username"> <BR /><BR/ > Password <INPUT type="password" name="password" maxlength="8" size="8"> <BR /><BR/ > Commenti<BR /> <TEXTAREA name="comments" rows="7" cols="40"> </TEXTAREA> <BR /> <INPUT type="submit" value="invia"> <INPUT type="reset" value="cancella"> </FORM> FormText.html 23

Radio, Checkbox, Option 24 <FORM method="get" action="manage.php"> Iniziali del nome: <SELECT name="nome"> <OPTION>---</OPTION> <OPTION>A-H</OPTION> <OPTION>I-Z</OPTION> </SELECT> Provincia: <INPUT type="radio" name="prov" value="pi" /> PI <INPUT type="radio" name="prov" value="sp" /> SP <INPUT type="checkbox" name="tutor[]" value="has"/> Ha tutor <INPUT type="checkbox" name="tutor[]" value="is" /> E tutor... </FORM> FormChoice.html 24

Passaggi parametri: GET e POST 25 GET i parametri sono passati accodandoli alla URL del gestore della form http://localhost/manage.php?dato1=pippo&dato2=pluto la stringa dei parametri (visibile nel browser) viene detta query string può essere costruita artificialmente o inserita in un bookmark lunghezza massima querystring 256 caratteri POST i parametri vengono passati direttamente tramite protocollo HTTP non sono visibili 25

Gestione dei parametri 26 Uno script PHP può accedere ai parametri in tre modi $_POST["nomepar"] per il metodo POST $_GET["nomepar"] per il metodo GET Oppure accedendo all array globale delle richieste $_REQUEST["nomepar"] vale per entrambi i metodi lo script PHP è indipendente dal metodo usato dalla FORM Tutti i parametri di passaggio nelle form sono nell ambiente predefinito di php e sono quindi visualizzabili con la funzione phpinfo() 26

Pagine per form 27 La gestione delle form prevede due passi la visualizzazione della FORM in HTML gestione dei parametri in PHP Soluzione tipica: Due pagine distinte una in HTML (estensione.html) l altra come pagina PHP (estensione.php) 27

Esempio di Form 28 <FORM action="formstudenti.php" method="get"> Cognome: <INPUT type="text" name="cognome"><br /> Matricola: <INPUT type="text" name="matricola" maxlength="6"> <BR /><BR /> Iniziale del nome: <SELECT name="nome"> <OPTION>---</OPTION> <OPTION>A-H</OPTION> <OPTION>I-Z</OPTION> </SELECT> <BR /><BR /> Provincia: <INPUT type="radio" name="prov" value="pi" /> PI <INPUT type="radio" name="prov" value="sp" /> SP <BR /><BR /> FormStudenti.html 28

Esempio di Form 29 <INPUT type="checkbox" name="tutor[]" value="has" /> Ha un tutor <INPUT type="checkbox" name="tutor[]" value="is" /> E tutor <BR /><BR /> <TEXTAREA name="commento" rows="5"> Mah... </TEXTAREA> <BR /><BR /> <INPUT type="submit" value="invia"> </FORM> FormStudenti.html 29

Gestore della Form: Recupero dei parametri 30 I parametri della form possono essere recuperati dall array $_GET <?PHP $cognome = $_GET["cognome"]; $matricola = $_GET["matricola"]; $nome = $_GET["nome"]; $provincia = $_GET["prov"]; Nel caso di scelte multiple (es. checkbox e select), il parametro è un array if ($_GET["tutor"]) { $hatutor = in_array('has', $_GET["tutor"]); $etutor = in_array('is', $_GET["tutor"]); }; $commento = $_GET["commento"]; 30

Gestore della Form: Recupero dei parametri 31 In fase di debug è una buona idea stampare i parametri della form Qui lo facciamo con HERE document echo<<<end Ecco i parametri:<br /> <UL> <LI>Cognome: $cognome</li> <LI>Iniziali del nome: $nome</li> <LI>Matricola: $matricola</li> <LI>Provincia: $prov</li> <LI>Ha tutor?: $hatutor</li> <LI>È un tutor?: $etutor</li> <LI>Commento: $commento </LI> </UL> END; 31

Gestore della Form: Costruzione della query 32 Costruzione della query secondo le esigenze dell utente $query="select DISTINCT s.* FROM Studenti s"; /* da aggiungere in JOIN se si vuole che lo studente sia un Tutor */ if ($etutor) $join=" JOIN Studenti s1 ON (s.matricola = s1.tutor)"; /* clausola WHERE */ $where=" WHERE TRUE"; /* verifica se c'e` un vincolo sul cognome ed eventualmente lo aggiunge al WHERE */ if ($cognome) $where.= " AND s.cognome =\"". $cognome. "\""; 32

Gestore della Form: Costruzione della query 33 /* verifica se c'e` un vincolo su matricola ed eventualmente lo aggiunge al WHERE */ if ($matricola) $where.= " AND s.matricola =\"". $matricola. "\""; /* verifica se c'e` un vincolo su provincia ed eventualmente lo aggiunge al WHERE */ if ($prov) $where.= "AND s.provincia =\"". $prov. "\""; 33

Gestore della Form: Costruzione della query 34 /* da aggiungere nel WHERE se vogliamo che lo studente abbia un nome con iniziali prefissate */ switch ($nome) { case 'A-H': $where.= " AND (s.nome REGEXP \"[A-H].*\")"; break; case 'I-Z': $where.= " AND (s.nome REGEXP \"[I-Z].*\")"; break; /* se ($nome= --- ) non inserisce niente nel where! */ } 34

Gestore della Form: Costruzione della query 35 Costruzione della query secondo le esigenze dell utente /* da aggiungere nel WHERE se vogliamo che lo studente abbia un tutor */ if ($hatutor) $where.= " AND (s.tutor IS NOT NULL)"; /* completa la query */ $query = $query. $join. $where; /* come al solito conviene stamparla... */ echo "<B>Query</B>: $query"; /* e la esegue */ $studenti = mysql_query($query,$conn) or die("query fallita". mysql_error($conn)); 35

Gestore della Form: Output dei risultati 36 Funzioni di supporto per la gestione delle tabelle HTML /* Inizia una tabella html. In input l'array degli header delle colonne */ function table_start($row) { echo "<TABLE border=\"1\">"; echo "<TR>"; foreach ($row as $field) echo "<TH>$field</TH>"; echo "</TR>"; }; table_fun.php 36

Gestore della Form: Output dei risultati 37 Funzioni di supporto per la gestione delle tabelle HTML /* Stampa un array, come riga di tabella html */ function table_row($row) { echo "<TR>"; foreach ($row as $field) if ($field) /* gestione valori nulli! */ echo "<TD>$field</TD>"; else echo "<TD>---</TD>"; echo "</TR>"; }; /* funzione per terminare una tabella html */ function table_end() { echo "</TABLE>"; }; table_fun.php 37

Gestore della Form: Output dei risultati 38 Occorre includere il file delle funzioni con require("table_fun.php"); Quindi l ultima parte del codice per l ouput è /* fornisce in output i risultati in forma di tabella */ table_start(array("nome", "Cognome",!! "Matricola", "Nascita", "Provincia", "Tutor")); while ($row = mysql_fetch_row($studenti)) table_row($row); table_end(); 38

Gestore della Form: Controllo dei parametri 39 Spesso la prima cosa da fare è controllare che i parametri immessi nella form soddisfino i requisiti... valori nulli campi numerici lunghezza dei campi stringa spazi in eccesso all inizio o alla fine... (trim) 39

Gestore della Form: Controllo dei parametri 40 /* Verifica dei dati immessi */ /* Elimina spazi superflui */ $cognome = trim($cognome); $commento = trim($commento); $matricola = trim($matricola); /* la variabile "errore" indica se tra i dati abbiamo trovato un errore */ $errore=false; /* verifica che almeno uno tra matricola e cognome siano non vuoti */ if (!$cognome &&!$matricola) { echo "<B>Errore! Almeno uno tra nome e matricola devono essere specificati!</b><br />"; $errore=true; }; 40

Gestore della Form: Controllo dei parametri 41 /* verifica che la matricola sia numerica */ if ($matricola &&! ctype_digit($matricola)) { echo "<B>Errore! Matricola deve essere numerica!</b><br />"; $errore=true; }; /*... e il cognome alfabetico */ if (preg_match('/^[a-za-z]*$/', $cognome)) { echo "<B>Errore! Cognome deve essere alfabetico!</b><br />"; $errore=true; }; if (!$errore) { /* Inizia la costruzione della query */... }; 41

Form e gestore in un unico script 42 Soluzione diversa: form e gestore in un unico script Necessità di distinguere il caso in cui si deve mostrare la form e quello in cui si deve elaborarla Valore associato all input submit Uso di self if (isset($_request['submit'])) # trattamento dei parametri else { # visualizza la form echo<<<end <FORM method="post" action="$_server['php_self']">...... <INPUT type="submit" name="submit"> END; }; form.php 42

Form e gestore in un unico script 43 Es. mantenere il valore dei campi in caso di errore /* verifica se si esegue lo script per la prima volta: in questo caso bisogna presentare la form */ $first=! isset($_request["submit"]); if (! $first) { /* recupera i dati della form */ $nome=$_request['nome']; $cognome=$_request['cognome']; /* e verifica se il nome soddisfa i criteri */ $errore_nome =! preg_match("/^[a-za-z]*$/",$nome); };... SingleFile.php 43

Form e gestore in un unico script 44 if ($first $errore_nome) { /* se lo script si esegue per la prima volta oppure i dati sono errati mostra la form ed eventualmente segnala l errore */ $self = $_SERVER['PHP_SELF']; /* nome dello script corrente */ echo<<<end <FORM method="post" ACTION="$self"> Nome: <INPUT type="text" name="nome" value="$nome"> Cognome: <INPUT type="text" name="cognome" value="$cognome"> <INPUT type="submit" name="submit" value="invia"> <INPUT type="reset" value="cancella"> </FORM> END; /* e se c'era un errore nei dati lo segnala */... SingleFile.php 44

Form e gestore in un unico script 45 /* e se c'era un errore nei dati lo segnala */ if ($errore_nome) echo "<B>Errore nel nome!!! Deve essere alfabetico!</b>"; } else { /*! $first &&! $errore_nome */ /* se invece i dati ci sono e sono corretti, li elabora */ echo "elaboro i dati <BR />"; echo "Nome: $nome<br />"; echo "Cognome: $cognome<br />"; }; SingleFile.php 45

Invio di mail 46 Da uno script php possiamo inviare una email con la funzione mail (to, subject, body, headers) oppure mail (to, subject, body, headers) $to = 'fabio@cli.di.unipi.it'; $subject = 'Ieri'; $message = 'Ciao, come va?'; $headers = 'From: webmaster@bd.com'. "\r\n". 'Reply-To: webmaster@bd.com'; mail($to, $subject, $message, $headers); 46

Upload di file: form 47 Occorre utilizzare una form HTML adeguata... <FORM enctype="multipart/form-data" action="upload.php" method="post"> Nome del file: <INPUT type="hidden" name="max_file_size" value="30000" /> <INPUT type="file" name="myfile" /> <BR /> <INPUT type="submit" name="submit" value="invia" /> </FORM> Upload.html 47

Upload di file 48 I dati relativi ai file inviati sono accessibili mediante la variabile $_FILES $_FILES['userfile']['name'] Il nome del file sulla macchina di origine $_FILES['userfile']['type'] Il mime type del file (es. "image/gif"). Non sempre affidabile $_FILES['userfile']['size'] La dimensione del file $_FILES['userfile']['tmp_name'] Nome temporaneo del file sul server $_FILES['userfile']['error'] Codice di errore associato all upload 48

Upload di file: recupero dei dati 49 /* dimensione massima di upload */ define(dim_max,30000); /* directory locale per la memorizzazione */ $localdir="upload"; /* informazioni sul file */ $error= $_FILES["myfile"]["error"]; /* codice di errore */ $size = $_FILES["myfile"]["size"]; /* dimensione */ $type = $_FILES["myfile"]["type"]; /* mime-type */ $name = $_FILES["myfile"]["name"]; /* nome sul client */ $tmp = $_FILES["myfile"]["tmp_name"]; /* nome sul server */ Upload.php 49

Upload di file: error check 50 /* verif. se il file uploaded ha caratteristiche appropriate */ /* si e` verificato un errore? */ if ($error!= UPLOAD_ERR_OK) { echo "Errore di upload. Codice: $error<br />"; } /* tipo corretto? */ elseif (($type!= "image/gif")! && ($type!= "image/jpeg")) { echo "Errore: File di tipo $type. Errato! <BR />"; } /* dimensione */ elseif ($size > DIM_MAX) { echo "Errore: File troppo grande ($size bytes)! <BR />"; } else { /* Tutto ok! Mostra i dati */ Upload.php Upload.php 50

Upload di file: recupera il file 51 /* recupera il file */ /* se non è già presente... */ if (file_exists($locadir. "/". $name)) { echo $name. " gia` presente. "; } else { /* lo porta a destinazione... */ move_uploaded_file($tmp, $localdir. "/". $name); echo "Memorizzato in: ". $localdir. "/". $name; } }; Upload.php 51

Upload di file 52 Quando si gestiscono operazioni invasive come un upload, può essere opportuno tenere un logfile Supporto in PHP per operare sul log di sistema (/var/log/system.log) Esempio openlog( Upload.php, LOG_PID, LOG_LOCAL0)... syslog(log_warning, "Upload di $name da parte di ". $_SERVER["SERVER_ADDR"]); closelog() 52