Lezione Precedente | Elenco Lezioni | Lezione Successiva |
Ora che abbiamo imparato come scrivere della pagine PHP che leggono da una base di dati, vediamo come realizzare altre pagine che effettuino operazioni di inserimento. In particolare, vogliamo implementare la funzionalità di inserimento di un nuovo oggetto nel database mancolista. Notare che, secondo la specifica, tale operazione dovrebbe essere consentita esclusivamente agli amministratori del sito, ma per il momento ignoriamo questa problematica.
Abbiamo visto nella lezione scorsa come è possibile passare parametri ad uno script PHP tramite la barra degli indirizzi. Fino ad ora, però, passavamo come parametro semplicemente l'id di un oggetto di cui volevamo avere i dettagli. Ora, invece, la procedura PHP che si occupa di inserire nuovi oggetti deve accettare vari parametri come il nome dell'oggetto da creare, descrizioni lunghe e corte, categorie, etc... La cosa non è però differente dal punto di vista concettuale. Possiamo allora scrivere la seguente pagina, che chiamiamo inserimento.php
.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Inserimento Oggetti Mancolista di Paolo</title> </head> <body> <?php <require 'config.php'; $conn=new PDO(DSN,USERNAME,PASSWORD); $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $stmt=$conn->prepare("INSERT INTO oggetti (nome,descrizione,descrizione_lunga,categoria_id) VALUES (?,?,?,?)"); $stmt->execute(array($_GET['nome'],$_GET['descrizione'],$_GET['descrizione_lunga'],$_GET['categoria_id'])); echo "Inserimento avvenuto"; ?> </body> </html>
In questo programma non troviamo niente di nuovo rispetto a quello che abbiamo già visto. Notare che non utilizziamo il metodo PDOStatement::fetch
perché il comando INSERT
non resituisce alcun risultato. Se l'inserimento avviene, visualizziamo il messaggio Inserimento avvenuto
, mentre se per qualche motivo l'inserimento non può avvenire (ad esempio, non specifichiamo il parametro $_GET['nome']
, che quindi assume il valore di default null) si genera una eccezione.
Per controllare se la pagina funziona, basta utilizzare una URL come quella che segue:
http://hostname/percorso/inserimento.phpnome=xyz&descrizione=aa&descrizione_lunga=prova&categoria_id=1
Al solito, non è pensabile che l'utente del sito specifichi tali parametri direttamente sulla URL. D'altronde, non è possibile fornire tutte queste informazioni semplicemente con l'uso di link opportuni come fatto per la pagina di dettagli. Serve un nuovo meccanismo di interazione con l'utente: le FORM. Consideriamo ad esempio la seguente pagina:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">param.php
vista la lezione precedente e la visualizzazione di option
:<option>
e
</option>
è
quello che viene passato allo
script param.php
.
Questo è il motivo per cui
selezionando Valore 1
viene passata allo script
successivo la stringa v1
.Vediamo di integrare la pagina inserimento.php
con le FORM. L'idea è creare una pagina HTML con una form per l'immissione dei dati, che invochi la pagina inserimento.php
con i dati opportuno. Il tutto è realizzato da questi due file:
Invece di avere due file distinti, uno per la form e l'altro per la procedura di inserimento, si può integrare il tutto in un unico script PHP. Quando viene chiamato senza parametri, visualizzerà la form di richiesta dati, altrimenti effettuerà la procedura di inserimento. Si ottiene il seguente file:
isset
per stabilire se il parametro $_GET['nome']
è stato fornito oppure no. Se non è presente, vuol dire che deve essere presentata la FORM di immissione dati. Dopo che l'utente ha immesso i dati e cliccato sul pulsante Inserisci
, la pagina inserimento-totale.php
viene ricaricata, ma stavolta il parametro $_GET['nome']
è presente, e viene eseguita la procedura di inserimento.action
vuoto nel tag FORM
: il campo action vuoto indica la pagina web corrente. Equivale a scrivere inserimento-totale.php
ma è più comodo, perché se decidiamo di cambiare nome al file non è necessario effettuare nessuna modifica alla form.Questa soluzione può essere vantaggiosa per tenere in un unico file tutto il codice PHP e HTML richiesto per una applicazione ben specifica. D'altronde la soluzione con due file distinti è più modulare... occorre giudicare dai casi.
La form che abbiamo usato qui sopra non è proprio adatta ad un utente comune: quest'ultimo, infatti, non è detto che conosca quali sono le categorie al momento presenti nel database, e sicuramente non ne conosce i codici numerici, che è invece il dato che la form si aspetta nel campo ID categoria
. Bisogna modificare la form in modo che compaia un elenco di categorie valide tra cui scegliere. Questa è una prima soluzione:
Questa soluzione ha il difetto che ogni volta che aggiungiamo o eliminiamo una categoria dalla
base di dati, occorre modificare la pagina web. Quello che bisogna fare è generare un FORM automaticamente sulla base dei dati presenti nella tabella categoria
. Consideriamo la seguente modifica del file di
prima:
Questo nuovo script interroga il database MySQL per determinare quali sono le categorie disponibili, e costruisce dei campi di input di tipo SELECT appropriati. Modifiche alla base di dati si riflettono immediatamente sulle pagine web generate: non occorre quindi nessuna manutenzione speciale per adattare il sito web alla nuova situazione.
GET
il valore di default dell'attributo method
, in
realtà questa specifica è facoltativa. Tuttavia, esiste un altro metodo per il passaggio dei parametri
ad uno script, il metodo POST.
FORM
;Se scendiamo fino a livello del protocollo HTTP, due sono le differenze fondamentali tra le richieste GET e quelle POST:
Ad esempio, consideriamo la form vista all'inizio della lezione, adoperata per passare parametri opportuni a param.php
. Nel caso di utilizzo del metodo GET, una tipica richiesta HTTP sarà la seguente:
GET /~amato/param.php?param1=pippo¶m2=Valore+1 HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.7,it;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost/~amato/param.html
Se però modifichiamo il sorgente della form sostituendo POST
a GET
nell'attributo METHOD
ed effettuiamo un'altra richiesta, questa si presenterà così:
POST /~amato/param.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.7,it;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost/~amato/param.html Cache-Control: max-age=0 Content-Type: application/x-www-form-urlencoded Content-Length: 28 param1=pippo¶m2=Valore+1
Sono state evidenziate in rosso le differenze più significative. Notare che l'intestazione termina con le righe Content-Type
e Content-Length
che indicano la presenza di un corpo della richiesta, e che la stringa param1=pippo¶m2=Valore+1
viene passata appunto nel corpo e non nella URL.
Lezione Precedente | Elenco Lezioni | Lezione Successiva |