/** * Salva un ordine sul DB * @param $elenco array di articoli che fanno parte dell'ordine * @param $cliente id cliente che ha effettuato l'ordine * @param Pagamento $pay il metodo di ordine scelto dal cliente * @param float $subtotale il prezzo dell'ordine * @return boolean true se il salvataggio va a buon fine, false altrimenti */ public function salvaOrdine($elenco, $cliente_id, Pagamento $pay, $subtotale) { $mysqli = Db::getInstance()->connectDb(); if (!isset($mysqli)) { error_log("[salvaOrdine] impossibile inizializzare il database"); $mysqli->close(); return false; } $stmt = $mysqli->stmt_init(); $stmt2 = $mysqli->stmt_init(); $insert_ordine = "insert into ordini (id, data_creazione, subtotale, cliente_id) \n values (default, NOW(), ?, ?)"; $insert_articoli = 'insert into articoli values (default, ?, ?, ?, ?, ?)'; //stmt tab ordini $stmt->prepare($insert_ordine); if (!$stmt) { error_log("[salvaOrdine] impossibile" . " inizializzare il prepared statement"); $mysqli->close(); return false; } //stmt tab articoli $stmt2->prepare($insert_articoli); if (!$stmt2) { error_log("[salvaOrdine] impossibile" . " inizializzare il prepared statement 2"); $mysqli->close(); return false; } //stmt tab ordini if (!$stmt->bind_param('di', floatval($subtotale), intval($cliente_id))) { error_log("[salvaOrdine] impossibile" . " effettuare il binding in input stmt"); $mysqli->close(); return false; } //var stmt tab articoli $articolo_size = ''; $articolo_qty = 0; $articolo_prezzo = 0.0; $articolo_pizza_id = 0; $ordine_id = 0; //stmt tab articoli if (!$stmt2->bind_param('sidii', $articolo_size, $articolo_qty, $articolo_prezzo, $articolo_pizza_id, $ordine_id)) { error_log("[salvaOrdine] impossibile" . " effettuare il binding in input stmt2"); $mysqli->close(); return false; } // inizio transazione $mysqli->autocommit(false); // echo 'attuale:' . $pay->getSaldo() . '<br>'; if ($pay->getSaldo() >= $subtotale) { PagamentoFactory::instance()->aggiornaSaldoPagamento($pay, $pay->getSaldo() - $subtotale); // echo 'nuovo:' . $pay->getSaldo() . '<br>'; } else { $mysqli->rollback(); $mysqli->close(); return false; } //stmt tab ordini if (!$stmt->execute()) { error_log("[salvaOrdine] impossibile" . " eseguire lo statement"); $mysqli->rollback(); $mysqli->close(); return false; } //stmt tab articoli foreach ($elenco as $articolo) { $articolo_size = $articolo->getSize(); $articolo_qty = $articolo->getQty(); $articolo_prezzo = $articolo->getPrezzoArticolo(); $articolo_pizza_id = $articolo->getPizza()->getId(); $ordine_id = $stmt->insert_id; if (!$stmt2->execute()) { error_log("[salvaOrdine] impossibile" . " eseguire lo statement 2"); $mysqli->rollback(); $mysqli->close(); return false; } } // tutto ok, posso rendere persistente il salvataggio $mysqli->commit(); $mysqli->autocommit(true); $mysqli->close(); return true; }