-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Esercizio Magazzino #6
base: 15_cart_archive
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,35 @@ | ||
<?php | ||
// inizializziamo le sessioni | ||
session_start(); | ||
|
||
// usiamo il namespace corretto per la classe Giacenze | ||
use MvLabs\Chocosite\Model\Giacenze; | ||
include 'libs/db.php'; | ||
|
||
// includere i file con le classi gestiti da Composer | ||
include 'vendor/autoload.php'; | ||
|
||
// usiamo il namespace corretto per la classe ArchivioCarrelli | ||
use MvLabs\Chocosite\Model\ArchivioCarrelli; | ||
|
||
// recuperiamo il prodotto da aggiungere al carrello | ||
// lettura parametro da URL | ||
$codiceProdotto = $_GET['codice']; | ||
|
||
$prodotto = recuperaProdottoDaCodice($codiceProdotto); | ||
|
||
//aggiungiProdottoCarrello($prodotto, 1); | ||
|
||
// istanziare una classe carrello | ||
$archivioCarrelli = new ArchivioCarrelli(); | ||
$carrello = $archivioCarrelli->recupera(); | ||
|
||
// aggiungere prodotto al carrello | ||
$carrello->aggiungiRigaCarrello($prodotto, 1); | ||
|
||
// salvare il carrello in sessione | ||
$archivioCarrelli->salva($carrello); | ||
|
||
// rimando a pagina carrello | ||
header ('location: carrello.php'); | ||
//recupero dal db le giacenze che vengono vengono rese disponibili da PDO e recuperate nel costruttore della classe Giacenze | ||
$verificaCodice = recuperaGiacenzaDaCodice($codiceProdotto); | ||
//Recupero la quantità in giacenza | ||
foreach ($verificaCodice as $value) { | ||
$disponibile=($value->qta()); | ||
} | ||
//aggiungiProdottoCarrello($prodotto, 1) | ||
if ($disponibile>0) { | ||
// istanziare una classe carrello | ||
$archivioCarrelli = new ArchivioCarrelli(); | ||
$carrello = $archivioCarrelli->recupera(); | ||
// aggiungere prodotto al carrello | ||
$carrello->aggiungiRigaCarrello($prodotto, 1); | ||
// salvare il carrello in sessione | ||
$archivioCarrelli->salva($carrello); | ||
// rimando a pagina carrello | ||
header ('location: carrello.php'); | ||
} else { | ||
// prodotto non disponibile | ||
header ('location: non_disponibile.php'); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,25 @@ | ||
<?php | ||
|
||
// usiamo il namespace corretto per la classe ArchivioCarrelli | ||
use MvLabs\Chocosite\Model\ArchivioCarrelli; | ||
|
||
use MvLabs\Chocosite\Model\Giacenze; | ||
use MvLabs\Chocosite\Model\Segno; | ||
// inizializziamo le sessioni | ||
session_start(); | ||
|
||
// includere i file con le classi gestiti da Composer | ||
include 'vendor/autoload.php'; | ||
|
||
include 'libs/db.php'; | ||
|
||
// creo un'istanza dell'archivio carrelli | ||
$archivioCarrelli = new ArchivioCarrelli(); | ||
|
||
// recupero il carrello corrente | ||
$carrello = $archivioCarrelli->recupera(); | ||
|
||
// recuperiamo i dati di carrello e utente e li salviamo in un file json | ||
$prodotti = $carrello->getRigheCarrello(); | ||
|
||
$utente = $_SESSION['utente']; | ||
|
||
//istanzio la classe Giacenze | ||
$movimenta= new Giacenze(); | ||
//Definisco se si tratta di un carico o scarico del magazzino | ||
$Segno=New Segno('-'); | ||
setGiacenza($movimenta->movimenta($prodotti),$Segno); | ||
salvaOrdine($prodotti, $utente); | ||
|
||
// rimando a pagina carrello | ||
//rimando a pagina carrello | ||
header ('location: grazie.php'); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,155 +1,151 @@ | ||
<?php | ||
|
||
use MvLabs\Chocosite\Entity\Tavoletta; | ||
|
||
use MvLabs\Chocosite\Model\Giacenze; | ||
use MvLabs\Chocosite\Model\Segno; | ||
require __DIR__ . '/../vendor/autoload.php'; | ||
|
||
function creaConnessionePDO() { | ||
// Nella realtà evitare di connettersi al db con l'utente "root". | ||
// E' preferibile creare un utente ad-hoc | ||
return new PDO('mysql:host=localhost;dbname=mvchocolates', 'root', 'mvlabs'); | ||
} | ||
|
||
function inizializzaListaProdotti() { | ||
$db = creaConnessionePDO(); | ||
$stmt = $db->prepare('SELECT * FROM prodotti'); | ||
$stmt->execute(); | ||
|
||
return $stmt->fetchAll(PDO::FETCH_CLASS, Tavoletta::class); | ||
} | ||
function inizializzaGiacenze() { | ||
$db = creaConnessionePDO(); | ||
$stmt = $db->prepare('SELECT prodotti.codice, prodotti.descrizione, giacenze.qta FROM prodotti LEFT JOIN giacenze ON prodotti.codice=giacenze.codice;'); | ||
$stmt->execute(); | ||
return $stmt->fetchAll(PDO::FETCH_CLASS, Giacenze::class); | ||
} | ||
function setGiacenza(stdclass $movimenta,Segno $segno){ | ||
|
||
$db = creaConnessionePDO(); | ||
try { | ||
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | ||
$db->beginTransaction(); | ||
// legge l'array e ricava le quantità da movimentare e i prodotti da aggiornare | ||
//(ipotizzando che nella tabella giacenze ci siano tutti i prodotti (delegando tutto all'inserimento di nuovi prodotti)) | ||
foreach ($movimenta as $prodotto) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
$qtaMov=$prodotto['quantita']*$segno->getSegno();//DEFINISCO SE SI TRATTA DI UN CARICO O SCARICO | ||
$codice=$prodotto['prodotto']->codice();//non posso passarlo direttamente a PDO come parametro?? | ||
//non capisco perchè non viene generata l'eccezione per un update quando la quantità diventa negativa | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. non succede perchè per il database non è un errore. A quel che vedo mysql, se cerchi di settare come negativo un campo UNSIGNED, semplicemente lo mette a 0 |
||
$stmt = $db->prepare("UPDATE giacenze SET qta=(qta+:mov) WHERE codice=:codice;");//il campo qta è unsigned percui i valori negativi dovrebbero creare un eccezione?? | ||
$stmt->bindParam(':mov', $qtaMov, PDO::PARAM_STR); | ||
$stmt->bindParam(':codice', $codice, PDO::PARAM_STR); | ||
$stmt->execute(); | ||
} | ||
//un sacco di update da committare ---- (delego al database il controllo della concorrenza??) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. forse la cosa migliore sarebbe assicurarsi a priori che non vengano mai fatti più udate per la stessa riga delle giacenze, sommando a priori tutti i movimenti |
||
$db->commit(); | ||
} catch (Exception $e) { | ||
$db->rollBack(); | ||
echo "Si è verificato un errore: " . $e->getMessage(); | ||
} | ||
} | ||
function recuperaGiacenzaDaCodice($codice) { | ||
$db = creaConnessionePDO(); | ||
// prepara la query da eseguire | ||
$stmt = $db->prepare('SELECT codice, qta FROM giacenze WHERE codice LIKE :codice'); | ||
// filtra i dati ricevuti e si assicura che non contengano caratteri indesiderati | ||
$codice = filter_input(INPUT_GET, 'codice', FILTER_SANITIZE_STRING); | ||
// sanitizza i dati per evitare SQL injections | ||
$stmt->bindParam(':codice', $codice, PDO::PARAM_STR); | ||
$stmt->setFetchMode(PDO::FETCH_CLASS, Giacenze::class); | ||
// esegue la query | ||
$stmt->execute(); | ||
return $stmt->fetchAll(PDO::FETCH_CLASS, Giacenze::class); | ||
} | ||
function recuperaProdottoDaCodice($codice) { | ||
$db = creaConnessionePDO(); | ||
|
||
// prepara la query da eseguire | ||
$stmt = $db->prepare('SELECT * FROM prodotti WHERE codice LIKE :codice'); | ||
|
||
// filtra i dati ricevuti e si assicura che non contengano caratteri indesiderati | ||
$codice = filter_input(INPUT_GET, 'codice', FILTER_SANITIZE_STRING); | ||
|
||
// sanitizza i dati per evitare SQL injections | ||
$stmt->bindParam(':codice', $codice, PDO::PARAM_STR); | ||
|
||
$stmt->setFetchMode(PDO::FETCH_CLASS, Tavoletta::class); | ||
|
||
// esegue la query | ||
$stmt->execute(); | ||
|
||
return $stmt->fetch(PDO::FETCH_CLASS); | ||
} | ||
|
||
function salvaOrdine($prodotti, $utente) { | ||
|
||
$db = creaConnessionePDO(); | ||
|
||
try { | ||
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | ||
|
||
$db->beginTransaction(); | ||
|
||
// inserimento in tabella clienti | ||
$stmt = $db->prepare("INSERT INTO clienti (nome, cognome, email, indirizzo, citta, cap, provincia) | ||
VALUES (:nome, :cognome, :email, :indirizzo, :citta, :cap, :provincia)"); | ||
|
||
$stmt->bindParam(':nome', $utente['nome'], PDO::PARAM_STR); | ||
$stmt->bindParam(':cognome', $utente['cognome'], PDO::PARAM_STR); | ||
$stmt->bindParam(':email', $utente['email'], PDO::PARAM_STR); | ||
$stmt->bindParam(':indirizzo', $utente['indirizzo'], PDO::PARAM_STR); | ||
$stmt->bindParam(':citta', $utente['citta'], PDO::PARAM_STR); | ||
$stmt->bindParam(':cap', $utente['cap'], PDO::PARAM_STR); | ||
$stmt->bindParam(':provincia', $utente['provincia'], PDO::PARAM_STR); | ||
|
||
$stmt->execute(); | ||
|
||
$idCliente = $db->lastInsertId(); | ||
|
||
// inserimento in tabella ordini | ||
$stmt = $db->prepare("INSERT INTO ordini (cliente_id, data, totale, note) | ||
VALUES (:cliente_id, :data, :totale, :note)"); | ||
|
||
$stmt->bindParam(':cliente_id', $idCliente, PDO::PARAM_INT); | ||
|
||
$date = date('Y-m-d H:i:s'); | ||
$stmt->bindParam(':data', $date); | ||
|
||
$totale = 0; | ||
foreach($prodotti as $rigaProdotto) { | ||
$totale += $rigaProdotto['prodotto']->prezzo() * $rigaProdotto['quantita']; | ||
} | ||
|
||
$stmt->bindParam(':totale', $totale, PDO::PARAM_INT); | ||
$stmt->bindParam(':note', $utente['note'], PDO::PARAM_STR); | ||
|
||
$stmt->execute(); | ||
|
||
$idOrdine = $db->lastInsertId(); | ||
|
||
// inserimento in tabella ordini_dettagli | ||
foreach($prodotti as $rigaProdotto) { | ||
|
||
$codice=$rigaProdotto['prodotto']->codice(); | ||
$prezzo=$rigaProdotto['prodotto']->prezzo(); | ||
$stmt = $db->prepare("INSERT INTO ordini_dettagli (ordine_id, codice_prodotto, prezzo, quantita, totale) | ||
VALUES (:ordine_id, :codice_prodotto, :prezzo, :quantita, :totale)"); | ||
|
||
$stmt->bindParam(':ordine_id', $idOrdine, PDO::PARAM_INT); | ||
$stmt->bindParam(':codice_prodotto', $rigaProdotto['prodotto']->codice(), PDO::PARAM_STR); | ||
$stmt->bindParam(':prezzo', $rigaProdotto['prodotto']->prezzo(), PDO::PARAM_INT); | ||
$stmt->bindParam(':codice_prodotto', $codice, PDO::PARAM_STR); | ||
$stmt->bindParam(':prezzo', $prezzo, PDO::PARAM_INT); | ||
$stmt->bindParam(':quantita', $rigaProdotto['quantita'], PDO::PARAM_INT); | ||
|
||
$totale = $rigaProdotto['prodotto']->prezzo() * $rigaProdotto['quantita']; | ||
$stmt->bindParam(':totale', $totale, PDO::PARAM_INT); | ||
|
||
$stmt->execute(); | ||
|
||
} | ||
|
||
$db->commit(); | ||
|
||
} catch (Exception $e) { | ||
$db->rollBack(); | ||
echo "Si è verificato un errore: " . $e->getMessage(); | ||
} | ||
|
||
// svuotamento variabili di sessione | ||
unset($_SESSION['utente']); | ||
unset($_SESSION['carrello']); | ||
} | ||
|
||
function getListaOrdini() { | ||
$db = creaConnessionePDO(); | ||
|
||
$query = "SELECT ordini.id, ordini.data, clienti.nome, clienti.cognome, COUNT(ordini_dettagli.id) as num_prodotti, ordini.totale | ||
FROM ordini, clienti, ordini_dettagli | ||
WHERE ordini.id = ordini_dettagli.ordine_id | ||
AND ordini.cliente_id = clienti.id | ||
GROUP BY ordini.id"; | ||
|
||
return $db->query($query); | ||
} | ||
|
||
function recuperaOrdine($id) { | ||
$db = creaConnessionePDO(); | ||
|
||
$stmt = $db->prepare('SELECT * FROM ordini, clienti WHERE ordini.cliente_id = clienti.id AND ordini.id = :id'); | ||
|
||
$codice = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); | ||
|
||
$stmt->bindParam(':id', $id, PDO::PARAM_INT); | ||
|
||
$stmt->execute(); | ||
|
||
return $stmt->fetch(PDO::FETCH_ASSOC); | ||
} | ||
|
||
function recuperaDettagliOrdine($id) { | ||
$db = creaConnessionePDO(); | ||
|
||
$stmt = $db->prepare('SELECT * FROM ordini_dettagli WHERE ordine_id = :id'); | ||
|
||
$codice = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); | ||
|
||
$stmt->bindParam(':id', $id, PDO::PARAM_INT); | ||
|
||
$stmt->execute(); | ||
|
||
return $stmt->fetchAll(PDO::FETCH_ASSOC); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
forse poteva aver senso usare setGiacenza all'interno di
salvaOrdine
, in modo da assicurarci che non sia possibile chiamare l'uno sensa che venga eseguito anche l'altro