Tutoriel MVC PHP (PDO / MySQL)
tutoriel-mvc-php-pdo-mysql
-
Objectif du TP
- À la fin de ce TP, l’apprenant sera capable de :
- Mettre en place une CRUD complète (Create, Read, Update, Delete).
- Utiliser PDO pour interagir avec MySQL.
- Structurer une application PHP en MVC sans framework.
- Créer un modèle User relié à une table MySQL.
- Utiliser un contrôleur pour gérer les actions CRUD.
- Afficher les données dans des vues propres.
- Comprendre le cheminement complet d’une requête MVC.
-
Création de la base de données
- Nous allons créer une table
userssimple pour notre CRUD. -
Architecture complète du projet MVC (CRUD Users)
- 👉 Tous ces fichiers doivent être créés manuellement.
-
Connexion à la base de données (PDO)
- La classe
Modelcentralise la connexion PDO. -
Création du modèle User
- Le modèle gère toutes les opérations SQL.
-
Contrôleur UserController
- Le contrôleur fait le lien entre le modèle et la vue.
-
Vue : Liste des utilisateurs
-
Vue : Création d’un utilisateur
-
Vue : Modification d’un utilisateur
-
À retenir
- ✅ Le Modèle contient le SQL
- ✅ Le Contrôleur gère la logique
- ✅ La Vue affiche les données
- ❌ Pas de SQL dans les vues
- ❌ Pas de HTML dans les modèles
- ✅ MVC = structure claire et professionnelle
CREATE DATABASE mvc_app;
USE mvc_app;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL
);
-
mvc-users/
│
├── app/
│ ├── controllers/
│ │ └── UserController.php
│ │
│ ├── models/
│ │ └── User.php
│ │
│ └── views/
│ └── users/
│ ├── index.php
│ ├── create.php
│ └── edit.php
│
├── core/
│ ├── Model.php
│ ├── Controller.php
│ └── Router.php
│
├── config/
│ └── database.php
│
├── routes/
│ └── web.php
│
├── public/
│ └── index.php
│
├── .htaccess
└── README.md
<?php
class Model
{
protected $db;
public function __construct()
{
$this->db = new PDO(
"mysql:host=localhost;dbname=mvc_app",
"root",
""
);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
<?php
require_once 'core/Model.php';
class User extends Model
{
public function getAll()
{
return $this->db->query("SELECT * FROM users")
->fetchAll(PDO::FETCH_ASSOC);
}
public function getById($id)
{
$stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
public function create($name, $email)
{
$stmt = $this->db->prepare(
"INSERT INTO users (name, email) VALUES (?, ?)"
);
return $stmt->execute([$name, $email]);
}
public function update($id, $name, $email)
{
$stmt = $this->db->prepare(
"UPDATE users SET name = ?, email = ? WHERE id = ?"
);
return $stmt->execute([$name, $email, $id]);
}
public function delete($id)
{
$stmt = $this->db->prepare("DELETE FROM users WHERE id = ?");
return $stmt->execute([$id]);
}
}
>?php
require_once 'app/models/User.php';
class UserController
{
public function index()
{
$user = new User();
$users = $user->getAll();
require 'app/views/users/index.php';
}
public function create()
{
require 'app/views/users/create.php';
}
public function store()
{
$user = new User();
$user->create($_POST['name'], $_POST['email']);
header("Location: /users");
}
public function edit($id)
{
$user = new User();
$data = $user->getById($id);
require 'app/views/users/edit.php';
}
public function update($id)
{
$user = new User();
$user->update($id, $_POST['name'], $_POST['email']);
header("Location: /users");
}
public function delete($id)
{
$user = new User();
$user->delete($id);
header("Location: /users");
}
}
<a href="/users/create">Ajouter un utilisateur</a>
<table border="1">
<tr>
<th>Nom</th<
<th>Email</th>
<th>Actions</th>
</tr>
<?php foreach ($users as $user): ?>
<tr>
<td><?= htmlspecialchars($user['name']) ?></td>
<td><?= htmlspecialchars($user['email']) ?></td>
<td>
<a href="/users/edit/<?= $user['id'] ?>">Modifier</a>
<a href="/users/delete/<?= $user['id'] ?>">Supprimer</a>
</td>
</tr>
<?php endforeach; ?>
</table>
<form method="post" action="/users/store">
<input type="text" name="name" placeholder="Nom" required>
<input type="email" name="email" placeholder="Email" required>
<button type="submit"<Enregistrer</button>
</form>
<form method="post" action="/users/update/<?= $data['id'] ?>">
<input type="text" name="name" value="<?= $data['name'] ?>" required>
<input type="email" name="email" value="<?= $data['email'] ?>" required>
<button type="submit">Modifier</button>
</form>
