Create PHP MVC application. Sessions. Get all orders
We continue to make our simple php mvc application and today we will add sessions mechanism to our application to avoid access to cabinet main page to unauthorized users. Also we will create method, which will get all orders from database with its detail information.
While preparing for this lesson I have found some problem. Instead of cyrillic data I have got question marks. So you need to set right collation in phpmyadmin (see picture example)
Also in db.php (database configuration file) I made some difference to the code (see code below).
Code lesson (db.php)
<?php
/**
** Класс конфигурации базы данных
*/
class DB{
const USER = "u0016495_cabinet";
const PASS = 123456;
const HOST = "localhost";
const DB = "u0016495_cabinet";
public static function connToDB() {
$user = self::USER;
$pass = self::PASS;
$host = self::HOST;
$db = self::DB;
$conn = new PDO("mysql:dbname=$db;host=$host;charset=UTF8", $user, $pass);
return $conn;
}
}
Code lesson (config.php)
<?php
session_start();
$_SERVER['DOCUMENT_ROOT'] = "/var/www/u0016495/data/www/cabinet.kamil-abzalov.ru";
define("ROOT", $_SERVER['DOCUMENT_ROOT']);
define("CONTROLLER_PATH", ROOT. "/controllers/");
define("MODEL_PATH", ROOT. "/models/");
define("VIEW_PATH", ROOT. "/views/");
require_once("db.php");
require_once("route.php");
require_once MODEL_PATH. 'Model.php';
require_once VIEW_PATH. 'View.php';
require_once CONTROLLER_PATH. 'Controller.php';
Routing::buildRoute();
Code lesson (CabinetController.php)
<?php
class CabinetController extends Controller {
private $pageTpl = "/views/cabinet.tpl.php";
public function __construct() {
$this->model = new CabinetModel();
$this->view = new View();
}
public function index() {
if(!$_SESSION['user']) {
header("Location: /");
}
$this->pageData['title'] = "Кабинет";
$ordersCount = $this->model->getOrdersCount();
$this->pageData['ordersCount'] = $ordersCount;
$productsCount = $this->model->getProductsCount();
$this->pageData['productsCount'] = $productsCount;
$usersCount = $this->model->getUsersCount();
$this->pageData['usersCount'] = $usersCount;
$orders = $this->model->getOrders();
$this->pageData['orders'] = $orders;
$this->view->render($this->pageTpl, $this->pageData);
}
public function logout() {
session_destroy();
header("Location: /");
}
}
Code lesson (CabinetModel.php)
<?php
class CabinetModel extends Model {
public function getOrdersCount() {
$sql = "SELECT COUNT(*) FROM orders";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$res = $stmt->fetchColumn();
return $res;
}
public function getProductsCount() {
$sql = "SELECT COUNT(*) FROM products";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$res = $stmt->fetchColumn();
return $res;
}
public function getUsersCount() {
$sql = "SELECT COUNT(*) FROM users";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$res = $stmt->fetchColumn();
return $res;
}
public function getOrders() {
$sql = "SELECT
orders.id as id,
orders.amount as total,
users.fullName,
users.email
FROM orders
LEFT JOIN users ON users.id = orders.user_id
";
$result = array();
$stmt = $this->db->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result[$row['id']] = $row;
}
return $result;
}
}
Code lesson (cabinet.tpl.php)
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo $pageData['title']; ?></title>
<!-- Bootstrap Core CSS -->
<link href="/css/bootstrap.min.css" rel="stylesheet">
<!-- MetisMenu CSS -->
<link href="/css/admin/metisMenu.min.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="/css/admin/sb-admin-2.css" rel="stylesheet">
<!-- Morris Charts CSS -->
<link href="/css/admin/morris.css" rel="stylesheet">
<!-- Custom Fonts -->
<link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div id="wrapper">
<!-- Navigation -->
<nav class="navbar navbar-default navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">Кабинет</a>
</div>
<!-- /.navbar-header -->
<ul class="nav navbar-top-links navbar-right">
<!-- /.dropdown -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#"><i class="fa fa-user fa-fw"></i> Профиль</a>
</li>
<li class="divider"></li>
<li><a href="/cabinet/logout"><i class="fa fa-sign-out fa-fw"></i> Выйти</a>
</li>
</ul>
<!-- /.dropdown-user -->
</li>
<!-- /.dropdown -->
</ul>
<!-- /.navbar-top-links -->
<div class="navbar-default sidebar" role="navigation">
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
<li>
<a href="/cabinet"><i class="fa fa-area-chart"></i> Статистика</a>
</li>
<li>
<a href="forms.html"><i class="fa fa-cart-plus"></i> Товары</a>
</li>
<li>
<a href="/cabinet/users"><i class="fa fa-user-o"></i> Пользователи</a>
</li>
</ul>
</div>
<!-- /.sidebar-collapse -->
</div>
<!-- /.navbar-static-side -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">Статистика</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-4 col-md-4">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-money fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">
<?php echo $pageData['ordersCount']; ?>
</div>
<div>заказов</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-4">
<div class="panel panel-green">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-cart-plus fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">
<?php echo $pageData['productsCount']; ?>
</div>
<div>товаров</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-4">
<div class="panel panel-yellow">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-user-o fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">
<?php echo $pageData['usersCount']; ?>
</div>
<div>пользователей</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<!-- /.panel -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-bar-chart-o fa-fw"></i> Заказы
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<div class="row">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>ID заказа</th>
<th>Сумма заказа</th>
<th>ФИО</th>
<th>E-mail</th>
</tr>
</thead>
<tbody>
<?php foreach ($pageData['orders'] as $key => $value) {
echo "<tr>";
echo "<td>" . $value['id'] . "</td>";
echo "<td>" . $value['total'] . "</td>";
echo "<td>" . $value['fullName'] . "</td>";
echo "<td>" . $value['email'] . "</td>";
echo "<tr>";
}
?>
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.col-lg-4 (nested) -->
<!-- /.col-lg-8 (nested) -->
</div>
<!-- /.row -->
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
<!-- /.panel -->
</div>
<!-- /.col-lg-8 -->
</div>
<!-- /.row -->
</div>
<!-- /#page-wrapper -->
</div>
<!-- /#wrapper -->
<!-- jQuery -->
<script src="/js/jquery.js"></script>
<!-- Bootstrap Core JavaScript -->
<script src="/js/bootstrap.min.js"></script>
<!-- Metis Menu Plugin JavaScript -->
<script src="/js/admin/metisMenu.js"></script>
<!-- Custom Theme JavaScript -->
<script src="/js/admin/sb-admin-2.js"></script>
</body>
</html>
0 Comments