Skip to content
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

Open
wants to merge 1 commit into
base: 15_cart_archive
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 23 additions & 20 deletions aggiungi_prodotto_carrello.php
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');
}
19 changes: 8 additions & 11 deletions concludi_ordine.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);
Copy link
Member

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

salvaOrdine($prodotti, $utente);

// rimando a pagina carrello
//rimando a pagina carrello
header ('location: grazie.php');
1 change: 1 addition & 0 deletions include/header.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<ul class="nav navbar-nav navbar-right">
<li><a href="/carrello.php">Carrello</a></li>
<li><a href="/contatti.html">Contatti</a></li>
<li><a href="/riepilogo_giacenze.php">Giacenze</a></li>
</ul>
</div>
</div>
Expand Down
100 changes: 48 additions & 52 deletions libs/db.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) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$movimenta è dichiarata come una classe, ma poi ci iteri... Gli oggetti in php sono effettivamente iterabili, ma non so se era quello che volevi effettivamente fare

$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
Copy link
Member

Choose a reason for hiding this comment

The 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??)
Copy link
Member

Choose a reason for hiding this comment

The 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);
}
Loading