Создание php MVC приложения. Сессии. Получение всех заказов

Главная » Видеоуроки » PHP+MySQL » Создание php MVC приложения. Сессии. Получение всех заказов
Мы продолжаем разработку простого php mvc приложения и сегодня мы добавим в наше приложение механизм сессии, чтобы предотвратить доступ в кабинет неавторизованным пользователям, а также напишем метод, который будет выдавать список всех заказов с их детальной информацией на главной странице кабинета.
Во время подготовки к этому уроке я столкнулся с проблемой вывода информации из БД (phpmyadmin). Вместо кириллицы выводились знаки вопроса. Поэтому в phpmyadmin нужно установить для базы данных корректное сравнение (см.рисунок)
Также в файле db.php (конфигурация базы данных) я внес небольшое изменение в код (смотрите код файла ниже).

Код урока (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;

	}
}

Код урока (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();

Код урока (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: /");
	}


}

Код урока (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;		
	}


}

Код урока (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 Комментариев

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.

Pin It on Pinterest

Share This