Diapositiva 1 - Dipartimento di Scienze Ambientali, Informatica e

Transcript

Diapositiva 1 - Dipartimento di Scienze Ambientali, Informatica e
Laboratorio Basi di Dati
Esercitazione
[email protected]
Luca Cosmo
Dipartimento di Scienze Ambientali, Informatica e Statistica
Università Ca’ Foscari di Venezia, Italia
Esercizio:
Sviluppare un sito web che permetta agli utenti registrati di inserire le proprie foto.
Alle foto inserite è possibile associare un titolo e dei tag. Inoltre le foto possono
essere inserite come pubbliche, per cui visibile da tutti (anche gli utenti non registrati),
oppure come private. In quest’ultimo caso esse sono visibili sono all’utente che le ha
inserite.
Requisiti addizionali:
•
Per motivi di sicurezza nel database deve essere salvato solo il digest md5 della
password.
•
Il visulalizzatore delle foto dovrà permettere di scorrere le foto senza ricaricare la
pagina (AJAX).
Database:
Schema Relazionale:
FOTO
UTENTI
PK
id_utente
username
password
email
PK
FILE
id_foto
PK
FK2
FK1
titolo
tags
id_file
id_utente
id_file
type
data
INTERFACCE
Username
Album
Password
Cerca
INTERFACCE
Ciao User
Logout
Album
Tutte
Private
Nuova
Cerca
INTERFACCE
Username
Album
Password
Cerca
INTERFACCE
Ciao User
Logout
Album
Tutte
Private
Nuova
Cerca
Titolo
Tags
Privata
C:\\imma…
AGGIUNGI
Upload di immagini
LATO HTML:
•
Per inviare un file possiamo usare il tag input con tipo file.
•
Il corrispondente form deve avere coma action POST ed è necessario
impostare l’attributo enctype="multipart/form-data"
<form id="image_form"
action="insert.php" method="post"
enctype="multipart/form-data">
<input type="file" name="file" id="file“ onchange="readURL(this);">
<br>
Title: <input type="text" name="title" ><br>
<input type="submit" name="submit" value="Submit">
</form>
Upload di immagini
LATO PHP:
•
PHP salva tutti i file ricevuti in una cartella temporanea.
•
La variabile gloabale $_FILES è un array che contiene tutte le
informazioni dei file ricevuti mediante una form.
•
$_FILES[’name’][‘tmp_name’] per esempio è il path che punta al file
temporaneo.
Salvare il file:
Sono possibili due strategia:
1. Copiare il file temporaneo in una cartella del filesystem e
salvare il relativo url nel DB.
2. Salvare l’intero file in una tabella del database (attributi di tipo
bytea)
Upload di immagini
Creare la tabella nel database:
CREATE TABLE file (
id_file integer NOT NULL,
type character varying(100) NOT NULL,
data bytea NOT NULL,
valid boolean );
Inserire il file nel database:
•
fopen ci restituisce lo strem del file indicizzato dal path passato.
•
Per inserire un file binario dobbiamo eseguire un preparedStatement in
cui abbiamo associato al parametro relativo all’attributo di tipo bytea lo
stream del file (specificandone come tipo: PDO::PARAM_LOB)
•
RETURNING id_file fa si che la query restituisca l’ide dell’elemento
appena inserrito.
$data = fopen($_FILES["file"]["tmp_name"],'r');
$q ='insert into file(type,data) values (?,?) RETURNING id_file';
$result = $connection->prepare($q);
$result->bindParam(1,$_FILES["file"]["type"]);
$result->bindParam(2,$data, PDO::PARAM_LOB);
$result->execute();
$row = $result->fetch();
$justinsertedid = $row['id_file'];
Upload di immagini
Recuperare e visualizzare un immagine:
Se avevamo salvato un immagine nel DB , per visualizzarla dobbiamo:
•
Impostare come URL una pagina PHPche si occupera di recuperare
l’immagine nel DB e restituirla.
<img src='getimage.php?id=1'>
•
Nella pagina PHP recuperare l’immagine dal DB, impostare gli header di
risposta e copiare l’immagine nell’output stream della pagina.
$result = $connection->query(
"SELECT * from file where id_file=".$_GET['id']);
//Associamo alla varibile $file il file recuperato dal db
$result->bindColumn('data', $file, PDO::PARAM_LOB);
$row = $result->fetch(PDO::FETCH_BOUND);
// Impostiamo nell'header il tipo del contenuto dell'url, per
esmpio image/jpeg
header('Content-Type: '.$row['type']);
// Passiamo come contenuto della pagina il file recuperato
fpassthru($file);
Libreria jQuery
$(arg) è una funzione che restituisce un oggetto rappresentante un
elemento del DOM + alcuni metodi molto utili!
$(‘selettore’) restituisci il metodo rappresentante i/il nodi/o del DOM
identificato da selettore (sintassi CSS).
•
e.g. $(‘#logo’) seleziona l’elemento con id logo
Alcune funzioni:
$(‘selettore’).html(‘html code’) inserisce il codice html passato all’interno
dell’elemento (come innerHTML(‘…’)).
$(‘selettore’).click(function(){ … }) chiama la funzione passata
all’evento onClick.
$(document).ready(funzione) viene chiamato al caricamento del documento
(simile a onLoad del body).
$(‘sel’).attr(‘attrname’) restituisce il valore dell’attributo
$(‘sel’).attr(‘attrname’,’value’) impostil valore dell’attributo.
$.post(‘url’,sent_data,function(received_data){…}) permette di
fare una richiesta AJAX al server. Al completamento della richiesta viene
eseguita la funzione passata dove received_data è la pagina mandata dal
server.