Create PHP MVC application. Sessions. Get all orders

Home » Tutorials » PHP+MySQL » 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

Submit a Comment

Your email address will not be published. Required fields are marked *


The reCAPTCHA verification period has expired. Please reload the page.

Pin It on Pinterest

Share This