Guido Moroni 5^D mercurio RELAZIONE E-commerce Guido Moroni 5^D mercurio ITE A. Bassi Anno scolastico 2012/2013 Indice 0) Intestazione……………………………………………………………………………………………………………………………....1 1) Traccia del problema………………………………………………………………………………………………………………….2 2) Analisi di massima………………………………………………………………………………………………………………………2 3) Analisi completa…………………………………………………………………………………………………………………………4 a) Modello E/R…………………………………………………………………………………………………………………….4 b) Modello concettuale……………………………………………………………………………………………………….5 c) Tabella delle variabili……………………………………………………………………………………………………….6 d) Elenco tabelle…………………………………………………………………………………………………………………7 e) Vincoli di relazione………………………………………………………………………………………………………….7 f) Concetto di integrità referenziale…………………………………………………………………………………….8 g) Query………………………………………………………………………………………………………………………………8 4) Area applicativa………………………………………………………………………………………………………………………..17 a) Pagine html e php…………………………………………………………………………………………………………17 b) Spiegazione del sito………………………………………………………………………………………………………96 c) Login e logout………………………………………………………………………………………………………………..96 d) Inserimento nel database……………………………………………………………………………………………..97 e) Modifica e cancellazione……………………………………………………………………………………………….97 f) Interrogazione……………………………………………………………………………………………………………….97 5) Manuale tecnico: come installare il database su altervista e xampp…………………………………………97 6) Come configurare il sito………………………………………………………………………………………………………….108 1 Torna all’indice Guido Moroni 5^D mercurio 7) Descrizione del sito…………………………………………………………………………………………………………………108 8) Parte didattica tecnica……………………………………………………………………………………………………………110 a) Che cos’è un database (differenza tra InnoDB e MyISAM)…………………………………………..110 b) Che cos’è un server web……………………………………………………………………………………………..111 c) Differenza tra pagine web statiche e dinamiche………………………………………………………….111 d) Che cos’è MySQL…………………………………………………………………………………………………………112 e) Che cos’è il PHP…………………………………………………………………………………………………………..113 TRACCIA DEL PROBLEMA L’Ipermercato Bennet di Pieve Fissiraga vuole tener traccia dei prodotti acquistati dai clienti. Di ogni cliente si vuole conoscere nome, cognome, indirizzo e data di nascita. Di ogni tipo di prodotto è necessario sapere codice, marca, nome, scorte e prezzo di listino. Per ogni acquisto le casse emettono uno scontrino caratterizzato dal numero della cassa, dalla data, dall’elenco dei prodotti acquistati, dal prezzo di acquisto e dalla quantità di ogni prodotto. Realizzare un sito web tipo ecommerce che consenta di gestire l’intera procedura informatica, che permetta al visitatore di visualizzare i prodotti presenti in magazzino (anche senza loggarsi) e che consenta al responsabile 2 Torna all’indice Guido Moroni 5^D mercurio del Bennet di visualizzare i clienti ed effettuare operazioni di aggiornamento sugli archivi clienti e prodotti. ANALISI DI MASSIMA Il programmatore opera nel settore commercio elettronico (e-commerce) che richiede una soluzione informatica per la gestione principalmente degli archivi Prodotti e Utenti. Per la realizzazione del progetto si è scelto di utilizzare il linguaggio di programmazione web PHP integrato opportunamente con HTML e CSS. Per la memorizzazione dei dati si è scelto di utilizzare un Database con il linguaggio SQL più precisamente attraverso il DBMS MySQL. Oltre alla realizzazione del database vero e proprio, viene richiesto al programmatore un sito web che permetta agli amministratori dell’e-commerce la gestione dell'archivio (prodotti, clienti) e agli utenti di acquistare i prodotti nel catalogo registrandosi al sito attraverso un'interfaccia grafica user-friendly ovvero un software di facile usabilità che prenda l'utente “per mano” grazie ad una interfaccia grafica accattivante e all'uso di menu, pulsanti, icone, mouse ecc. 3 Torna all’indice Guido Moroni 5^D mercurio ANALISI COMPLETA MODELLO E/R 1) AREA CLIENTE/UTENTE 4 Torna all’indice Guido Moroni 5^D mercurio 2) AREA AMMINISTRATORE MODELLO CONCETTUALE - province (id_provincia, siglaprovincia, nomeprovincia); - utenti (id_utente, nome, cognome, citta, id_provincia, indirizzo, cap, email, password); FK (id_provincia) REF province (id_provincia); - categorie (cod_categoria, nome_categoria); - marche (cod_marca, nome_marca, cod_categoria); FK (cod_categoria) REF categorie (cod_categoria); - reparti (cod_reparto, nome_reparto, cod_categoria); FK (cod_categoria) REF categorie (cod_categoria); - prodotti (cod_prodotto, nome_prodotto, cod_reparto, cod_marca, prezzo, quantita, descrizione, immagine); FK (cod_reparto) REF reparti (cod_reparto); FK (cod_marca) REF marche (cod_marca); - ordini (id_utente, cod_prodotto, quantita); FK (id_utente) REF utenti (id_utente); FK (cod_prodotto) REF categorie (cod_prodotto); - acquisti (cod_acquisto, id_utente, cod_prodotto, quantita); FK (id_utente) REF utenti (id_utente); FK (cod_prodotto) REF categorie (cod_prodotto); 5 Torna all’indice Guido Moroni 5^D mercurio - admin (id_admin, nome, cognome, email, admin_name, password); NB: le chiavi primarie (primary key) sono indicate con la sottolineatura mentre le chiavi esterne (foreign key) con il corsivo. TABELLA DELLE VARIABILI Nome variabile $conn Tipo Boolean Pagina Config.php $nome_db $db $indirizzo String Boolean String $tempo Integer Config.php Config.php Tutte le pagine (in quanto la funzione reload viene spesso richiamata) Tutte le pagine(in quanto la funzione reload viene spesso richiamata) $query String Tutte le pagine $i $dati Integer String Tutte le pagine Tutte le pagine $riga String (vettore) Tutte le pagine $nome $indirizzo $cap $email String String Integer String $password String $rip_pass String Utente-registrazione.php Utente-registrazione.php Utente-registrazione.php Utente-registrazione.php/ login.php Utente-registrazione.php/ login.php Utente-registrazione.php $quantita Integer $cod Integer Utente-ordini.php/ Utente-acquisti.php/ Prodotti-ins.php/ Prodotti-mod.php Utente-ordini.php/ Utente-acquisti.php/ Prodotti-ins.php/ 6 Torna all’indice Funzione Collegamento al server Nome del database Accesso al database Indirizzo delle pagine dell’applicazione web Tempo di reindirizzamento della funzione “reload” Contiene il testo delle query da eseguire Contatore numerico Contiene il risultato di una query Contiene un record(riga) estratto dalla query Nome dell’utente Indirizzo dell’utente Cap dell’utente Email dell’utente Password dell’utente Ripetizione per il controllo della password Quantita della merce in magazzino o quantita da scalare Codice del prodotto Guido Moroni 5^D mercurio $num_record Integer $prezzo Decimal Prodotti-mod.php/ Prodotti-canc.php Numero dei record Catalogo.php/ Utente-ordini.php/ Utente-acquisti.php/ Prodotti-ins.php/ Prodotti-mod.php/ Numero dei record estratti da una query Prezzo del prodotto ELENCO DELLE TABELLE Le specifiche per la creazione del database richiedono che sia costituito dalle seguenti entità: PROVINCE: tabella che contiene le provincie italiane; UTENTI: contiene i principali dati anagrafici degli clienti (nome, cognome, indirizzo ecc..) oltre che un codice numerico univoco; CATEGORIE: contiene le categorie di prodotti presenti all’interno dell’e-commerce; MARCHE: questa entità contiene le possibili marche assegnabili ai vari prodotti a seconda della categoria a cui appartengono; REPARTI: tabella al cui interno troviamo i reparti a cui appartengono i prodotti in base alla categoria; PRODOTTI: questa tabella raccoglie i dati relativi ai prodotti in vendita presenti nel catalogo (codice prodotto, nome, codice categoria, codice reparto, codice marca, prezzo, scorte, descrizione); ACQUISTI: tabella necessaria per collegare, attraverso una relazione molti a molti, l'entità Utenti e l'entità Prodotti. Contiene il codice dell'utente, il codice del prodotto, la quantità acquistata, la data e una chiave numerica che permette all’utente di riacquistare successivamente un prodotto già in precedenza comprato; ORDINI: tabella necessaria per collegare, attraverso una relazione molti a molti, l'entità Utenti e l'entità Prodotti. Contiene il codice dell'utente, il codice del prodotto e la quantità in modo da memorizzare i prodotti ordinati ma non ancora acquistati; ADMIN: tabella non collegata a nessuna delle precedenti. Qui sono contenuti i dati degli amministratori che accedendo all’apposita area possono gestire le altre tabelle della base di dati; VINCOLI DI RELAZIONE Le relazioni, come già detto in precedenza, sono: del tipo molti a molti e si instaurano tra le entità “Prodotti” e “Utenti” attraverso le tabelle “Acquisti” & “Ordini” mentre le altre relazioni sono tutte del tipo 1 a molti e vengono “risolte” semplicemente inserendo la chiave esterna sul lato 1. 7 Torna all’indice Guido Moroni 5^D mercurio CONCETTO DI INTEGRITA’ REFERENZIALE La integrità referenziale è una proprietà dei dati che, se soddisfatta, richiede che ogni valore di un attributo (colonna) di una relazione (tabella) esista come valore di un altro attributo in un'altra (o nella stessa) relazione. Meno formalmente, nei database relazionali, perché sia rispettata l'integrità referenziale, ogni campo in una tabella che sia stato dichiarato come foreign key può contenere solo valori della chiave primaria o chiave candidata di una tabella "madre". Per esempio, cancellare un record che contiene un valore a cui fa riferimento una foreign key di un'altra tabella violerebbe l'integrità relazionale. Alcuni RDBMS possono garantire l'integrità relazionale, o cancellando le rispettive righe di foreign key, ovvero interrompendo l'operazione e non effettuando la cancellazione. Spesso si può scegliere quale metodo usare attraverso un vincolo di integrità relazionale definito in un data dictionary. QUERY - Di creazione: CREATE DATABASE bennet; USE bennet; --- Database: `bennet` --- ---------------------------------------------------------- Struttura della tabella `province` -CREATE TABLE IF NOT EXISTS `province` ( `idprovincia` int(4) NOT NULL, `nomeprovincia` varchar(20) NOT NULL, `siglaprovincia` varchar(2) NOT NULL, PRIMARY KEY (`idprovincia`) ) ENGINE=InnoDB; 8 Torna all’indice Guido Moroni 5^D mercurio --- Dump dei dati per la tabella `province` -INSERT INTO `province` (`idprovincia`, `nomeprovincia`, `siglaprovincia`) VALUES (1, 'Ancona', 'AN'), (2, 'Macerata', 'MC'), (3, 'Pesaro Urbino', 'PU'), (4, 'Ascoli Piceno', 'AP'), (5, 'Alessandria', 'AL'), (6, 'Asti', 'AT'), (7, 'Biella', 'BI'), (8, 'Cuneo', 'CN'), (9, 'Novara', 'NO'), (10, 'Vercelli', 'VC'), (11, 'Torino', 'TO'), (12, 'Agrigento', 'AG'), (13, 'Caltanissetta', 'CL'), (14, 'Catania', 'CT'), (15, 'Enna', 'EN'), (16, 'Messina', 'ME'), (17, 'Palermo', 'PA'), (18, 'Ragusa', 'RG'), (19, 'Siracusa', 'SR'), (20, 'Trapani', 'TP'), (21, 'Catanzaro', 'CZ'), (22, 'Cosenza', 'CS'), (23, 'Crotone', 'KR'), (24, 'Reggio Calabria', 'RC'), (25, 'Vibo Valentia', 'VV'), (26, 'Verbania', 'VB'), (27, 'Matera', 'MT'), (28, 'Potenza', 'PZ'), (29, 'Bari', 'BA'), (30, 'Brindisi', 'BR'), (31, 'Foggia', 'FG'), (32, 'Lecce', 'LE'), (33, 'Taranto', 'TA'), (34, 'Avellino', 'AV'), (35, 'Benevento', 'BN'), (36, 'Caserta', 'CE'), (37, 'Napoli', 'NA'), (38, 'Salerno', 'SA'), (39, 'Frosinone', 'FR'), (40, 'Latina', 'LT'), (41, 'Rieti', 'RI'), (42, 'Roma', 'RM'), 9 Torna all’indice Guido Moroni 5^D mercurio (43, 'Viterbo', 'VT'), (44, 'Chieti', 'CH'), (45, 'L''Aquila', 'AQ'), (46, 'Pescara', 'PE'), (47, 'Teramo', 'TE'), (48, 'Arezzo', 'AR'), (49, 'Firenze', 'FI'), (50, 'Grosseto', 'GR'), (51, 'Livorno', 'LI'), (52, 'Lucca', 'LU'), (53, 'Massa Carrara', 'MS'), (54, 'Pisa', 'PI'), (55, 'Pistoia', 'PT'), (56, 'Siena', 'SI'), (57, 'Bologna', 'BO'), (58, 'Ferrara', 'FE'), (59, 'Forl? Cesena', 'FC'), (60, 'Modena', 'MO'), (61, 'Parma', 'PR'), (62, 'Piacenza', 'PC'), (63, 'Ravenna', 'RA'), (64, 'Reggio Emilia', 'RE'), (65, 'Rimini', 'RN'), (66, 'Belluno', 'BL'), (67, 'Padova', 'PD'), (68, 'Rovigo', 'RO'), (69, 'Treviso', 'TV'), (70, 'Venezia', 'VE'), (71, 'Verona', 'VR'), (72, 'Vicenza', 'VI'), (73, 'Gorizia', 'GO'), (74, 'Pordenone', 'PN'), (75, 'Udine', 'UD'), (76, 'Trieste', 'TS'), (77, 'Aosta', 'AO'), (78, 'Cagliari', 'CA'), (79, 'Nuoro', 'NU'), (80, 'Oristano', 'OR'), (81, 'Sassari', 'SS'), (82, 'Genova', 'GE'), (83, 'Imperia', 'IM'), (84, 'Savona', 'SV'), (85, 'La Spezia', 'SP'), (86, 'Isernia', 'IS'), (87, 'Campobasso', 'CB'), (88, 'Perugia', 'PG'), (89, 'Terni', 'TR'), 10 Torna all’indice Guido Moroni 5^D mercurio (90, 'Bergamo', 'BG'), (91, 'Brescia', 'BS'), (92, 'Como', 'CO'), (93, 'Cremona', 'CR'), (94, 'Lecco', 'LC'), (95, 'Lodi', 'LO'), (96, 'Mantova', 'MN'), (97, 'Milano', 'MI'), (98, 'Pavia', 'PV'), (99, 'Sondrio', 'SO'), (100, 'Varese', 'VA'), (101, 'Trento', 'TN'), (102, 'Bolzano', 'BZ'), (103, 'Prato', 'PO'), (105, 'Carbonia Iglesias', 'CI'), (106, 'Medio Campidano', 'VS'), (107, 'Ogliastra', 'OG'), (108, 'Olbia Tempio', 'OT'); -- ---------------------------------------------------------- Struttura della tabella `utenti` -CREATE TABLE IF NOT EXISTS `utenti` ( `id_utente` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(50) NOT NULL, `cognome` varchar(50) NOT NULL, `indirizzo` varchar(60) NOT NULL, `citta` varchar(60) NOT NULL, `cap` int(5) NOT NULL, `idprovincia` int(3) NOT NULL, `email` varchar(60) NOT NULL, `password` varchar(100) NOT NULL, PRIMARY KEY (`id_utente`), FOREIGN KEY (`idprovincia`) REFERENCES province(`idprovincia`) ON UPDATE CASCADE ) ENGINE=InnoDB COMMENT='tabella clienti ' AUTO_INCREMENT=7; --- Dump dei dati per la tabella `utenti` -INSERT INTO `utenti` (`id_utente`, `nome`, `cognome`, `indirizzo`, `citta`, `cap`, `idprovincia`, `email`, `password`) VALUES (1, 'Guido', 'Moroni', 'via manzoni 101', 'Paullo', 20067, 97, '[email protected]', 'moroni'), 11 Torna all’indice Guido Moroni 5^D mercurio (2, 'Mario', 'Monti', 'via dai coglioni 21', 'Mantova', 23094, 96, '[email protected]', 'monti56'), (3, 'Vincenzo', 'Dagostino', 'via giovanni XXIII', 'Lodi', 24545, 95, '[email protected]', 'fagone'), (4, 'Simona', 'Ponti', 'Via jkasdfn 23', 'barcellona pozzo di gotto', 34783, 14, '[email protected]', 'simona12'), (5, 'Mario', 'Rossi', 'via masdfas 238', 'milano', 22343, 97, '[email protected]', 'mario3'), (6, 'MArio', 'JKSADFHN', 'SKDFNKJS', 'KDJNSJK', 998, 12, '[email protected]', 'aaaaaaa'); CREATE TABLE `categorie`( `cod_categoria` INT AUTO_INCREMENT, `nome_categoria` VARCHAR(40) NOT NULL, PRIMARY KEY(`cod_categoria`) ) ENGINE=INNODB AUTO_INCREMENT=4 ; --- Dump dei dati per la tabella `categorie` -INSERT INTO `categorie` (`cod_categoria`, `nome_categoria`) VALUES (1, 'elettronica'), (2, 'libri'), (3, 'musica'); -- -------------------------------------------------------- CREATE TABLE `reparti`( `cod_reparto` INT AUTO_INCREMENT, `nome_reparto` VARCHAR(40) NOT NULL, `cod_categoria` INT NOT NULL, PRIMARY KEY(`cod_reparto`), FOREIGN KEY(`cod_categoria`) REFERENCES categorie(`cod_categoria`) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=INNODB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 12 Torna all’indice Guido Moroni 5^D mercurio --- Dump dei dati per la tabella `reparti` -INSERT INTO `reparti` (`cod_reparto`, `nome_reparto`, `cod_categoria`) VALUES (1, 'telefonia mobile', 1), (2, 'PC e portatili', 1), (3, 'romanzi', 2), (4, 'testi teatrali', 2), (5, 'racconti', 2), (6, 'Rock', 3), (7, 'Rap e Hip-Hop', 3), (8, 'Pop', 3); CREATE TABLE `marche`( `cod_marca` INT AUTO_INCREMENT, `nome_marca` VARCHAR(40) NOT NULL, `cod_categoria` INT NOT NULL, PRIMARY KEY(`cod_marca`), FOREIGN KEY(`cod_categoria`) REFERENCES categorie(`cod_categoria`) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=INNODB AUTO_INCREMENT=10 ; --- Dump dei dati per la tabella `marche` -INSERT INTO `marche` (`cod_marca`, `nome_marca`, `cod_categoria`) VALUES (1, 'Samsung', 1), (2, 'Apple', 1), (3, 'Nokia', 1), (4, 'Sony', 1), (5, 'feltrinelli', 2), (6, 'mondadori', 2), (7, 'Warner Bros', 3), (8, 'MCA Records', 3), (9, 'Columbia', 3); -- -------------------------------------------------------- CREATE TABLE `prodotti`( `cod_prodotto` INT AUTO_INCREMENT, `nome_prodotto` VARCHAR(50) NOT NULL, 13 Torna all’indice Guido Moroni 5^D mercurio `cod_marca` INT NOT NULL, `cod_reparto` INT NOT NULL, `prezzo` DECIMAL(7,2) NOT NULL, `quantita` INT(5) NOT NULL, `descrizione` VARCHAR(300) NOT NULL, `immagine` VARCHAR(50) NOT NULL, PRIMARY KEY(`cod_prodotto`), FOREIGN KEY(`cod_marca`) REFERENCES marche(`cod_marca`) ON UPDATE CASCADE, FOREIGN KEY(`cod_reparto`) REFERENCES reparti(`cod_reparto`) ON UPDATE CASCADE )ENGINE=INNODB DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ; INSERT INTO `prodotti` (`cod_prodotto`, `nome_prodotto`, `cod_marca`, `cod_reparto`, `prezzo`, `quantita`, `descrizione`, `immagine`) VALUES (1, 'Apple Mac Air', 2, 2, 999.23, 1, 'nuovo prodotto mac', 'mac_air.jpg'), (4, 'I-phone 5', 3, 1, 759.99, 232, 'Ultimo i-phone lanciato sul mercato', 'iphone5.jpg'), (5, 'Galaxy SIII', 1, 1, 499.99, 231, 'Smartphone ultraccessoriato', 'galaxy_s3.jpg'), (6, 'Meteora', 7, 6, 13.9, 27, 'CD del famoso gruppo dei Linkin Park', 'meteora.jpg'), (7, 'Take off your pants and jacket', 8, 6, 12.67, 13, 'CD dei Blink 182', 'Take_Off.jpg'), (8, '21', 9, 8, 11.78, 20, 'CD della cantante Adele', '21.jpg'), (9, 'Solo per cambiare il mondo', 8, 7, 10.99, 11, 'CD del rapper italiano Kiave', 'solo_per_mondo.jpg'), (10, 'Il giro del mondo in 80 giorni', 6, 3, 8.27, 22, 'Un romanzo di Jules Verne', 'giro.jpg'), (11, 'Casa di bambola', 5, 4, 10.43, 45, 'Il teatro secondo Ibsen', 'casa_di_bambola.jpg'), (12, 'La metamorfosi', 6, 5, 9.34, 8, 'Racconto di Kafka', 'la_metamorfosi.jpg'), (13, 'Il fu Mattia Pascal', 5, 3, 12.9, 19, 'Romanzo di Pirandello', 'mattia_pascal.jpg'); CREATE TABLE acquisti( `cod_acquisto` INT AUTO_INCREMENT, `cod_prodotto` INT NOT NULL, `id_utente` INT NOT NULL, `quantita` INT(5) NOT NULL, `data_acquisto` DATE NOT NULL, PRIMARY KEY(`cod_acquisto`), FOREIGN KEY(`cod_prodotto`) REFERENCES prodotti(`cod_prodotto`) ON UPDATE CASCADE, FOREIGN KEY(`id_utente`) REFERENCES utenti(`id_utente`) ON UPDATE CASCADE )ENGINE=INNODB; 14 Torna all’indice Guido Moroni 5^D mercurio INSERT INTO `acquisti` (`cod_acquisto`, `cod_prodotto`, `id_utente`, `quantita`, `data_acquisto`) VALUES (1, 8, 1, 1, '2013-03-05'), (2, 12, 1, 1, '2013-03-05'), (3, 1, 1, 1, '2013-04-04'), (4, 8, 1, 5, '2013-04-04'), (5, 5, 1, 1, '2013-04-10'), (6, 12, 1, 3, '2013-04-10'), (7, 9, 1, 3, '2013-04-14'), (8, 8, 1, 3, '2013-04-14'); --- Struttura della tabella `ordini` -CREATE TABLE IF NOT EXISTS `ordini` ( `id_utente` int(11) NOT NULL, `cod_prodotto` int(11) NOT NULL, `quantita` int(11) NOT NULL, PRIMARY KEY (`id_utente`,`cod_prodotto`), FOREIGN KEY (`cod_prodotto`) REFERENCES prodotti(`cod_prodotto`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`id_utente`) REFERENCES utenti(`id_utente`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Dump dei dati per la tabella `ordini` -INSERT INTO `ordini` (`id_utente`, `cod_prodotto`, `quantita`) VALUES (2, 1, 1), (2, 5, 5); CREATE TABLE IF NOT EXISTS `admin`( `id_admin` INT AUTO_INCREMENT, `nome` VARCHAR(50) NOT NULL, `cognome` VARCHAR(50) NOT NULL, `email` VARCHAR(60) NOT NULL, `admin_name` VARCHAR(50) NOT NULL, `password` VARCHAR(100) NOT NULL, PRIMARY KEY(`id_admin`) 15 Torna all’indice Guido Moroni 5^D mercurio )ENGINE=InnoDB AUTO_INCREMENT=6 ; --- Dump dei dati per la tabella `admin` -INSERT INTO `admin` (`id_admin`, `nome`, `cognome`, `email`, `admin_name`, `password`) VALUES (3, 'Guido', 'Moroni', '[email protected]', 'guido123', 'asdf'), (4, 'admin', 'admin', '[email protected]', 'admin', 'altervista'); ----------------------------------------------------------------------------------------------------------------------------------- - D’interrogazione: 1) Visualizzare tutti i nomi dei prodotti e le relativa marca presenti nel magazzino (prodotti) SELECT nome_prodotto, nome_marca FROM prodotti, marche WHERE prodotti.cod_marca=marche.cod_marca 2) Per ogni reparto visualizzare il nome del reparto il numero dei prodotti ad esso associato SELECT reparti.cod_reparto, nome_reparto, count(cod_prodotto) AS'numero dei prodotti del reparto' FROM prodotti, reparti WHERE prodotti.cod_reparto=reparti.cod_reparto GROUP BY reparti.cod_reparto, nome_reparto 3) Visualizzare il numero degli acquisti effettuati il giorno 10 aprile 2013 SELECT COUNT(*) AS'numero degli acquisti effettuati il giorno 10 aprile 2013' FROM acquisti WHERE data_acquisto='2013-04-10' 4) Per ogni prodotto visualizzare i nomi degli utenti che l'hanno acquistato SELECT cod_prodotto, nome, cognome FROM acquisti, utenti WHERE acquisti.id_utente=utenti.id_utente GROUP BY cod_prodotto, utenti.id_utente, nome, cognome 5) Per ogni categoria visualizzare nome e prezzo del prodotto che ha prezzo massimo SELECT categorie.cod_categoria, nome_categoria, nome_prodotto, MAX(prezzo) 16 Torna all’indice Guido Moroni 5^D mercurio FROM prodotti, reparti, categorie WHERE prodotti.cod_reparto=reparti.cod_reparto AND reparti.cod_categoria=categorie.cod_categoria GROUP BY cod_categoria, nome_categoria 6) Visualizzare nome e cognome gli utenti residenti nella provincia di milano SELECT nome, cognome FROM utenti, province WHERE utenti.idprovincia=province.idprovincia AND nomeprovincia='Milano' AREA APPLICATIVA RIEPILOGO Riepilogando, il sito web realizzato si compone delle seguenti pagine: o o o o o o o o o o o o o o o o “index.php”: homepage del sito; “query.php”: pagina d’interrogazione del db; “amm-login.php”: login per gli amministratori ; “amm-profilo.php”: prima pagina dell’area amministratori; “catalogo.php”: catalogo prodotti del sito; “config.php”: pagine di configurazione che contiene le principali funzioni utili al programma web (inclusa nella pagina “header.php”); “header.php”: contenente la parte superiore del sito, viene inclusa all’inizio di ogni pagina; “logout.php”: pagina di logout; “prodotti-ins.php”: pagina di inserimento prodotti; “prodotti-canc.php”: pagina di cancellazione prodotti; “prodotti-mod.php”: pagina di modifica prodotti; “utente-acquisti.php”: pagina di acquisto prodotti; “utente-benvenuto.php”: prima pagina dell’area clienti; “utente-login.php”: pagina di login clienti; “utente-ordini.php”: pagina ordini di prodotti da parte dei clienti; “utente-registrazione.php”: pagina di registrazione clienti al sito; LISTING DEL PROGRAMMA (pagine HTML & PHP) “config.php” <?php 17 Torna all’indice Guido Moroni 5^D mercurio @session_start(); function connect() { $conn=mysql_connect("localhost","root",""); if(!$conn) die("CONNESSIONE AL DB FALLITA!"); $nome_db="bennet"; // nome del db $db=mysql_select_db($nome_db); if(!$db) die("IL DB SELEZIONATO NON ESISTE."); } function reload($indirizzo, $tempo) { if(!$tempo) $tempo=1000; if($indirizzo) { echo"<script language='Javascript'> <!-var URL = '$indirizzo' var speed = $tempo function reload() { location = URL } setTimeout('reload()', speed); //--> </script>"; } else echo"<span style='font-size:24px;'>ERRORE NELL'ESECUZIONE DELLA FUNZIONE: INSERIRE L'INDIRIZZO DEL REINDIRIZZAMENTO!</span>"; } function ControlloEmail($email) { 18 Torna all’indice Guido Moroni 5^D mercurio $result = eregi("^[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9]+)+$",$email); if($result == false) { return false; } else { return true; } } $indirizzo="index.php"; $tempo=2500; //<span style='font-size:14px;'> </span> ?> “header.php” <?php include('config.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <link rel="stylesheet" type="text/css" href="style/style.css" > <title> Bennet </title> <script type="text/javascript" src="js/jquery.validate.js"></script> <script type="text/javascript" src="js/jquery-1.3.2.js"></script> <script language="javascript" type="text/javascript"> function conferma() { 19 Torna all’indice Guido Moroni 5^D mercurio if(confirm("Vuoi confermare i tuoi ordini definitivamente?") == true) { document.acquisto.acq() } else { return false; } } </script> </head> <body> <div id="container"> <div id="header"> </div> “index.php” <?php include('header.php'); session_destroy(); ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="index.php">Home</a> </li> <li> <a href="">Area Clienti</a> <ul> <li><a href="utente-login.php">Login</a></li> 20 Torna all’indice Guido Moroni 5^D mercurio <li><a href="utenteregistrazione.php">Registrazione</a></li> </ul> </li> <li> <a href="catalogo.php">Catalogo</a> </li> <li> <a href="amm-login.php">Area Amministratori</a> </li> </ul> </div> <div id="left"> </div> <div id="right"> <h3> Benvenuti nel sito!</h3> <div id="imm-home"></div> <div id="testo"> asds adasda </div> </div> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> 21 Torna all’indice Guido Moroni 5^D mercurio </div> </body> </html> “catalogo.php” <?php include('header.php'); connect(); ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <?php if(!$_SESSION['email'] && !$_SESSION['amm']) { ?> <li> <a href="index.php">Home</a> </li> <li> <a href="">Area Clienti</a> <ul> <li><a href="utente-login.php">Login</a></li> <li><a href="utenteregistrazione.php">Registrazione</a></li> 22 Torna all’indice Guido Moroni 5^D mercurio </ul> </li> <li> <a href="catalogo.php">Catalogo</a> </li> <li> <a href="amm-login.php">Area Amministratori</a> </li> <?php } else if($_SESSION['email']) { ?> <li> <a href="utente-benvenuto.php">Profilo utente</a> <ul> <li><a href="utente-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> <li> <a href="catalogo.php">Catalogo prodotti</a> </li> <li> <a href="">Carrello</a> <ul> <li><a href="utente-ordini.php">Ordini</a></li> <li><a href="utente-acquisti.php">Acquisti</a></li> </ul> </li> <?php } else if($_SESSION['amm']) { 23 Torna all’indice Guido Moroni 5^D mercurio ?> <li> <a href="">Profilo </a> <ul> <li><a href="amm-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> <li> <a href="">Gestione Prodotti</a> <ul> <li><a href="catalogo.php">Visualizzazione</a></li> <li><a href="prodotti-ins.php">Inserimento</a></li> <li><a href="prodotti-mod.php">Modifica</a></li> <li><a href="prodotticanc.php">Cancellazione</a></li> </ul> </li> <li> <a href="">Gestione Clienti</a> </li> <li> <a href="">Gestione Admin sito</a> </li> <?php } ?> </ul> </div> <div id="left"> <p>CRITERI DI RICERCA PRODOTTI:</p><br> <p> 24 Torna all’indice Guido Moroni 5^D mercurio <form name="ricerca" action="" method="POST"> <select name="categoria" onChange="document.ricerca.submit()"> <option value="" disabled="disabled" selected="selected"> Seleziona categoria:</option> <?php $query=mysql_query("SELECT * FROM categorie ORDER BY nome_categoria"); if(!$query) echo"errore!!!"; else { $riga=mysql_fetch_array($query); while($riga) { ?> <option value="<?php echo"$riga[cod_categoria]"; ?>"> <?php echo"$riga[nome_categoria]"; ?></option> <?php $riga=mysql_fetch_array($query); } } ?> </select> </form> </p> </div> <div id="right"> 25 Torna all’indice Guido Moroni 5^D mercurio <?php $query="SELECT cod_prodotto, nome_prodotto, nome_marca, nome_reparto, quantita, prezzo, descrizione, immagine FROM prodotti, marche, reparti, categorie WHERE prodotti.cod_marca=marche.cod_marca AND prodotti.cod_reparto=reparti.cod_reparto AND reparti.cod_categoria=categorie.cod_categoria"; if(isset($_POST['categoria'])) { $cod_categoria=$_POST['categoria']; $query.=" AND reparti.cod_categoria=$cod_categoria "; } $query.=" ORDER BY nome_reparto, nome_prodotto, cod_prodotto"; $dati=mysql_query($query); $num_righe=mysql_num_rows($dati); if($num_righe>0) { $riga=mysql_fetch_array($dati); while($riga) { ?> <div class='cornice'> <div class='immagine'> <img style='width: 130px; height: 140px;' src='images/upload/<?php echo$riga[immagine] ?>'> 26 Torna all’indice Guido Moroni 5^D mercurio </div> <div class='desc'> <table border='1' cellspacing='2' cellpadding="2"> <tr> <td>Reparto:</td><td><?php echo $riga[nome_reparto] ?></td> </tr> <tr> <td>Prodotto:</td><td><?php echo $riga[nome_prodotto] ?></td> </tr> <tr> <td>Marca:</td><td><?php echo $riga[nome_marca] ?></td> </tr> <tr> <td>Prezzo:</td><td> <?php echo "&euro; $riga[prezzo]"; ?></td> </tr> <tr> <td>Scorte:</td><td><?php echo $riga[quantita] ?> </td> </tr> <tr> <td>Descrizione:</td><td><?php echo $riga[descrizione] ?></td> </tr> </table> </div> <?php if(isset($_SESSION['email'])) { ?> 27 Torna all’indice Guido Moroni 5^D mercurio <div class='carr'> <form method='POST' action='utenteordini.php'> <input type="hidden" value="<?php echo"$riga[cod_prodotto]"; ?>" name="cod_prod"> Quantit&agrave;: <select name='q'> <?php for($i=1;($i<10 && $i<=($riga['quantita']));$i++) { ?> <option value='<?php echo"$i" ?>' > <?php echo $i ?> </option> <?php } ?> </select> <input name='add' value='ok' title='Aggiungi al carrello' type='image' src='images/site/cart-add.gif' alt='aggiungi al carrello'> </form> </div> <?php } ?> </div> 28 Torna all’indice Guido Moroni 5^D mercurio <?php $riga=mysql_fetch_array($dati); } } else echo"NON ci sono prodotti con i criteri di scelta considerati"; mysql_close(); ?> </div> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “utente-registrazione.php” <?php 29 Torna all’indice Guido Moroni 5^D mercurio include('config.php'); connect(); if($_SESSION['email']) { $indirizzo='utente-benvenuto.php'; $tempo=1; reload($indirizzo, $tempo); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <link rel="stylesheet" type="text/css" href="style/style.css" /> <title> Bennet </title> <script type="text/javascript" src="js/jquery-1.3.2.js"></script> <script type="text/javascript" src="js/jquery.validate.js"></script> <script type="text/javascript" src="js/controllo.js"></script> </head> <body> <div id="container"> <div id="header"> </div> <div id="nav"> <!-- menu di navigazione--> 30 Torna all’indice Guido Moroni 5^D mercurio <ul id="menu"> <li> <a href="index.php">Home</a> </li> <li> <a href="">Area Clienti</a> <ul> <li><a href="utente-login.php">Login</a></li> <li><a href="utenteregistrazione.php">Registrazione</a></li> </ul> </li> <li> <a href="catalogo.php">Catalogo</a> </li> <li> <a href="amm-login.php">Area Amministratori</a> </li> </ul> </div> <div id="left"> <ul id="menu-or"> <li><a href="utente-login.php">Login</a></li> <li><a href="utenteregistrazione.php">Registrazione</a></li> </ul> </div> <div id="right"> <?php if(!isset($_POST['submit'])) { ?> <p>Benvenuto nell'area registrazione clienti, qua dovr&agrave; indicare le 31 Torna all’indice Guido Moroni 5^D mercurio sue generalit&agrave; e inserire la propria email e password.</p> <div id="register"> <form method="post" action="#" id="reg" > <label class="form" for="nome">Nome*:</label> <input type="text" name="nome" id="nome" maxlength="30" placeholder=""> <label class="form" for="cognome">Cognome*:</label> <input type="text" name="cognome" id="cognome" maxlength="40" placeholder=""> <label class="form" for="indirizzo">Indirizzo*:</label> <input type="text" name="indirizzo" id="indirizzo" maxlength="60" placeholder=""> <label class="form" for="citta">Citt&agrave;*:</label> <input type="text" name="citta" id="citta" maxlength="60" placeholder=""> <label class="form" for="provincia">Provincia*:</label> <?php $prov=mysql_query("SELECT idprovincia, siglaprovincia FROM province ORDER BY siglaprovincia"); $riga=mysql_fetch_array($prov); if(!$riga) echo"error#"; else { ?> 32 Torna all’indice Guido Moroni 5^D mercurio <select class="a" name='provincia'> <option disabled selected value="1"> Seleziona provincia: </option> <?php while($riga) { ?> <option value="<?php echo $riga[idprovincia] ?>" > <?php echo $riga[siglaprovincia] ?> </option> <?php $riga=mysql_fetch_array($prov); } ?> </select> <?php } ?> <label class="form" for="cap">CAP*:</label> <input class="form" type="text" name="cap" id="cap" maxlength="5" placeholder="98766"> <label class="form" for="email">Email*:</label> <input type="text" name="email" id="email" maxlength="60" placeholder="[email protected]"> <label class="form" for="password">Password*:</label> <input type="password" name="password" id="password" maxlength="50" placeholder="*** Almeno 6 caratteri ***"> <label class="form" for="rip_pass">Ripeti Password*:</label> 33 Torna all’indice Guido Moroni 5^D mercurio <input type="password" name="rip_pass" id="rip_pass" maxlength="50" placeholder="*** Almeno 6 caratteri ***"> <br> <input type="submit" name="submit" value="Registrati!"><br> </form> <br> <p> Nota*: i campi contrassegnati da * sono obbligatori.</p> </div> <?php } else { $nome=$_POST["nome"]; $cognome=$_POST["cognome"]; $indirizzo=$_POST["indirizzo"]; $citta=$_POST["citta"]; $idprovincia=$_POST["provincia"]; $cap=$_POST["cap"]; $email=$_POST["email"]; $password=$_POST["password"]; $rip_pass=$_POST["rip_pass"]; //controllo campi echo"<h1>"; 34 Torna all’indice Guido Moroni 5^D mercurio if($nome=="" || $cognome=="" || $indirizzo=="" || $citta=="" || $idprovincia=="" || $cap=="" || $email=="" || $password=="") echo"Devi riempire tutti i campi!"; else if(!is_numeric($cap) || strlen($cap)!=5) echo"Il cap inserito non &egrave; valido!"; else if(!ControlloEmail($email)) echo"Email non valida"; else if($password!=$rip_pass) echo"Le password devono coincidere!"; else if(strlen($password)<6) echo"La password deve contenere almeno 6 caratteri!"; else { //controllo nel db $rec_email=mysql_query("SELECT id_utente FROM utenti WHERE email='$email'"); $contamail= mysql_num_rows($rec_email); if($contamail>0) echo"La email con cui hai compilato il form &egrave; gi&agrave; utilizzata!"; else { //invia dati alla tabella utenti $inviadati=mysql_query("INSERT INTO utenti (nome, cognome, indirizzo, citta, cap, idprovincia, email, password) VALUES('$nome','$cognome','$indirizzo','$citta','$cap','$idprovincia','$email','$password')") ; if($inviadati) { echo"REGISTRAZIONE AVVENUTA CON SUCCESSO!"; $query=mysql_query("SELECT id_utente FROM utenti WHERE email='$email'"); $id=mysql_fetch_array($query); 35 Torna all’indice Guido Moroni 5^D mercurio @session_unset(); @$_SESSION = array(); @session_regenerate_id(); $_SESSION['id_utente']=$id; $_SESSION['email'] = $email; $_SESSION['nome'] = "$nome"." $cognome"; $indirizzo='utentebenvenuto.php'; $tempo=2000; reload($indirizzo, $tempo); } else echo"Ci sono stati dei problemi, riprova pi&ugrave; tardi"; } } echo"</h1>"; } ?> <?php mysql_close(); ?> 36 Torna all’indice Guido Moroni 5^D mercurio </div> <!-- fine div destro --> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “utente-login.php” <?php include('header.php'); ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="index.php">Home</a> </li> <li> <a href="">Area Clienti</a> <ul> <li><a href="utente-login.php">Login</a></li> <li><a href="utenteregistrazione.php">Registrazione</a></li> 37 Torna all’indice Guido Moroni 5^D mercurio </ul> </li> <li> <a href="catalogo.php">Catalogo</a> </li> <li> <a href="amm-login.php">Area Amministratori</a> </li> </ul> </div> <div id="left"> </div> <div id="right"> <?php if(!isset($_POST['submit'])) { ?> <div id="login"> <form method="post" action="#" id="login" > <label class="form" for="email">Email:</label> <input type="text" name="email" id="email" maxlength="60" placeholder="[email protected]"> <label class="form" for="password">Password:</label> <input type="password" name="pass" id="pass" maxlength="50"> <br> <br> <input type="submit" name="submit" value="Login"><br> 38 Torna all’indice Guido Moroni 5^D mercurio </form> </div> <?php } else { $email=$_POST['email']; $pass=$_POST['pass']; if($email=="" || $pass=="") { echo"Devi inserire sia email che password!"; $indirizzo='utente-login.php'; reload($indirizzo,''); } else { connect(); $dati_login=mysql_query("SELECT id_utente, email, password, nome, cognome FROM utenti WHERE email='$email' AND password='$pass'"); $num_tuple= mysql_num_rows($dati_login); if($num_tuple==0) echo"<h1>I dati d'accesso sono errati: <a href='utente-login.php'>riprova</a> o se ancora non l'hai fatto registrati <a href='utente-registrazione.php'>qui</a> </h1>"; else { //registrazione sessione 39 Torna all’indice Guido Moroni 5^D mercurio echo"<span style='fontsize:16px;'>I dati inseriti sono corretti attendi qualche secondo e potrai accedere al nostro CARRELLO BENNET!</span>"; $riga=mysql_fetch_array($dati_login); @session_unset(); @$_SESSION = array(); @session_regenerate_id(); $_SESSION['email'] = $riga[email]; $_SESSION['id_utente'] =$riga[id_utente]; $nomeint="$riga[nome]"." $riga[cognome]"; $_SESSION['nome'] = $nomeint; $indirizzo='utentebenvenuto.php'; $tempo=1500; reload($indirizzo, $tempo); } } } ?> 40 Torna all’indice Guido Moroni 5^D mercurio <div id="testo"> </div> </div> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “utente-benvenuto.php” <?php include('header.php'); if($_SESSION['email']) { ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> 41 Torna all’indice Guido Moroni 5^D mercurio <li> <a href="utente-benvenuto.php">Profilo utente</a> <ul> <li><a href="utente-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> <li> <a href="catalogo.php">Catalogo prodotti</a> </li> <li> <a href="">Carrello</a> <ul> <li><a href="utente-ordini.php">Ordini</a></li> <li><a href="utente-acquisti.php">Acquisti</a></li> </ul> </li> </ul> </div> <div id="left"> </div> <div id="right"> <?php $nome=$_SESSION['nome']; echo"Benvenuto $nome"; ?> </div> <?php 42 Torna all’indice Guido Moroni 5^D mercurio } else reload($indirizzo, $tempo); ?> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “utente-ordini.php” <?php include('header.php'); if($_SESSION['email']) { connect(); ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="utente-benvenuto.php">Profilo utente</a> <ul> <li><a href="utente-profilo.php">Modifica profilo </a></li> 43 Torna all’indice Guido Moroni 5^D mercurio <li><a href="logout.php">Logout</a></li> </ul> </li> <li> <a href="catalogo.php">Catalogo prodotti</a> </li> <li> <a href="">Carrello</a> <ul> <li><a href="utente-ordini.php">Ordini</a></li> <li><a href="utente-acquisti.php">Acquisti</a></li> </ul> </li> </ul> </div> <div id="left"> </div> <div id="right"> <p> Da questa pagina pu&ograve; visualizzare i prodotti che ha selezionato dal nostro catalogo.<br> Se vuole aquistare i prodotti prema il tasto ACQUISTA!<br> altrimenti pu&ograve; continuare lo shopping cliccando su <a href="catalogo.php"> CATALOGO </a> <br> </p> <p> <?php $id=$_SESSION['id_utente']; //inserimento prodotti nel carrello ordini - modifica delle quantita 44 Torna all’indice Guido Moroni 5^D mercurio if(isset($_POST['add'])) { $cod=$_POST['cod_prod']; $quantita=$_POST['q']; $inviadati=mysql_query("INSERT INTO ordini (id_utente, cod_prodotto, quantita) VALUES($id,$cod,$quantita)"); if(!$inviadati) { $recupero_scorte=mysql_query("SELECT quantita FROM prodotti WHERE cod_prodotto=$cod"); $r1=mysql_fetch_array($recupero_scorte); $recupero_q=mysql_query("SELECT quantita FROM ordini WHERE id_utente=$id AND cod_prodotto=$cod"); $r2=mysql_fetch_array($recupero_q); $quantita+=$r2[quantita]; if($r1[quantita]<$quantita) { $quantita=$r1[quantita]; } $mod=mysql_query("UPDATE ordini SET quantita=$quantita WHERE id_utente=$id AND cod_prodotto=$cod"); } } //modifica-rimozione prodotti dal carrello ordini if(isset($_POST['remove'])) 45 Torna all’indice Guido Moroni 5^D mercurio { $rid_q=$_POST['rid_q']; $cod=$_POST['codice_prodotto']; $query="SELECT quantita FROM ordini WHERE id_utente=$id AND cod_prodotto=$cod"; $dati=mysql_query($query); $r=mysql_fetch_array($dati); $r[quantita]-=$rid_q; if($r[quantita]==0) { $query=mysql_query("DELETE FROM ordini WHERE cod_prodotto=$cod AND id_utente=$id"); } else { $query=mysql_query("UPDATE ordini SET quantita=$r[quantita] WHERE cod_prodotto=$cod AND id_utente=$id"); } } $query="SELECT prodotti.cod_prodotto, nome_prodotto, ordini.quantita, prezzo*ordini.quantita AS'prezzo' "; $query.="FROM ordini, prodotti "; $query.="WHERE ordini.cod_prodotto=prodotti.cod_prodotto AND ordini.id_utente='$id' "; $dati=mysql_query($query); $num_record=mysql_num_rows($dati); if($num_record>0) { 46 Torna all’indice Guido Moroni 5^D mercurio ?> <br><br> <table align="centre" border='1' bordercolor="black" cellpadding="8" cellspacing="10"> <caption>Riepilogo ordini effettuati<br></caption> <thead> <th>Codice</th> <th>Nome prodotto</th> <th>Quantit&agrave;</th> <th>Prezzo Totale<br>(singolo articolo)</th> <th colspan="2">Rimozione <br>articolo</th> </thead> <?php $riga=mysql_fetch_array($dati); while($riga) { ?> <tr border="0"> <?php echo" <td> $riga[cod_prodotto] </td> <td> $riga[nome_prodotto] </td> <td> $riga[quantita]</td> <td> &euro; $riga[prezzo]</td> "; ?> <!-- INIZIO FORM RIMOZIONE PRODOTTI --> <form name="rimuovi_prodotti" action="utente-ordini.php" method="POST"> 47 Torna all’indice Guido Moroni 5^D mercurio <input type="hidden" name="codice_prodotto" value="<?php echo"$riga[cod_prodotto]"; ?>"> <td> <select name="rid_q" width="5"> <?php while($riga[quantita]>0) { ?> <option value="<?php echo"$riga[quantita]"; ?>"> <?php echo" - $riga[quantita]"; ?></option> <?php $riga[quantita]--; } ?> </select> </td> <td> <input name='remove' value='ok' title='Rimuovi dal carrello' type='image' src='images/site/cart-remove.gif' alt='Remove'> </td> </form> <!-- FINE FORM RIMOZIONE PRODOTTI --> </tr> <?php $riga=mysql_fetch_array($dati); } 48 Torna all’indice Guido Moroni 5^D mercurio $query="SELECT SUM(ordini.quantita*prezzo) AS'prezzo' FROM ordini, prodotti "; $query.="WHERE ordini.cod_prodotto=prodotti.cod_prodotto AND id_utente=$id"; $ris=mysql_query($query); $riga=mysql_fetch_array($ris); ?> <tfoot> <tr> <td colspan="3" align="right"> TOTALE: </td> <td> &euro; <?php echo"$riga[prezzo]"; ?> </td> </tr> </tfoot> </table> <br><br> <table align="right" > <form method="POST" action='utente-acquisti.php' name="acquisto" > <tr><td><input onClick="return conferma()" type="image" value="acq" name="acq" src="images/site/p_acquisto.png" alt="acq"></td></tr> <input type="hidden" name="null" value="1"> </form> </table> <?php 49 Torna all’indice Guido Moroni 5^D mercurio } else echo"<br><h1>Non hai ordini in corso!</h1>"; mysql_close(); ?> </p> </div> <?php } else reload($indirizzo, $tempo); ?> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> 50 Torna all’indice Guido Moroni 5^D mercurio </html> “utente-acquisti.php” <?php include('header.php'); if($_SESSION['email']) { connect(); ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="utente-benvenuto.php">Profilo utente</a> <ul> <li><a href="utente-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> <li> <a href="catalogo.php">Catalogo prodotti</a> </li> <li> <a href="">Carrello</a> <ul> <li><a href="utente-ordini.php">Ordini</a></li> <li><a href="utente-acquisti.php">Acquisti</a></li> </ul> </li> </ul> </div> <div id="left"> 51 Torna all’indice Guido Moroni 5^D mercurio </div> <div id="right"> <p> Da questa pagina pu&ograve; visualizzare i prodotti che ha selezionato dal nostro catalogo.<br> Se vuole aquistare i prodotti prema il tasto ACQUISTA!<br> altrimenti pu&ograve; continuare lo shopping cliccando su <a href="catalogo.php"> CATALOGO </a> <br> </p> <p> <?php $id=$_SESSION['id_utente']; //inserimento prodotti nel carrello ordini - modifica delle quantita if(isset($_POST['acq'])) { $data=date("Y-m-d"); $query="SELECT * FROM ordini WHERE id_utente='$id'"; $ordini=mysql_query($query); $dati=mysql_fetch_array($ordini); $err=0; while($dati && $err==0) { $query="SELECT quantita FROM prodotti WHERE cod_prodotto=$dati[cod_prodotto]"; $scorte=mysql_query($query); $ris=mysql_fetch_array($scorte); 52 Torna all’indice Guido Moroni 5^D mercurio $nuove_scorte=$ris[quantita]-$dati[quantita]; $query="UPDATE prodotti SET quantita=$nuove_scorte WHERE cod_prodotto=$dati[cod_prodotto]"; $up_scorte=mysql_query($query); if($up_scorte) { $query="INSERT INTO acquisti(cod_prodotto,id_utente,quantita,data_acquisto) VALUES ($dati[cod_prodotto],$id,$dati[quantita],'$data')"; $acquistato=mysql_query($query); if($acquistato) { $query="DELETE FROM ordini WHERE cod_prodotto=$dati[cod_prodotto] AND id_utente=$id"; $canc_ordini=mysql_query($query); if(!$canc_ordini) { echo"<h1>ERRORE</h1>"; $err=1; } } else { echo"<h1>ERRORE</h1>"; $err=1; } } else { echo"<h1>ERRORE</h1>"; $err=1; } $dati=mysql_fetch_array($ordini); 53 Torna all’indice Guido Moroni 5^D mercurio } if($err==0) { echo"<h1>HAI ORDINATO LA MERCE CON SUCCESSO!</h1> <br> Grazie per aver aquistato da BENNET MERCURIO"; $query="SELECT indirizzo FROM utenti WHERE id_utente=$id"; $ind=mysql_query($query); $indirizzo=mysql_fetch_array($ind); echo"La merce verr&agrave; spedita al tuo indirizzo: $indirizzo[indirizzo]"; $email=$_SESSION['email']; $oggetto="Acquisti dal bennet mercurio"; $messaggio=" <html> <head> <title>BENNET</title></head> <body> Riepilogo acquisti dal BENNET mercurio: <p> <table border='1'> </table><p> <table> </table> </body> </html>"; $intestazioni = "MIME-Version: 1.0\r\n"; $intestazioni .= "Content-type: text/html; charset=iso-88591\r\n"; mail($email, $oggetto, $messaggio, $intestazioni); } else echo"ERROR"; 54 Torna all’indice Guido Moroni 5^D mercurio } //modifica-rimozione prodotti dal carrello ordini /* $query="SELECT prodotti.cod_prodotto, nome_prodotto, ordini.quantita, prezzo*ordini.quantita AS'prezzo' "; $query.="FROM ordini, prodotti "; $query.="WHERE ordini.cod_prodotto=prodotti.cod_prodotto AND ordini.id_utente='$id' "; $dati=mysql_query($query); $num_record=mysql_num_rows($dati); if($num_record>0) { ?> <br><br> <table align="centre" border='1' bordercolor="black" cellpadding="8" cellspacing="10"> <caption>Riepilogo ordini effettuati<br></caption> <thead> <th>Codice</th> <th>Nome prodotto</th> <th>Quantit&agrave;</th> <th>Prezzo Totale<br>(singolo articolo)</th> <th colspan="2">Rimozione <br>articolo</th> </thead> 55 Torna all’indice Guido Moroni 5^D mercurio <?php $riga=mysql_fetch_array($dati); while($riga) { ?> <tr border="0"> <?php echo" <td> $riga[cod_prodotto] </td> <td> $riga[nome_prodotto] </td> <td> $riga[quantita]</td> <td> &euro; $riga[prezzo]</td> "; ?> <!-- INIZIO FORM RIMOZIONE PRODOTTI --> <form name="rimuovi_prodotti" action="utente-ordini.php" method="POST"> <input type="hidden" name="codice_prodotto" value="<?php echo"$riga[cod_prodotto]"; ?>"> <td> <select name="rid_q" width="5"> <?php while($riga[quantita]>0) { ?> <option value="<?php echo"$riga[quantita]"; ?>"> <?php echo" - $riga[quantita]"; ?></option> <?php $riga[quantita]--; 56 Torna all’indice Guido Moroni 5^D mercurio } ?> </select> </td> <td> <input name='remove' value='ok' title='Rimuovi dal carrello' type='image' src='images/site/cart-remove.gif' alt='Remove'> </td> </form> <!-- FINE FORM RIMOZIONE PRODOTTI --> </tr> <?php $riga=mysql_fetch_array($dati); } $query="SELECT SUM(ordini.quantita*prezzo) AS'prezzo' FROM ordini, prodotti "; $query.="WHERE ordini.cod_prodotto=prodotti.cod_prodotto AND id_utente=$id"; $ris=mysql_query($query); $riga=mysql_fetch_array($ris); ?> <tfoot> <tr> <td colspan="3" align="right"> TOTALE: </td> <td> &euro; <?php echo"$riga[prezzo]"; ?> </td> </tr> 57 Torna all’indice Guido Moroni 5^D mercurio </tfoot> </table> <form name="acquista" action="" method="POST"> <br><br> <table align="right" > <tr><td><input type="image" name="acq" src="images/site/p_acquisto.png" alt="Acquisto"></td></tr> </table> </form> <?php } else echo"<br><h1>Non hai ordini in corso!</h1>"; */ mysql_close(); ?> </p> </div> <?php 58 Torna all’indice Guido Moroni 5^D mercurio } else reload($indirizzo, $tempo); ?> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “amm-login.php” <?php include('header.php'); ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="index.php">Home</a> </li> <li> <a href="">Area Clienti</a> <ul> <li><a href="utente-login.php">Login</a></li> 59 Torna all’indice Guido Moroni 5^D mercurio <li><a href="utenteregistrazione.php">Registrazione</a></li> </ul> </li> <li> <a href="catalogo.php">Catalogo</a> </li> <li> <a href="amm-login.php">Area Amministratori</a> </li> </ul> </div> <div id="left"> </div> <div id="right"> <?php if(!isset($_POST['submit'])) { ?> <div id="login"> <form method="post" action="#" id="login" > <label class="form" for="name">Admin Name:</label> <input type="text" name="name" id="name" maxlength="60" > <label class="form" for="password">Password:</label> <input type="password" name="pass" id="pass" maxlength="50"> <br> <br> 60 Torna all’indice Guido Moroni 5^D mercurio <input type="submit" name="submit" value="Login"><br> </form> </div> <?php } else { $admin_name=$_POST['name']; $pass=$_POST['pass']; if($admin_name=="" || $pass=="") { echo"Devi inserire sia il tuo nome admin che password!"; $indirizzo='amm-login.php'; //reload($indirizzo,''); } else { connect(); $dati_login=mysql_query("SELECT admin_name, password, nome, cognome FROM admin WHERE admin_name='$admin_name' AND password='$pass'"); $num_tuple= mysql_num_rows($dati_login); if($num_tuple==0) echo"<h1>I dati d'accesso sono errati: <a href='amm-login.php'>riprova</a> </h1>"; else { //registrazione sessione 61 Torna all’indice Guido Moroni 5^D mercurio echo"<span style='fontsize:16px;'>I dati inseriti sono corretti attendi qualche secondo e potrai accedere al tuo profilo Admin</span>"; $riga=mysql_fetch_array($dati_login); @session_unset(); @$_SESSION = array(); @session_regenerate_id(); $_SESSION['amm'] = $riga[admin_name]; $nomeint="$riga[nome]"." $riga[cognome]"; $_SESSION['nome'] = $nomeint; $indirizzo='ammprofilo.php'; $tempo=1500; reload($indirizzo, $tempo); } } } ?> 62 Torna all’indice Guido Moroni 5^D mercurio <div id="testo"> </div> </div> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved ®</i> </div> </div> </body> </html> “amm-profilo.php” <?php include('header.php'); if($_SESSION['amm']) { connect(); $indirizzo="amm-profilo.php"; ?> 63 Torna all’indice Guido Moroni 5^D mercurio <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="">Profilo </a> <ul> <li><a href="amm-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> <li> <a href="">Gestione Prodotti</a> <ul> <li><a href="catalogo.php">Visualizzazione</a></li> <li><a href="prodotti-ins.php">Inserimento</a></li> <li><a href="prodotti-mod.php">Modifica</a></li> <li><a href="prodotticanc.php">Cancellazione</a></li> </ul> </li> <li> <a href="">Gestione Clienti</a> </li> <li> <a href="">Gestione Admin sito</a> </li> </ul> </div> <div id="left"> </div> <div id="right"> <h3> Benvenuti nel sito!</h3> <div id="imm-home"></div> 64 Torna all’indice Guido Moroni 5^D mercurio <div id="testo"> </div> </div> <?php } else reload($indirizzo, $tempo); ?> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “prodotti-ins.php” <?php include('header.php'); if($_SESSION['amm']) { connect(); $indirizzo="prodotti-ins.php"; 65 Torna all’indice Guido Moroni 5^D mercurio ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="">Profilo </a> <ul> <li><a href="amm-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> </li> <li> <a href="">Gestione Prodotti</a> <ul> <li><a href="catalogo.php">Visualizzazione</a></li> <li><a href="prodotti-ins.php">Inserimento</a></li> <li><a href="prodotti-mod.php">Modifica</a></li> <li><a href="prodotticanc.php">Cancellazione</a></li> </ul> </li> <li> <a href="">Gestione Clienti</a> </li> <li> <a href="">Gestione Admin sito</a> </li> </ul> </div> <div id="left"> <p>CRITERI DI RICERCA PRODOTTI:</p><br> <p> 66 Torna all’indice Guido Moroni 5^D mercurio <form name="ricerca" action="" method="POST"> <select class="a" name="categoria" onChange="document.ricerca.submit()"> <option value="" disabled="disabled" selected="selected"> Seleziona categoria:</option> <?php $query=mysql_query("SELECT * FROM categorie ORDER BY nome_categoria"); if(!$query) echo"errore!!!"; else { $riga=mysql_fetch_array($query); while($riga) { ?> <option value="<?php echo"$riga[cod_categoria]"; ?>"> <?php echo"$riga[nome_categoria]"; ?></option> <?php $riga=mysql_fetch_array($query); } } ?> </select> </form> </p> </div> 67 Torna all’indice Guido Moroni 5^D mercurio <div id="right"> <?php if(!isset($_POST['submit'])) { ?> <form name="inserimento_prodotti" method="POST" action="#" enctype="multipart/form-data" > <label class="form" for="nomep">Nome:</label> <input type="text" name="nomep" id="nomep" maxlength="40" /> <label class="form" for="marca">Marca:</label> <select class="a" name="marca"> <?php $query="SELECT cod_marca, nome_marca FROM marche "; if($_POST['categoria']) { $categoria=$_POST['categoria']; $query.="WHERE cod_categoria='$categoria' "; } $query.="ORDER BY nome_marca"; $marca=mysql_query($query); $riga=mysql_fetch_array($marca); if(!$riga) echo"error#"; else { while($riga) { ?> 68 Torna all’indice Guido Moroni 5^D mercurio <option value="<?php echo $riga[cod_marca] ?>"> <?php echo"$riga[nome_marca]" ?> </option> <?php $riga=mysql_fetch_array($marca); } } ?> </select> <br> <label class="form" for="reparto">Reparto:</label> <select class="a" name="reparto"> <?php $query="SELECT cod_reparto, nome_reparto FROM reparti "; if($_POST['categoria']) { $categoria=$_POST['categoria']; $query.="WHERE cod_categoria='$categoria' "; } $query.="ORDER BY nome_reparto"; $reparto=mysql_query($query); $riga=mysql_fetch_array($reparto); if(!$riga) echo"error#"; else { while($riga) { ?> 69 Torna all’indice Guido Moroni 5^D mercurio <option value="<?php echo $riga[cod_reparto] ?>"> <?php echo $riga[nome_reparto] ?> </option> <?php $riga=mysql_fetch_array($reparto); } } ?> </select> <br> <label class="form" for="prezzo">Prezzo:</label> <input type="number" size="2" name="prezzo" id="prezzo" maxlength="8" step="0.01" min="0.01" max="10000" /> <br> <label class="form" for="quantita">Scorte:</label> <input type="number" size="3" name="quantita" id="quantita" maxlength="4" step="1" min="1" max="9999"/> <br> <label class="form" for="quantita">Descrizione:</label> <textarea rows="5" cols="20" name="descrizione" id="descrizione" maxlength="300" placeholder="Descrizione prodotto..."> </textarea> <br> <br> <label class="form" for="foto"> Immagine prodotto</label> <input type="file" name="immagine" id="immagine" /> 70 Torna all’indice Guido Moroni 5^D mercurio <br> <p> <input type="submit" name="submit" value="Aggiungi prodotto!"> </p> <br> </form> <?php } else { $nome=$_POST['nomep']; $marca=$_POST['marca']; $reparto=$_POST['reparto']; $prezzo=$_POST['prezzo']; $quantita=$_POST['quantita']; $descrizione=$_POST['descrizione']; $immagine=$_FILES["immagine"]["name"]; //controlli sui campi vuoti if($nome=="" || $reparto=="" || $quantita=="" || $descrizione=="") { echo"<h1>devi riempire tutti i campi</h1>"; reload($indirizzo, $tempo); } else if(!is_numeric($prezzo) || !is_numeric($quantita)) { echo"<h1>Il campo prezzo o quantit&agrave; non contengono valori numerici</h1>"; reload($indirizzo, $tempo); } else { if($prezzo==floor($prezzo)) $prezzo=number_format($prezzo,2,'.',''); 71 Torna all’indice Guido Moroni 5^D mercurio //controllo dell'immagine prodotto if(is_uploaded_file($_FILES["immagine"]["tmp_name"])) { //recupera le informazioni delle immagini list($width, $height, $type, $attr) = getimagesize($_FILES["immagine"]["tmp_name"]); //controlla il peso in byte if($_FILES["immagine"]["size"] > 1048576) { echo"Il file non deve superare 1 MB"; } //controlla le dimensioni in pixel else if(($width > 200) || ($height > 200)) { echo"Le dimensioni non devono superare i 500px"; } //controlla che il file sia un'immagine else if(($type!=1) && ($type!=2) && ($type!=3)) { echo"FILE non supportato"; } //controlla se sullo spazio web sia già presente il file 72 Torna all’indice Guido Moroni 5^D mercurio else if(file_exists("images/upload/".$_FILES["immagine"]["name"])) { echo"file gi&agrave; esistente, rinominarlo e riprovare."; } else { //invia i dati al db $query=mysql_query("INSERT INTO prodotti (nome_prodotto, cod_marca, cod_reparto, prezzo, quantita, descrizione, immagine) VALUES ('$nome','$marca','$reparto','$prezzo','$quantita','$descrizione','$immagine')"); //caricare la foto in una cartella if($query) { move_uploaded_file($_FILES["immagine"]["tmp_name"],"images/upload/". $_FILES["immagine"]["name"]); echo"Inserimento avvenuto con successo!!"; } } } } } mysql_close(); 73 Torna all’indice Guido Moroni 5^D mercurio ?> </div> <?php } else reload($indirizzo,$tempo); ?> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “prodotti-canc.php” <?php include('header.php'); if($_SESSION['amm']) { connect(); $indirizzo="prodotti-canc.php"; ?> 74 Torna all’indice Guido Moroni 5^D mercurio <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="">Profilo </a> <ul> <li><a href="amm-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> <li> <a href="">Gestione Prodotti</a> <ul> <li><a href="catalogo.php">Visualizzazione</a></li> <li><a href="prodotti-ins.php">Inserimento</a></li> <li><a href="prodotti-mod.php">Modifica</a></li> <li><a href="prodotticanc.php">Cancellazione</a></li> </ul> </li> <li> <a href="">Gestione Clienti</a> </li> <li> <a href="">Gestione Admin sito</a> </li> </ul> </div> <div id="left"> </div> <div id="right"> <?php if(!isset($_POST['ricerca']) && !isset($_POST['canc'])) { 75 Torna all’indice Guido Moroni 5^D mercurio ?> <!--FORM RICERCA PRODOTTO ---> <form name="ricerca" action="#" method="POST" id="prod"> <label class="form" for="cod"><input type="checkbox" name="cp" id="" > Codice:</label> <input type="text" name="cod" id="cod" maxlength="4" /> <label class="form" for="nomep"><input type="checkbox" name="np" id="" > Nome:</label> <input type="text" name="nomep" id="nomep" maxlength="40" /> <label class="form" for="marca"><input type="checkbox" name="mp" id="" > Marca:</label> <select name="marca" class="a"> <?php 76 Torna all’indice Guido Moroni 5^D mercurio $marca=mysql_query("SELECT cod_marca, nome_marca FROM marche ORDER BY nome_marca"); $riga=mysql_fetch_array($marca); if(!$riga) echo"error#"; else { while($riga) { ?> <option value="<?php echo $riga[cod_marca] ?>"> <?php echo"$riga[nome_marca]" ?> </option> <?php $riga=mysql_fetch_array($marca); } } ?> </select> <br> <br> <label class="form" for="reparto"><input type="checkbox" name="rp" id="" > Reparto:</label> <select class="a" name="reparto"> <?php $reparto=mysql_query("SELECT cod_reparto, nome_reparto FROM reparti ORDER BY nome_reparto"); 77 Torna all’indice Guido Moroni 5^D mercurio $riga=mysql_fetch_array($reparto); if(!$riga) echo"error#"; else { while($riga) { ?> <option value="<?php echo $riga[cod_reparto] ?>"> <?php echo $riga[nome_reparto] ?> </option> <?php $riga=mysql_fetch_array($reparto); } } ?> </select> <br><br> <input type="submit" name="ricerca" value="Ricerca"> </form> <br><br> Da questo form lei, amministratore del sito, spunti (<input type="checkbox" checked disabled>) i campi su cui intende effettuare la ricerca del prodotto da eliminare. <!--FORM PRODOTTO DA MODIFICARE!!! ---> <?php } else if(!isset($_POST['canc'])) { 78 Torna all’indice Guido Moroni 5^D mercurio if(isset($_POST['cp']) || isset($_POST['np']) ||isset($_POST['mp']) || isset($_POST['rp'])) { $query="SELECT cod_prodotto, nome_prodotto, nome_marca, nome_reparto, quantita, prezzo, descrizione, immagine FROM prodotti, marche, reparti, categorie WHERE prodotti.cod_marca=marche.cod_marca AND prodotti.cod_reparto=reparti.cod_reparto AND reparti.cod_categoria=categorie.cod_categoria "; if(isset($_POST['cp'])) { $cod=$_POST['cod']; $query.="AND cod_prodotto='$cod' "; } if(isset($_POST['np'])) { $nome=$_POST['nomep']; $query.="AND nome_prodotto LIKE '$nome%' "; } if(isset($_POST['mp'])) { $marca=$_POST['marca']; $query.="AND marche.cod_marca='$marca' "; } if(isset($_POST['rp'])) { $reparto=$_POST['reparto']; $query.="AND reparti.cod_reparto='$reparto' "; } 79 Torna all’indice Guido Moroni 5^D mercurio $dati=mysql_query($query); $num_record=mysql_num_rows($dati); if($num_record==1) { $riga=mysql_fetch_array($dati); ?> <form name="prodmod" action="#" method="POST" id="prodcanc"> <input type="hidden" name="cod_prod" value="<?php echo"$riga[cod_prodotto]" ?>"> <input type="hidden" name="immagine" value="<?php echo"$riga[immagine]" ?>"> <table border='1' cellspacing='2'> <tr> <td> Codice prodotto:</td><td> <?php echo $riga[cod_prodotto] ?></td> </tr> <tr> <td> Nome Prodotto:</td><td> <?php echo $riga[nome_prodotto] ?></td> </tr> <tr> <td>Marca:</td><td> <?php echo $riga[nome_marca] ?> </td> </tr> 80 Torna all’indice Guido Moroni 5^D mercurio <tr> <td>Reparto:</td> <td> <?php echo $riga[nome_reparto] ?></td> </tr> <tr> <td>Prezzo (&euro;):</td><td><?php echo"$riga[prezzo]"; ?> </td> </tr> <tr> <td>Scorte:</td><td><?php echo $riga[quantita] ?> </td> </tr> <tr> <td>Descrizione:</td><td><?php echo $riga[descrizione] ?></td> </tr> </table> <br><hr><br> <input type="submit" name="canc" value="Cancella prodotto!"> </form> <br><hr><br> Secondo i criteri di ricerca impostati questo &egrave; il prodotto selezionato: <br> Se vuole cancellarlo clicchi su "Cancella prodotto!" altrimenti clicchi <a href="prodotti-canc.php">QUI</a> per tornare indietro. <?php } else if($num_record>1) { 81 Torna all’indice Guido Moroni 5^D mercurio echo"<h1>ERRORE: i risultati sono pi&ugrave; di 1. Puoi eliminare 1 solo record alla volta</h1>"; reload($indirizzo, $tempo); } else { echo"<h1>ERRORE: non ci sono risultati per i criteri di ricerca che hai impostato!</h1>"; reload($indirizzo, $tempo); } } else { echo"<h1>Non hai selezionato nessun criterio di ricerca!! </h1> Verrai reindirizzato direttamente alla pagina di ricerca"; reload($indirizzo, $tempo); } } //inizio cancellazione dati della tabella PRODOTTI else { $cod_prod=$_POST['cod_prod']; $immagine=$_POST['immagine']; $query="DELETE FROM prodotti WHERE cod_prodotto='$cod_prod'"; $delete=mysql_query($query); if($delete) { echo"<h1>Cancellazione avvenuta con successo </h1>"; unlink("images/upload/$immagine"); } else echo"<h1> ERRORE nella cancellazione. Riprovare </h1>"; reload($indirizzo, $tempo); } 82 Torna all’indice Guido Moroni 5^D mercurio mysql_close(); ?> </div> <?php } reload($indirizzo, $tempo); ?> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “prodotti-mod.php” <?php include('config.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 83 Torna all’indice Guido Moroni 5^D mercurio <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <link rel="stylesheet" type="text/css" href="style/style.css" > <title> Bennet </title> <script type="text/javascript" src="js/jquery.validate.js"></script> <script type="text/javascript" src="js/jquery-1.3.2.js"></script> <script type="text/javascript" src="js/prodotti-mod-cont.js"></script> </head> <body> <div id="container"> <div id="header"> </div> <?php if($_SESSION['amm']) { connect(); $indirizzo='prodotti-mod.php'; ?> <div id="nav"> <!-- menu di navigazione--> <ul id="menu"> <li> <a href="">Profilo </a> <ul> <li><a href="amm-profilo.php">Modifica profilo </a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> 84 Torna all’indice Guido Moroni 5^D mercurio <li> <a href="">Gestione Prodotti</a> <ul> <li><a href="catalogo.php">Visualizzazione</a></li> <li><a href="prodotti-ins.php">Inserimento</a></li> <li><a href="prodotti-mod.php">Modifica</a></li> <li><a href="prodotticanc.php">Cancellazione</a></li> </ul> </li> <li> <a href="">Gestione Clienti</a> </li> <li> <a href="">Gestione Admin sito</a> </li> </ul> </div> <div id="left"> </div> <div id="right"> <?php if(!isset($_POST['ricerca']) && !isset($_POST['up'])) { ?> <!--FORM RICERCA PRODOTTO ---> <form name="ricerca" action="#" method="POST" id="prod"> 85 Torna all’indice Guido Moroni 5^D mercurio <label class="form" for="cod"><input type="checkbox" name="cp" id="" > Codice:</label> <input type="text" name="cod" id="cod" maxlength="4" /> <label class="form" for="nomep"><input type="checkbox" name="np" id="" > Nome:</label> <input type="text" name="nomep" id="nomep" maxlength="40" /> <label class="form" for="marca"><input type="checkbox" name="mp" id="" > Marca:</label> <select class="a" name="marca"> <?php $marca=mysql_query("SELECT cod_marca, nome_marca FROM marche ORDER BY nome_marca"); $riga=mysql_fetch_array($marca); if(!$riga) echo"error#"; else { while($riga) { ?> 86 Torna all’indice Guido Moroni 5^D mercurio <option value="<?php echo $riga[cod_marca] ?>"> <?php echo"$riga[nome_marca]" ?> </option> <?php $riga=mysql_fetch_array($marca); } } ?> </select> <br> <br> <label class="form" for="reparto"><input type="checkbox" name="rp" id="" > Reparto:</label> <select class="a" name="reparto"> <?php $reparto=mysql_query("SELECT cod_reparto, nome_reparto FROM reparti ORDER BY nome_reparto"); $riga=mysql_fetch_array($reparto); if(!$riga) echo"error#"; else { while($riga) { ?> 87 Torna all’indice Guido Moroni 5^D mercurio <option value="<?php echo $riga[cod_reparto] ?>"> <?php echo $riga[nome_reparto] ?> </option> <?php $riga=mysql_fetch_array($reparto); } } ?> </select> <br><br> <input type="submit" name="ricerca" value="Ricerca"> </form> <br><br> Da questo form lei, amministratore del sito, può modificare i prodotti spuntando (<input type="checkbox" checked disabled>) i campi su cui intende effettuare la ricerca del prodotto da modificare. <!--FORM PRODOTTO DA MODIFICARE!!! ---> <?php } else if(!isset($_POST['up'])) { if(isset($_POST['cp']) || isset($_POST['np']) ||isset($_POST['mp']) || isset($_POST['rp'])) { $query="SELECT cod_prodotto, nome_prodotto, nome_marca, nome_reparto, quantita, prezzo, descrizione FROM prodotti, marche, reparti, categorie WHERE prodotti.cod_marca=marche.cod_marca AND prodotti.cod_reparto=reparti.cod_reparto AND 88 Torna all’indice Guido Moroni 5^D mercurio reparti.cod_categoria=categorie.cod_categoria "; if(isset($_POST['cp'])) { $cod=$_POST['cod']; $query.="AND cod_prodotto='$cod' "; } if(isset($_POST['np'])) { $nome=$_POST['nomep']; $query.="AND nome_prodotto LIKE '$nome%' "; } if(isset($_POST['mp'])) { $marca=$_POST['marca']; $query.="AND marche.cod_marca='$marca' "; } if(isset($_POST['rp'])) { $reparto=$_POST['reparto']; $query.="AND reparti.cod_reparto='$reparto' "; } $query.="ORDER BY nome_reparto, nome_prodotto, cod_prodotto"; $dati=mysql_query($query); $num_record=mysql_num_rows($dati); if($num_record==1) { $riga=mysql_fetch_array($dati); 89 Torna all’indice Guido Moroni 5^D mercurio ?> <form name="prodmod" action="#" method="POST" id="prodmod"> <input type="hidden" name="cod_prod" value="<?php echo"$riga[cod_prodotto]" ?>"> <table border='0' cellspacing='2'> <tr> <td><input type="checkbox" name="1"> Nome Prodotto:</td><td> <input type="text" name="nprod" id="nprod" value="<?php echo $riga[nome_prodotto] ?>" maxlength="50"></td> </tr> <tr> <td><input type="checkbox" name="2"> Marca:</td><td> <select name="marca"> <?php $m=mysql_query("SELECT cod_marca, nome_marca FROM marche ORDER BY nome_marca"); $r=mysql_fetch_array($m); if(!$r) echo"error#"; else { while($r) { ?> <option value="<?php echo $r[cod_marca] ?>"> <?php echo"$r[nome_marca]" ?> </option> <?php 90 Torna all’indice Guido Moroni 5^D mercurio $r=mysql_fetch_array($m); } } ?> </select></td> </tr> <tr> <td><input type="checkbox" name="3"> Reparto:</td> <td> <select name="reparto"> <?php $rep=mysql_query("SELECT cod_reparto, nome_reparto FROM reparti ORDER BY nome_reparto"); $r=mysql_fetch_array($rep); if(!$r) echo"error#"; else { while($r) { ?> <option value="<?php echo $r[cod_reparto] ?>"> <?php echo $r[nome_reparto] ?> </option> <?php $r=mysql_fetch_array($rep); } 91 Torna all’indice Guido Moroni 5^D mercurio } ?> </select></td> </tr> <tr> <td><input type="checkbox" name="4"> Prezzo (&euro;):</td><td><input type="text" name="prezzo" id="prezzo" value="<?php echo"$riga[prezzo]"; ?>" maxlength="8" > </td> </tr> <tr> <td><input type="checkbox" name="5"> Scorte:</td><td><input type="text" name="scorte" id="scorte" value="<?php echo $riga[quantita] ?>" maxlength="4" > </td> </tr> <tr> <td><input type="checkbox" name="6"> Descrizione:</td><td><textarea rows="5" cols="20" name="desc" id="descrizione" maxlength="300" > <?php echo$riga[descrizione] ?> </textarea></td> </tr> </table> <hr><br> <input type="submit" name="up" value="Modifica prodotto!"> </form> <br><hr><br> Spunti i campi per i quali intende modificare gli errori effettuati durante la fase d'inserimento o in base alle scorte o al prezzo. <br> I campi non spuntati non saranno oggetto di modifica. <?php } else if($num_record>1) { 92 Torna all’indice Guido Moroni 5^D mercurio echo"<h1>ERRORE: i risultati sono pi&ugrave; di 1. Puoi modificare 1 solo record alla volta</h1>"; reload($indirizzo, $tempo); } else { echo"<h1>ERRORE: non ci sono risultati per i criteri di ricerca che hai impostato!</h1>"; reload($indirizzo, $tempo); } } else { echo"<h1>Non hai selezionato nessun criterio di ricerca!! </h1> Verrai reindirizzato direttamente alla pagina di ricerca"; reload($indirizzo, $tempo); } } //inizio modifica dati della tabella PRODOTTI else { $elem=6; $trovato=0; for($i=1;$i<$elem && $trovato==0;$i++) { if(isset($_POST["$i"])) { $trovato=1; } } if($trovato==1) { $cod_prod=$_POST['cod_prod']; $query="UPDATE prodotti SET "; if(isset($_POST['1'])) { $nome_prodotto=$_POST['nprod']; 93 Torna all’indice Guido Moroni 5^D mercurio $query.="nome_prodotto='$nome_prodotto', "; } if(isset($_POST['2'])) { $cod_marca=$_POST['marca']; $query.="cod_marca='$cod_marca', "; } if(isset($_POST['3'])) { $cod_reparto=$_POST['reparto']; $query.="cod_reparto='$cod_reparto', "; } if(isset($_POST['4'])) { $prezzo=$_POST['prezzo']; $query.="prezzo=$prezzo, "; } if(isset($_POST['5'])) { $scorte=$_POST['scorte']; $query.="quantita=$scorte, "; } if(isset($_POST['6'])) { $desc=$_POST['desc']; $query.="descrizione='$desc', "; } $query.=" cod_prodotto='$cod_prod' WHERE cod_prodotto='$cod_prod'"; $update=mysql_query($query); if($update) echo"<h1>Modifica avvenuta con successo </h1>"; else echo"<h1> ERRORE nella modifica. Riprovare </h1>"; reload($indirizzo, $tempo); } else { echo"nessun elemento selezionato!"; 94 Torna all’indice Guido Moroni 5^D mercurio reload($indirizzo, $tempo); } } mysql_close(); ?> </div> <?php } else reload($indirizzo,$tempo); ?> <div id="footer"> &copy; Guido Moroni <br> 5^D mercurio ANNO 2012/2013 <br> <i>Template designed by Guido Moroni All rights riserved</i> </div> </div> </body> </html> “logout.php” <?php include('header.php'); $nome=$_SESSION['nome']; 95 Torna all’indice Guido Moroni 5^D mercurio if($_SESSION['email']) echo"<h1>Stai per uscire dal tuo account, TORNI PRESTO Sig./ra $nome al BENNET MERCURIO! Arrivederci</h1>"; else if($_SESSION['amm']) echo"<h1>Stai per uscire dal tuo account amministratore $nome! Arrivederci</h1>"; else echo"<h1>REINDIRIZZAMENTE ALLA HOME</h1>"; session_destroy(); reload($indirizzo, $tempo); ?> SPIEGAZIONE DEL SITO Il sito web è realizzato secondo le specifiche del committente (in questa simulazione didattica l’ipermercato Bennet di Pieve Fissiraga), si divide in tre aree: la prima, comprendente la homepage, il catalogo prodotti e le 2 aree di accesso distinte, una per utenti e una per gli amministratori del database, è dedicata soprattutto ai visitatori del sito che ancora non conoscono i prodotti e i servizi offerti dall’azienda e desiderano ottenere informazioni; la seconda, per i clienti, che permette di visionare, ordinare e acquistare i prodotti direttamente dal catalogo dopo aver eseguito l’accesso; la terza, di cui fanno parte le pagine che permettono di inserire, aggiornare e cancellare dati dal database, è riservata agli amministratori. LOGIN E LOGOUT L'autenticazione sia per gli utenti che per gli amministratori è stata realizzata attraverso l’utilizzo delle sessioni, incluse nel linguaggio php. Per poter ottenere l'accesso all'area protette, è necessario autenticarsi inserendo la email/username (a seconda che si tratti di clienti-utenti o admin) e password nel form dedicato al login presente all'interno delle pagina “utente-login.php” e “admin-login.php”; i dati digitati vengono inviati alla pagina stessa, che, dopo averne verificato la corrispondenza tra le credenziali inserite e quelle registrate nel DB, inizia una nuova sessione e memorizza l'email/username (sufficiente per riconoscere l'utente/amministratore registrato) nell'array superglobale (che non richiede inizializzazione essendo un array direttamente disponibile all'interno delle funzioni) di sessione $_SESSION, dove rimane memorizzato fino alla chiusura del browser o fino a che l'utente/amministratore non decida di terminare la sessione premendo il pulsante “Logout”. Qualora i dati di accesso digitati non fossero esatti, a seguito del controllo la pagina stamperà a 96 Torna all’indice Guido Moroni 5^D mercurio video un messaggio di errore per informare l’utente e grazie alla funzione reload (definita in apposita libreria) esegue un reindirizzamento alla pagina di provenienza (“utente-login.php”/ “admin-login.php”). Il logout viene effettuato dalla pagina “logout.php” a cui è collegato il pulsante “Logout” presente nell'intestazione di ogni pagina quando loggati. Il funzionamento è semplice: per prima cosa viene richiamata la sessione attiva, poi si procede alla sua eliminazione tramite la funzione “session_destroy()”. A questo punto viene eseguito un reindirizzamento alla homepage. INSERIMENTO NEL DATABASE Per poter inserire nuove tuple nel database è necessario essere amministratori e autenticarsi per l'accesso all'area riservata per quanto riguarda l’inserimento di nuovi prodotti “prodotti-ins.php” mentre per inserire nuovi utenti basta registrarsi attraverso la pagina “utente-registrazione.php”. Una volta compilati il form (per entrambe) viene avviata la procedura in linguaggio php: per prima cosa avviene un controllo sulla correttezza dei campi, dopodiché (solo per l’archivio utenti) viene controllato che il campo chiave (email) non sia già presente all’interno della tabella, se tutti i controlli precedenti sono andati a buon fine a questo punto viene registrato un nuovo record attraverso la funzione “mysql_query(INSERT INTO nome tabella VALUES valori);”, mentre se l’utente o l’amministratore avesse sbagliato a digitare qualche dato viene visualizzato un messaggio di errore e dopo qualche secondo avverrà un reindirizzamento alla pagina stessa. MODIFICA E CANCELLAZIONE Mentre per poter modificare o cancellare dati già presenti nel database è obbligatorio accedere come amministratore. Queste operazioni sono rese molto semplici dal fatto che ogni volta che si desidera intervenire sui dati memorizzati nel database in una specifica tabella(prodotti, utenti), possiamo ricercare il record interessato grazie all’uso di un semplice modulo form; non è quindi richiesto conoscere a memoria il codice della tupla da modificare, ma è sufficiente effettuare una veloce ricerca anche con altri campi (che non siano il codice). Una volta eseguita la ricerca questa manderà a video uno e un solo valore, questo significa che se ricercando per parametri diversi dal codice la query inserita nel programma php dovesse estrapolare più di una tupla verrà mandato a video che la ricerca ha più di un valore e di conseguenza bisognerà riprovare a riprovare a ricercare, magari inserendo qualche dato in più. Nel caso la query eseguita estrapolasse 1 solo valore, invece, sarà possibile effettuare la cancellazione (premendo semplicemente il tasto elimina si avvierà la procedura al cui interno troviamo la query “DELETE FROM nome tabella WHERE condizioni sulle tuple”), oppure la modifica. In quest’ultimo caso, infatti, apparirà un’ulteriore modulo form con delle caselle di testo al cui interno troviamo il contenuto che avevamo digitato al momento dell’inserimento. Una volta modificato il contenuto delle caselle e premuto il tasto modifica avrà inizio la procedura: prima di tutto vengono controllati i campi, dopodiché se i dati sono accettabili avviene la modifica tramite la query “UPDATE nome tabella SET nome colonna=(espressione) WHERE condizioni sulle tuple (se dovessero esserci) ”. INTERROGAZIONE La consultazione dell’archivio prodotti (“catalogo.php”) non richiede un accesso autenticato ed è perciò una funzione disponibile a tutti i visitatori del sito. Dalla pagina consultazione è sufficiente selezionare la query che si desidera eseguire e attendere la 97 Torna all’indice Guido Moroni 5^D mercurio visualizzazione a video dei risultati dell'elaborazione. MANUALE TECNICO: come installare il database ALTERVISTA Una volta iscritti ad altervista potrete configurare il database con la procedura guidata che ora vi spiegherò. Ma prima di iniziare è necessario fare una piccola operazione sul file bennet.sql scaricato. Ciò consiste nel cancellare i comandi sql “CREATE DATABASE bennet” e “USE bennet” questo perché su altervista abbiamo un unico DB chiamato con il nostro nome (es. “My_pippopluto”). Per prima cosa dobbiamo accedere tramite il menù orizzontale andando su AltersitoDatabase 98 Torna all’indice Guido Moroni 5^D mercurio Dopodiché accedere a PhpMyAdmin Inserire le proprie credenziali (username e password) di altervista 99 Torna all’indice Guido Moroni 5^D mercurio Una volta entrati con successo nel pannello PhpMyAdmin dovete importare il DB (bennet.sql) sullo spazio web di altervista 100 Torna all’indice Guido Moroni 5^D mercurio E una volta aperta la pagina di importazione si seleziona tramite il comando “Sfoglia..” il file “bennet.sql” dal nostro PC e dopo averlo aperto cliccare sul pulsante “Esegui”. Il nostro Database è in questo modo configurato perfettamente. XAMPP Scarichiamo XAMPP e clicchiamoci due volte sopra per avviare l’installazione Selezioniamo la lingua e premiamo OK Si presenterà questa finestra di benvenuto. Clicchiamo su Next 101 Torna all’indice Guido Moroni 5^D mercurio Scegliamo dove installare XAMP e premiamo su Next In questa schermata ci verrà chiesto cosa vogliamo installare 102 Torna all’indice Guido Moroni 5^D mercurio Selezioniamo ciò che ci serve e premiamo su Install Inizierà l’installazione con l’estrazione dei file necessari all’utilizzo di XAMPP 103 Torna all’indice Guido Moroni 5^D mercurio Una volta terminato premiamo su Finish Si aprirà la schermata della configurazione dei servizi 104 Torna all’indice Guido Moroni 5^D mercurio Dopo l’installazione dei servizi premiamo su Ok Ci verrà chiesto se vogliamo avviare il pannello di controllo di XAMPP, premiamo su SI Il pannello di XAMPP si presenterà come segue 105 Torna all’indice Guido Moroni 5^D mercurio Configurare il database è molto semplice: aprire il browser e inserire nella barra degli indirizzi “127.0.0.1/phpmyadmin” Fatto ciò premete invio e giungerete all’interfaccia grafica di xampp per configurare il nostro database e premete dal menù “importa” 106 Torna all’indice Guido Moroni 5^D mercurio Dopodiché sfogliate e selezionate il file “bennet.sql” dal vostro PC e premete su “Esegui”. 107 Torna all’indice Guido Moroni 5^D mercurio Il nostro Database è in questo modo configurato perfettamente. COME CONFIGURARE IL SITO La configurazione del sito è veramente molto semplice: - Su Altervista è sufficiente cliccare su “Pubblica” nel menù orizzontale, quindi cliccare su “Gestione file”. A questo punto si crea una cartella che possiamo chiamare come vogliamo e una volta entrati in questa cartella cliccare su “invia files” “selezione files” e di nuovo “invia files” quando abbiamo finito di caricare i files. - Su Xampp bisogna accedere a Computer Disco locale C: xampp htdocs a questo punto create una cartella (chiamatela “bennet” o come preferite) e inserite il contenuto scaricato. A questo punto basterà accedere al proprio browser e digitare nella barra degli indirizzi “127.0.0.1/nome_della_cartella” e potremo finalmente utilizzare l’applicazione anche in locale senza quindi essere connessi ad internet! DESCRIZIONE DEL SITO 1) Il sito ha un'estetica piacevole, coinvolgente dal punto di vista emotivo e dal design moderno? Il nostro sito presenta caratteristiche moderne ma deve essere ancora implementato per raggiungere i livelli di un “perfetto” sito E-commerce. 2) I contenuti del sito sono tutti facilmente raggiungibili da qualsiasi punto in cui si trova l'utente? I contenuti del sito sono facilmente raggiungibili dato che sono inseriti oltre al menù principale orizzontale anche dei sotto menù verticali che ci permettono di spaziare attraverso le varie pagine del sito. 3) Le informazioni su ogni prodotto sono chiare ed esaurienti? Le informazioni sui prodotti sono molto chiare in quanto per ogni prodotto si è scelto di inserire una descrizione, seppur breve, con le caratteristiche essenziali del prodotto preso in questione. 4) La procedura di acquisto è semplice, chiara e senza alcun intoppo? Nonostante non sia ancora stata creata, nel nostro progetto, abbiamo intenzione di creare una procedura molto semplice i modo che posso essere alla portata di tutti gli utenti, anche quelli meno esperti del mondo del commercio elettronico. 5) Le informazioni sulla vostra azienda e i vostri servizi sono tutte presenti e chiare? Le informazioni relative alla nostra azienda sono presenti nel sito 6) il vostro sito ha delle caratteristiche che lo distinguono rispetto a quelli della concorrenza o la differenza è sostanzialmente solo nel prezzo e nel catalogo dei prodotti? 108 Torna all’indice Guido Moroni 5^D mercurio Il nostro sito è differente dagli altri siti e-commerce in quanto non solo presenta un prezzo inferiore ma anche il catalogo prodotti è molto fornito. Gestione del sito e delle attività collegate 1) I vostri operatori rispondono rapidamente alle richieste dei clienti? Si, cerchiamo di essere vicini al cliente in modo che sia soddisfatto del nostro servizio. 2) Dopo l'acquisto, la vostra azienda riesce a mantenere un contatto con il cliente? Dopo l’acquisto l’azienda riesce a mantenere un contatto con i clienti grazie alle continue offerte sui prodotti. 3) Conoscete le caratteristiche dei clienti che hanno acquistato mediante il vostro sito? Si, perché i dati dei clienti vengono registrati sul nostro database Marketing e attività commerciali via Internet 1) Quali campagne pubblicitarie e di che tipo avete già realizzato su Internet? Al momento nessuna, ma abbiamo già programmato l’uscita della prima pubblicità a breve. 2) La vostra azienda conosce e sa sfruttare le grandi opportunità commerciali offerte dai social network e dal Web 2.0? Si, la nostra azienda conosce e sa sfruttare queste opportunità, infatti, ha già aperto una pagina face book per “pubblicizzare” il nostro sito e farlo conoscere più velocemente. 3) I clienti riescono ad attribuire alla vostra azienda caratteristiche uniche rispetto alla concorrenza? Al momento non ne abbiamo nessuna informazione a tale riguardo, in quanto il sito è ancora in fase di costruzione. 4) Tempistica e breve sintesi del lavoro svolto Dopo aver creato il template ci siamo dedicati immediatamente alla parte relativa al database con la definizione delle tabelle e le loro relazioni. A questo punto ci siamo dedicati all’area dedicata ai clienti con la registrazione e login (realizzato anche attraverso l’uso delle sessioni). In questo momento ci stiamo dedicando alla parte relativa al carrello. Preventivo sito web (ipotesi) Componente Costo Registrazione dominio € 100,00 Home page € 70,00 Pagine in php € 130,00 Carrello € 150,00 Aggiornamento database € 100,00 Totale: €550,00 109 Torna all’indice Guido Moroni 5^D mercurio PARTE DIDATTICA TECNICA Che cos’è un database (differenza tra MyISAM e InnoDB) Per database s’intende un insieme di dati : memorizzati in modo permanente su dei supporti fisici. I dati devono essere sempre disponibili e quindi memorizzati in modo permanente su opportune unità di memoria di massa. La scelta del tipo di memorie secondarie e del loro dimensionamento è uno dei compiti da affrontare durante la fase realizzativa, tenendo anche conto delle risorse HW disponibili riportate nelle specifiche tecnologie; strutturati sulla base di uno schema logico. I dati raccolti e poi memorizzati in un database sono numerosi e disordinati. Il compito del gruppo di programmatori è quello di realizzare un opportuno modello per avere una visione ordinata e organizzata dei dati. Lo schema logico è la realizzazione (ottimizzata) dello schema statico del progetto concettuale. I moderni DBMS mettono a disposizione dei programmatori opportuni linguaggi che permettono di tradurre schemi logici di database con semplici istruzioni ad alto livello; protetti dall’esterno e affidabili. I dati sono una risorsa vitale e quindi vanno tutelati; la loro perdita può causare gravi errori nella gestione di qualsiasi ente, pubblico o privato. Tra le cause che possono portare alla perdita di dati, troviamo quelle legate: all’hardware, come il danneggiamento dei dischi; al software, dovute ad esempio a errori logici nei programmi di gestione non scoperti nella fase di testing; Ai problemi precedenti si aggiunge la necessità di proteggere i dati dall’accesso esterno da parte di utenti non autorizzati. A tal fine, i moderni DBMS forniscono meccanismi di protezione, mediante i quali i programmatori possono organizzare la sicurezza del loro sistema informativo. organizzati con la minima ridondanza. La ridondanza è sinonimo di duplicazione dei dati raccolti, situazione che comporta: uso non ottimizzato della risorsa “spazio” sulle memorie di massa; problemi logici di gestione; Il problema della ridondanza è particolarmente sentito nel caso di sistemi informatici multiutente, in cui nello stesso istante più operatori possono volere aggiornare i dati relativi alla stessa entità. In questa situazione, è compito del software di gestione del database organizzare gli accessi agli archivi fisici con i dati condivisi, in modo che soltanto un utente alla volta sia in grado di effettuare operazioni di aggiornamento. 110 Torna all’indice Guido Moroni 5^D mercurio disponibili in modo controllato per essere utilizzati da applicazioni diverse. I dati presenti all’interno di un database possono essere utilizzati da differenti applicazioni per scopi diversi. Le applicazioni esterne per accedere alle basi di dati di altri sottoinsiemi devono possedere le necessarie autorizzazioni (problema di sicurezza). InnoDB è un motore per il salvataggio di dati per MySQL, fornito in tutte le sue distribuzioni. È stato acquistato dalla Oracle Corporation prima ancora che acquistasse MySQL. Ecco in che cosa si differenzia da MyISAM. Per riparare una tabella dopo un crash del sistema, InnoDB riesegue le ultime istruzioni registrate nei log. MyISAM deve invece eseguire una scansione completa della tabella per poi ripararla, ed eventualmente ricostruire gli indici. Di conseguenza, il tempo impiegato da InnoDB per la riparazione non aumenta con il crescere dei dati contenuti nella tabella, mentre il tempo impiegato da MyISAM è proporzionale alle dimensioni della tabella. Mentre MyISAM si affida al sistema operativo per il caching delle letture e delle scritture sulle tabelle, InnoDB ha una sua propria gestione della cache. Le pagine di dati modificate non vengono inviate immediatamente al sistema e questo, in alcuni casi, può rendere la modifica dei dati molto più rapida con InnoDB. MyISAM generalmente immagazzina i record di una tabella nell'ordine in cui sono state create, mentre InnoDB le immagazzina nell'ordine seguito dalla chiave primaria. Quando viene utilizzata la chiave per la lettura di una riga, l'operazione avviene più rapidamente. InnoDB comprime i record molto meno rispetto a MyISAM. Questo significa che la memoria e lo spazio su disco richiesti da InnoDB sono maggiori, nonostante nella versione 5 di MySQL lo spazio su disco richiesto sia diminuito del 20%. Allo stato attuale, InnoDB non supporta le ricerche fulltext. Cos’è un server web Un server web è un servizio o tipologia di server, e per estensione il computer su cui è in esecuzione, che si occupa di fornire, tramite software dedicato e su richiesta dell'utente (client), file di qualsiasi tipo, tra cui pagine web (successivamente visualizzabili dal web browser sul PC dell'utente). Le informazioni inviate dal server web all'utente viaggiano in rete trasportate dal protocollo HTTP. L'insieme di server web dà vita al World Wide Web, uno dei servizi più utilizzati della Rete Internet. Differenza tra pagine statiche e dinamiche Per pagina web statica si intende una pagina web i cui contenuti (testuali e grafici) sono formattati direttamente in codice HTML, senza l'uso di linguaggi di scripting (come PHP,ASP, .NET, Javascript) 111 Torna all’indice Guido Moroni 5^D mercurio L'elaborazione da parte del web browser del codice HTML visualizza le pagine nel modo univoco deciso dallo sviluppatore attraverso l'uso di Web editor, testuali o visuali e così via. Tale tipo di scrittura è propria della prima forma o paradigma di programmazione Web (ed anche la più facile) che ha dato vita al cosiddetto Web statico contrapposto al successivo Web dinamico. Si differenzia da quest'ultimo per il fatto che una pagina web dinamica consente una gestione più flessibile dei contenuti e una maggiore interattività con l'utente. L'insieme di pagine web statiche correlate e linkate tra loro da vita ad un sito web statico. Una pagina web dinamica è una pagina web il cui contenuto, in tutto o in parte, è generato sul momento dal server, potendo dunque essere diversa ogni volta che viene richiamata consentendo un'interattività con l'utente, secondo il paradigma di programmazione Web noto come Web dinamico. In sostanza si ricorre a dei linguaggi di programmazione (i linguaggi di scripting) che si occupano della creazione della pagina nel momento in cui questa viene visitata dal client, anche interagendo con i visitatori, e possono variare l'output HTML successivo dopo calcoli eseguiti con apposite strutture messe a disposizione dal linguaggio di scripting utilizzato. L'utilizzo di pagine dinamiche è diventato molto velocemente una esigenza pressante nel mondo del World Wide Web: se i primi siti web creati erano, sostanzialmente, la versione elettronica di pubblicazioni scientifiche (e quindi il loro contenuto non variava nel tempo cioè era statico), quasi subito si è venuta a creare l'esigenza di collegare le proprie pagine ad archivi di dati in continua variazione o aggiornamento. L'avvento dei linguaggi di programmazione dinamica ha dato l'impulso per uno sviluppo veloce ed economico di una moltitudine di servizi evoluti su Internet, spesso etichettati con il termine Web 2.0. Cos’è MySQL MySQL, definito Oracle MySQL, è un Relational database management system (RDBMS), composto da un client con interfaccia a caratteri e un server, entrambi disponibili sia per sistemi Unix come GNU/Linux che per Windows, anche se prevale un suo utilizzo in ambito Unix. Dal 1996 supporta la maggior parte della sintassi SQL e si prevede in futuro il pieno rispetto dello standard ANSI. Possiede delle interfacce per diversi linguaggi, compreso un driver ODBC, due driver Java, un driver per Mono e .NET ed una libreria per python. Il codice di MySQL venne sviluppato fin dal 1979 dalla ditta TcX ataconsult, poi rinominata MySQL AB, ma è solo dal 1996 che viene distribuita una versione che supporta SQL, prendendo spunto da un altro prodotto: mSQL. MySQL AB è stata rilevata da Sun Microsystems nel 2008, mentre nel 2010 quest'ultima è stata acquisita da Oracle Corporation. MySQL svolge il compito di DBMS nella piattaforma LAMP, una delle più usate e installate su Internet per lo sviluppo di siti e applicazioni web dinamiche. 112 Torna all’indice Guido Moroni 5^D mercurio Definizioni: Record: un record è l'insieme delle informazioni di un elemento. Semplificando il discorso, un record è una riga di una tabella. Campo: un campo è una caratteristica della tabella. Semplificando, è il nome della colonna. Query: è un'interrogazione al database. Attraverso il linguaggio SQL, con una query è possibile estrarre informazioni e manipolare i dati. Il modo in cui, praticamente, i comandi vengono inviati ad una base dati cambia a seconda del db utilizzato. Con Microsoft Access è possibile costruire le query in visuale ed inviarle direttamente dal programma (è un db particolare, che in un solo file contiene tool, motore, strumenti di sviluppo). Con mysql è possibile utilizzare la riga di comando (anche da DOS, se è installato mysql sul pc), tool particolari o script php. Una pagina PHP consente un accesso diretto a qualsiasi db mysql (di cui si conoscano username e password). Cos’è il PHP Il php (acronimo ricorsivo di "PHP: Hypertext Preprocessor", preprocessore di ipertesti; originariamente acronimo di "Personal Home Page") è un linguaggio di scripting interpretato, con licenza open source e libera, originariamente concepito per la programmazione Web ovvero la realizzazione di pagine web dinamiche. Attualmente è utilizzato principalmente per sviluppare applicazioni web lato server ma può essere usato anche per scrivere script a riga di comando o applicazioni standalone con interfaccia grafica. L'elaborazione di codice PHP sul server produce codice HTML da inviare al browser dell'utente che ne fa richiesta. Il vantaggio dell'uso di PHP e degli altri linguaggi Web come ASP e .NET rispetto al classico HTML derivano dalle differenze profonde che sussistono tra Web dinamico e Web statico. PHP riprende per molti versi la sintassi del C, come peraltro fanno molti linguaggi moderni. È un linguaggio a tipizzazione debole e dalla versione 5 migliora il supporto al paradigma di programmazione ad oggetti. Certi costrutti derivati dal C, come gli operatori fra bit e la gestione di stringhe come array, permettono in alcuni casi di agire a basso livello; tuttavia è fondamentalmente un linguaggio di alto livello, caratteristica questa rafforzata dall'esistenza delle sue moltissime API (insieme di procedure disponibili al programmatore), oltre 3.000 funzioni del nucleo base. PHP è in grado di interfacciarsi a innumerevoli database (tra cui MySQL) e supporta numerose tecnologie, come XML, SOAP, IMAP, FTP, CORBA. Si integra anche con altri linguaggi/piattaforme quali Java e .NET. Fornisce un'API specifica per interagire con Apache, nonostante funzioni naturalmente con numerosi altri server web. È anche ottimamente integrato con il database MySQL, per il quale possiede più di una API. Per questo motivo esiste un'enorme quantità di script e librerie in PHP, 113 Torna all’indice Guido Moroni 5^D mercurio disponibili liberamente su Internet. La versione 5, comunque, integra al suo interno un piccolo database embedded, SQLite. Dispone di un archivio chiamato PEAR che mette a disposizione un framework di librerie riusabili per lo sviluppo di applicazioni PHP e di PECL che raccoglie tutte le estensioni conosciute scritte in C. A partire dal 2011 PHP non ha supporto nativo per le stringhe Unicode o multibyte, il supporto Unicode è in fase di sviluppo per una futura versione di PHP e consentirà stringhe così come classe, metodo, e la funzione nomi per contenere caratteri non ASCII. 114 Torna all’indice