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">
© 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 "€ $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à: <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">
© 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à indicare le
31
Torna all’indice
Guido Moroni 5^D mercurio
sue generalità 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à*:</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 è 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 è già 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ù tardi";
}
}
echo"</h1>";
}
?>
<?php
mysql_close();
?>
36
Torna all’indice
Guido Moroni 5^D mercurio
</div> <!-- fine div destro -->
<div id="footer">
© 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">
© 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">
© 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ò visualizzare i prodotti che ha
selezionato dal nostro catalogo.<br>
Se vuole aquistare i prodotti prema il tasto ACQUISTA!<br>
altrimenti può 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à</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> € $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> € <?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">
© 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ò visualizzare i prodotti che ha
selezionato dal nostro catalogo.<br>
Se vuole aquistare i prodotti prema il tasto ACQUISTA!<br>
altrimenti può 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à 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à</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> € $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> € <?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">
© 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">
© 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">
© 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à 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à 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">
© 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
(€):</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
è 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ù 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">
© 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 (€):</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ù 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">
© 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 AltersitoDatabase
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