|
<?php |
|
class Order { |
|
// (A) CONSTRUCTOR - CONNECT TO THE DATABASE |
|
private $pdo = null; |
|
private $stmt = null; |
|
public $error; |
|
function __construct () { |
|
$this->pdo = new PDO( |
|
"mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, |
|
DB_USER, DB_PASSWORD, [ |
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, |
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC |
|
]); |
|
} |
|
|
|
// (B) DESTRUCTOR - CLOSE DATABASE CONNECTION |
|
function __destruct () { |
|
if ($this->stmt !== null) { $this->stmt = null; } |
|
if ($this->pdo !== null) { $this->pdo = null; } |
|
} |
|
|
|
// (C) EXECUTE SQL QUERY |
|
function query ($sql, $data=null) : void { |
|
$this->stmt = $this->pdo->prepare($sql); |
|
$this->stmt->execute($data); |
|
} |
|
|
|
// (D) GET ALL MENU ITEMS |
|
function getMenu () { |
|
$this->query("SELECT * FROM `menu`"); |
|
return $this->stmt->fetchAll(); |
|
} |
|
|
|
// (E) GET ITEMS IN CART |
|
function getCart () { |
|
// (E1) SQL QUERY |
|
$this->query(sprintf( |
|
"SELECT * FROM `menu` WHERE `item_id` IN (%s)", |
|
substr(str_repeat("?,", count($_SESSION["cart"])), 0, -1) |
|
), array_keys($_SESSION["cart"])); |
|
|
|
// (E2) GET DATA |
|
$cart = ["i"=>[], "t"=>0]; |
|
while ($r = $this->stmt->fetch()) { |
|
$cart["i"][$r["item_id"]] = [ |
|
"n" => $r["item_name"], // name |
|
"q" => $_SESSION["cart"][$r["item_id"]], // quantity |
|
"p" => $r["item_price"] * $_SESSION["cart"][$r["item_id"]] // price |
|
]; |
|
$cart["t"] += $cart["i"][$r["item_id"]]["p"]; |
|
} |
|
return $cart; |
|
} |
|
|
|
// (F) CHECKOUT |
|
function checkout () : void { |
|
// (F1) EMPTY CART |
|
if (count($_SESSION["cart"])==0) { exit("Cart is empty."); } |
|
|
|
// (F2) "MAIN ORDER" |
|
$this->pdo->beginTransaction(); |
|
$this->query("INSERT INTO `orders` (`order_status`) VALUES (0)"); |
|
$oid = $this->pdo->lastInsertId(); |
|
|
|
// (F3) ORDER ITEMS |
|
$cart = $this->getCart(); |
|
$i = 1; |
|
foreach ($cart["i"] as $item) { |
|
$this->query( |
|
"INSERT INTO `order_items` (`order_id`, `item_id`, `item_name`, `item_price`, `item_qty`) VALUES (?, ?, ?, ?, ?)", |
|
[$oid, $i, $item["n"], $item["p"], $item["q"]] |
|
); |
|
$i++; |
|
} |
|
|
|
// (F4) ORDER TOTALS |
|
$this->query( |
|
"INSERT INTO `order_totals` (`order_id`, `total_id`, `total_name`, `total_amt`) VALUES (?, ?, ?, ?)", |
|
[$oid, 1, "total", $cart["t"]] |
|
); |
|
|
|
// (F5) DONE |
|
$this->pdo->commit(); |
|
$_SESSION["cart"] = []; |
|
echo "OK"; |
|
} |
|
|
|
// (G) GET ALL INCOMPLETE ORDERS |
|
function getOrders () { |
|
$orders = []; |
|
$this->query("SELECT * FROM `orders` WHERE `order_status`<2"); |
|
foreach ($this->stmt->fetchAll() as $o) { |
|
$orders[$o["order_id"]] = $o; |
|
$this->query("SELECT `item_name`, `item_price`, `item_qty` FROM `order_items` WHERE `order_id`=?", [$o["order_id"]]); |
|
$orders[$o["order_id"]]["i"] = $this->stmt->fetchAll(); |
|
$this->query("SELECT `total_name`, `total_amt` FROM `order_totals` WHERE `order_id`=?", [$o["order_id"]]); |
|
$orders[$o["order_id"]]["t"] = $this->stmt->fetchAll(); |
|
} |
|
return $orders; |
|
} |
|
|
|
// (H) UPDATE ORDER |
|
function update ($id) : void { |
|
$this->query( |
|
"UPDATE `orders` SET `order_status`=`order_status`+1 WHERE `order_id`=?", |
|
[$id] |
|
); |
|
} |
|
} |
|
|
|
// (I) DATABASE SETTINGS - CHANGE TO YOUR OWN! |
|
define("DB_HOST", "localhost"); |
|
define("DB_NAME", "test"); |
|
define("DB_CHARSET", "utf8mb4"); |
|
define("DB_USER", "root"); |
|
define("DB_PASSWORD", ""); |
|
|
|
// (J) ORDER STATUS |
|
define("ORDER_STAT", [ |
|
0 => "Preparing", 1 => "Ready", 2 => "Delivered" |
|
]); |
|
|
|
// (K) START! |
|
$_ORD = new Order(); |
|
session_start(); |
|
if (!isset($_SESSION["cart"])) { $_SESSION["cart"] = []; } |