Table of Contents
PHP MVC Learn For Beginners
This is a PHP MVC step-by-step tutorial where you will learn to develop a PHP application using the MVC pattern. The tutorial is divided into 7 different parts (steps) in order to achieve a fully functional PHP CRUD application based on the Model-View-Controller arch pattern.
- Table of Contents
- [Why MVC?] (# Github)
- [Introduction to Model View Controller] (# ignore-whitespace)
- [Advantages] (# ignore-whitespace)
- [What you should know about MVC] (# adjust-tab-space)
- [Commit History by Author] (# commit-history-by-author)
- [Before getting started] (# cloning-a-repository)
- [Our MVC sample application] (# cloning-a-repository)
- [Technologies used] (# technologies-used)
- [Functionalities] (# functionalities)
- [Pre-requisites] (# cloning-a-repository)
- [Development environment and setting up the databse] (# cloning-a-repository)
- [Tutorial] (# cloning-a-repository)
- [First step: creating the basic structure] (# cloning-a-repository)
- [Second step: adding multiple views to our application] (# cloning-a-repository)
- [Third step: implementing a generic Front-Controller]
- [Fourth step: adding complexity to our application] (# cloning-a-repository)
- [Fifth step: Powerfull controllers and models using inheritance] (# cloning-a-repository)
- [Sixth step: Advanced views using templates] (# cloning-a-repository)
- [Seventh step: 3 layer architecture] (# cloning-a-repository)
- [Eighth step: Handling AJAX requests] (# cloning-a-repository)
- [Contributing] (# contributing)
employee
- Technologies used
- PHP
- PDO
- MySQL
- jQuery
- Bootstrap v4
Functionalities
- Registration and Login.
- Post ads.
- Profile: user data, published announcements, mark announcement as sold, delete announcements.
- Mark as favorites.
- Modify user data.
- Show favorites in profile.
- Image upload PHP.
- (ALL) Delete favorites from profile.
- (ALL) Responsive navbar.
Follow Few Steps
Step1:- Create a database and name it MVC Now create a table in this database Name it employees Give the SQL of the table I have given here Copy and paste it into your database.
CREATE TABLE Employees (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(30) NOT NULL,
Surname VARCHAR(80) NOT NULL,
email VARCHAR(50),
phone VARCHAR(20)
)
Step2:- Create MVC Folder
Step3:- Create the Config folder in the MVC folder
Step4:- Create two files in the config folder, one database.php and the other global.php
database.php
<?php
define("DB_DRIVER", "mysql");
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_DATABASE", "mvc");
define("DB_CHARSET", "utf8");
/*
return array(
"driver" =>"mysql",
"host" =>"localhost",
"user" =>"root",
"pass" =>"",
"database" =>"mvc1",
"charset" =>"utf8"
);
*/
?>
global.php
<?php
define("CONTROLLER_DEFECTO", "Employees");
define("DEFECT_ACTION", "index");
?>
Step5:- Create a controller folder in the MVC folder again
Step6:- Create a file in the controller folder, give the name employeesController.php
employeesController.php
<?php
class EmployeesController{
private $conectar;
private $Connection;
public function __construct() {
require_once __DIR__ . "/../core/Conectar.php";
require_once __DIR__ . "/../model/employee.php";
$this->conectar=new Conectar();
$this->Connection=$this->conectar->Connection();
}
/**
* Ejecuta la acción correspondiente.
*
*/
public function run($accion){
switch($accion)
{
case "index" :
$this->index();
break;
case "alta" :
$this->crear();
break;
case "detalle" :
$this->detalle();
break;
case "actualizar" :
$this->actualizar();
break;
default:
$this->index();
break;
}
}
/**
* Loads the employees home page with the list of
* employees getting from the model.
*
*/
public function index(){
//We create the employee object
$employee=new Employee($this->Connection);
//We get all the employees
$employees=$employee->getAll();
//We load the index view and pass values to it
$this->view("index",array(
"employees"=>$employees,
"titulo" => "PHP MVC"
));
}
/**
* Loads the employees home page with the list of
* employees getting from the model.
*
*/
public function detalle(){
//We load the model
$modelo = new Employee($this->Connection);
//We recover the employee from the BBDD
$employee = $modelo->getById($_GET["id"]);
//We load the detail view and pass values to it
$this->view("detalle",array(
"employee"=>$employee,
"titulo" => "Detalle Employee"
));
}
/**
* Create a new employee from the POST parameters
* and reload the index.php.
*
*/
public function crear(){
if(isset($_POST["Name"])){
//Creamos un usuario
$employee=new Employee($this->Connection);
$employee->setName($_POST["Name"]);
$employee->setSurname($_POST["Surname"]);
$employee->setEmail($_POST["email"]);
$employee->setphone($_POST["phone"]);
$save=$employee->save();
}
header('Location: index.php');
}
/**
* Update employee from POST parameters
* and reload the index.php.
*
*/
public function actualizar(){
if(isset($_POST["id"])){
//We create a user
$employee=new Employee($this->Connection);
$employee->setId($_POST["id"]);
$employee->setName($_POST["Name"]);
$employee->setSurname($_POST["Surname"]);
$employee->setEmail($_POST["email"]);
$employee->setphone($_POST["phone"]);
$save=$employee->update();
}
header('Location: index.php');
}
/**
* Create the view that we pass to it with the indicated data.
*
*/
public function view($vista,$datos){
$data = $datos;
require_once __DIR__ . "/../view/" . $vista . "View.php";
}
}
?>
Step7:- Create a core folder in the MVC folder again
Step8:- Create a file in the code folder, give the name Conectar.php
Conectar.php
<?php
class Conectar{
private $driver;
private $host, $user, $pass, $database, $charset;
public function __construct() {
$db_cfg = require_once 'config/database.php';
$this->driver=DB_DRIVER;
$this->host=DB_HOST;
$this->user=DB_USER;
$this->pass=DB_PASS;
$this->database=DB_DATABASE;
$this->charset=DB_CHARSET;
}
public function Connection(){
$bbdd = $this->driver .':host='. $this->host . ';dbname=' . $this->database . ';charset=' . $this->charset;
//$bbdd = ' mysql:host=localhost;dbname=mvc1;charset=utf8';
try {
$connection = new PDO($bbdd, $this->user, $this->pass);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $connection;
} catch (PDOException $e) {
//We throw the exception
throw new Exception('Problem establishing the connection.');
}
}
}
?>
Step9:- Create a model folder in the MVC folder again
Step10:- Create a file in the model folder, give the name employee.php
employee.php
<?php
class Employee {
private $table = "employees";
private $Connection;
private $id;
private $Name;
private $Surname;
private $email;
private $phone;
public function __construct($Connection) {
$this->Connection = $Connection;
}
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
public function getName() {
return $this->Name;
}
public function setName($Name) {
$this->Name = $Name;
}
public function getSurname() {
return $this->Surname;
}
public function setSurname($Surname) {
$this->Surname = $Surname;
}
public function getEmail() {
return $this->email;
}
public function setEmail($email) {
$this->email = $email;
}
public function getphone() {
return $this->phone;
}
public function setphone($phone) {
$this->phone = $phone;
}
public function save(){
$consultation = $this->Connection->prepare("INSERT INTO " . $this->table . " (Name,Surname,email,phone)
VALUES (:Name,:Surname,:email,:phone)");
$result = $consultation->execute(array(
"Name" => $this->Name,
"Surname" => $this->Surname,
"email" => $this->email,
"phone" => $this->phone
));
$this->Connection = null;
return $result;
}
public function update(){
$consultation = $this->Connection->prepare("
UPDATE " . $this->table . "
SET
Name = :Name,
Surname = :Surname,
email = :email,
phone = :phone
WHERE id = :id
");
$resultado = $consultation->execute(array(
"id" => $this->id,
"Name" => $this->Name,
"Surname" => $this->Surname,
"email" => $this->email,
"phone" => $this->phone
));
$this->Connection = null;
return $resultado;
}
public function getAll(){
$consultation = $this->Connection->prepare("SELECT id,Name,Surname,email,phone FROM " . $this->table);
$consultation->execute();
/* Fetch all of the remaining rows in the result set */
$resultados = $consultation->fetchAll();
$this->Connection = null; //cierre de conexión
return $resultados;
}
public function getById($id){
$consultation = $this->Connection->prepare("SELECT id,Name,Surname,email,phone
FROM " . $this->table . " WHERE id = :id");
$consultation->execute(array(
"id" => $id
));
/*Fetch all of the remaining rows in the result set*/
$resultado = $consultation->fetchObject();
$this->Connection = null; //connection closure
return $resultado;
}
public function getBy($column,$value){
$consultation = $this->Connection->prepare("SELECT id,Name,Surname,email,phone
FROM " . $this->table . " WHERE :column = :value");
$consultation->execute(array(
"column" => $column,
"value" => $value
));
$resultados = $consultation->fetchAll();
$this->Connection = null; //connection closure
return $resultados;
}
public function deleteById($id){
try {
$consultation = $this->Connection->prepare("DELETE FROM " . $this->table . " WHERE id = :id");
$consultation->execute(array(
"id" => $id
));
$Connection = null;
} catch (Exception $e) {
echo 'Failed DELETE (deleteById): ' . $e->getMessage();
return -1;
}
}
public function deleteBy($column,$value){
try {
$consultation = $this->Connection->prepare("DELETE FROM " . $this->table . " WHERE :column = :value");
$consultation->execute(array(
"column" => $value,
"value" => $value,
));
$Connection = null;
} catch (Exception $e) {
echo 'Failed DELETE (deleteBy): ' . $e->getMessage();
return -1;
}
}
}
?>
Step11:- Create a view folder in the MVC folder again
Step12:- Create two files in the config folder, one detalleView.php and the other indexView.php
detalleView.php
<!DOCTYPE HTML>
<html lang="es">
<head>
<meta charset="utf-8"/>
<title>Example PHP+PDO+POO+MVC</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<style>
input{
margin-top:5px;
margin-bottom:5px;
}
.right{
float:right;
}
</style>
</head>
<body>
<div class="col-lg-5 mr-auto">
<form action="index.php?controller=employees&action=actualizar" method="post">
<h3>User detail</h3>
<hr/>
<input type="hidden" name="id" value="<?php echo $datos["employee"]->id ?>"/>
Name: <input type="text" name="Name" value="<?php echo $datos["employee"]->Name ?>" class="form-control"/>
Surname: <input type="text" name="Surname" value="<?php echo $datos['employee']->Surname ?>" class="form-control"/>
Email: <input type="text" name="email" value="<?php echo $datos['employee']->email ?>" class="form-control"/>
phone: <input type="text" name="phone" value="<?php echo$datos['employee']->phone ?>" class="form-control"/>
<input type="submit" value="Send" class="btn btn-success"/>
</form>
<a href="index.php" class="btn btn-info">Return</a>
</div>
</body>
</html>
indexView.php
<!DOCTYPE HTML>
<html lang="es">
<head>
<meta charset="utf-8"/>
<title>Example PHP+PDO+POO+MVC</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<style>
input{
margin-top:5px;
margin-bottom:5px;
}
.right{
float:right;
}
</style>
</head>
<body>
<form action="index.php?controller=employees&action=alta" method="post" class="col-lg-5">
<h3>Add user</h3>
<hr/>
Name: <input type="text" name="Name" class="form-control"/>
Surname: <input type="text" name="Surname" class="form-control"/>
Email: <input type="text" name="email" class="form-control"/>
phone: <input type="text" name="phone" class="form-control"/>
<input type="submit" value="Send" class="btn btn-success"/>
</form>
<div class="col-lg-7">
<h3>Users</h3>
<hr/>
</div>
<section class="col-lg-7 usuario" style="height:400px;overflow-y:scroll;">
<?php foreach($datos["employees"] as $employee) {?>
<?php echo $employee["id"]; ?> -
<?php echo $employee["Name"]; ?> -
<?php echo $employee["email"]; ?> -
<?php echo $employee["phone"]; ?>
<div class="right">
<a href="index.php?controller=employees&action=detalle&id=<?php echo $employee['id']; ?>" class="btn btn-info">Detalles</a>
</div>
<hr/>
<?php } ?>
</section>
</body>
</html>
Step13:-Now create an index.php file in the mvc Folder
index.php
<?php
//Global setting
require_once 'config/global.php';
//We load the controller and execute the action
if(isset($_GET["controller"])){
// We load the instance of the corresponding controller
$controllerObj=cargarControlador($_GET["controller"]);
//We launch the action
launchAction($controllerObj);
}else{
// We load the default controller instance
$controllerObj=cargarControlador(CONTROLLER_DEFECTO);
// We launch the action
launchAction($controllerObj);
}
function cargarControlador($controller){
switch ($controller) {
case 'employees':
$strFileController='controller/employeesController.php';
require_once $strFileController;
$controllerObj=new employeesController();
break;
default:
$strFileController='controller/employeesController.php';
require_once $strFileController;
$controllerObj=new EmployeesController();
break;
}
return $controllerObj;
}
function launchAction($controllerObj){
if(isset($_GET["action"])){
$controllerObj->run($_GET["action"]);
}else{
$controllerObj->run(DEFECT_ACTION);
}
}
/*
function cargarControlador($controller){
// We create the Name of the controller: e.j. userController
$controlador=ucwords($controller).'Controller';
// We create the Name of the controller file: e.j. controller / userController.php
$strFileController='controller/'.$controlador.'.php';
//If there is no controller with that, we load the one defined by default.
if(!is_file($strFileController)){
$strFileController='controller/'.ucwords(CONTROLLER_DEFECTO).'Controller.php';
}
//We load the file where the controller is defined:
require_once $strFileController;
//We create the object
$controllerObj=new $controlador();
return $controllerObj;
}
*/
?>
Output:-