---
title: Activities php
tags: cours, php, MVC good practice
robots: noindex, nofollow
author: Giuseppe Militello
---
# Activities php 😜
*PHP: Hypertext Preprocessor*

> © [Giuseppe Militello](https://www.linkedin.com/in/giuseppe-militello-22406ab0/) - All rights reserved for educational purposes only
## Exercice dirigé - 1
Cette exercice consiste à vous familiariser avec le langage php et à gérér des données prevenant de la BDD.
**Exemple pour un produit**:
| ID | Marque | Capacité | Consommation | Prix | Image |
|------|--------------|----------|--------------|-------|-------------|
| 1 | Produit A | 100 L | 5 kWh | 200 € | cover-1.jpg |
| 2 | Produit B | 200 L | 7 kWh | 300 € | cover-2.jpg |
| 3 | Produit C | 150 L | 6 kWh | 250 € | cover-3.jpg |
Pour cette première étape on va créer la bdd *"Vente_prod"*
Suivi par la création de la sturcture de la table dans **PHPmyAdmin**

Il faut respecter le type de donnée concerant les noms.
Ci-dessous mySQL générer une table en code:

En suite nous on insère des données dans la table par le menu **"inserer"**, dans PHPmyAdmin:

## Affichage des données coté client
Pour l'affichage des données coté client, nous allons créer dans notre projet deux fichier.
Un fichier d'*index.php* et un fichier *bdd.inc.php*
Ci-dessous la structuration de votre projet:

Le fichier *bdd.inc.php* se trouve dans le répertoire *"pages"*
## Partie php
Dans le fichier d'index nous avons le code suivant:
```php=
<?php
include_once("./pages/class.inc.php");
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= title ?></title>
<link rel="apple-touch-icon" sizes="180x180" href="favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="<?= Page::$_logo ?>">
<link rel="manifest" href="favicon/site.webmanifest">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0" />
<link rel="stylesheet" href="./font/stylesheet.css">
<link rel="stylesheet" href="<?= $_new_page->_css ?>">
<link rel="stylesheet" href="./css/reset.css">
</head>
<body>
<header>
<h1><?= title ?></h1>
</header>
<main>
<section>
<h2>
<?= $_new_page->_subtitle ?>
<span class="material-symbols-outlined" aria-hidden="true">
shopping_cart
</span>
</h2>
<ul class="product">
<?php
include_once "./pages/bdd.inc.php";
//ajouter un try catch pour tester la connection bdd
?>
</ul>
</section>
</main>
<footer>
<p>© - PHP - <?= $_date ?> </p>
</footer>
</body>
</html>
```
Attention le code ```<?= $_new_page->_subtitle ?> ``` fait appel à une class qu'on verra à la fin.
## Partie du fichier "./pages/bdd.inc.php"
```php=
<?php
// connexion à la base par l'objet PDO
try{
$_pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$_bdd = new PDO('mysql:host=localhost;
dbname=vente_prod','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', $_pdo_options));
$_response = $_bdd->query('SELECT * FROM `produits` WHERE 1 ORDER BY id ASC LIMIT 1 ');
while($_data = $_response->fetch()){
/*
on fait un test sur la bdd avant de l'afficher
print "<pre>";
print_r($_data);
print "</pre>";
*/
echo "<li>Marque : ".$_data["marque"]."</li>
<li> Capacité : ".$_data["capacite"]." kg<li>
<li> Cosommation : ".$_data["consommation"]." KW<li>
<li> Prix : ".$_data["prix"]." €<li>
<li><img src = ".$_data["image"]." loading=\"lazy\" alt=".$_data["marque"]."><li>";
}
$_response->closeCursor(); //ici se termine l'appelle par la méthode fetch()
}
catch(Exception $e){
die("Error Data base de votre base ".$e->getMessage());
//en cas d'érreur on affiche un message
}
```
## Résultat final pour la page:

## Méthode de connexion BDD simplifié
>Pour cela nous allons créer un model
```php=
# db.php
$host = 'localhost';
$dbname = 'languages';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
} catch (PDOException $e) {
```
## Nous allons appeler le model dans le controller
```php=
require_once 'db.php';
class Model{
static function getUsers()
{
global $pdo;
$stmt = $pdo->query("SELECT * FROM top_10_langages_2024");
return $stmt->fetchAll();
}
}
$users = Model::getUsers() # ajouter $users dans la foreach
```
## dans la view nous allons structurer la page pour l'affichage des données
```php=
<table>
<thead>
<tr>
<th>ID</th>
<th>Langage</th>
<th>Type</th>
<th>Utilisation</th>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user) : ?>
<tr>
<td><?= htmlspecialchars($user['id_rang']) ?></td>
<td><?= htmlspecialchars($user['langage']) ?></td>
<td><?= htmlspecialchars($user['description']) ?></td>
<td><?= htmlspecialchars($user['utilisation_principale']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
```
## Dans l'index on appelle nos deux fichiers
```php=
const style = "./css/main.css";
require_once __DIR__ .'/model/controllerBase.php';
// $users = getUsers();
require __DIR__ .'/view/view.php';
```
## Travaillez avec le principe de responsabilité unique
>En programmation orientée objet, Robert C. Martin exprime le principe de responsabilité unique comme suit : « une classe ne doit changer que pour une seule raison » [Wikipedia](https://fr.wikipedia.org/wiki/Robert_C._Martin)
>Ce principe est adapté à la POO et à la méthode conception MVC(Model, Vue, Controller) : séparation des taches.
>Pour les framework en général cela est bien implémenté. Dans Dans notre projet nous devons le structurer. Ce patron de conception nous permet de mieux gérer les différent fichiers.
## Cration du modèle automatiquement par PHP
>Il est possible dans une structure mvc à partir d'un modèle de données php, trasmettre par simple évenement la création d'une BDD et d'une table. Exeple ci-dessous:
```php
# Paramètres de connexion à la base de données
$dsn = "mysql:host=localhost;charset=utf8mb4";
$username = "votre_nom_utilisateur";
$password = "votre_mot_de_passe";
try {
# Connexion à la base de données
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
# Nom de la base de données
$dbname = "nom_de_votre_base_de_donnees";
# Requête SQL pour créer la base de données si elle n'existe pas déjà
$sql_create_db = "CREATE DATABASE IF NOT EXISTS $dbname";
$pdo->exec($sql_create_db);
print "Base de données créée avec succès\n";
# Utilisation de la base de données créée
$pdo->query("USE $dbname");
# Requête SQL pour créer la table client
$sql_create_table = "CREATE TABLE IF NOT EXISTS client (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(50) NOT NULL,
prenom VARCHAR(50) NOT NULL,
age INT
)";
$pdo->exec($sql_create_table);
print "Table client créée avec succès\n";
} catch (PDOException $e) {
print "Erreur : " . $e->getMessage();
}
```
>Dans l'initialisation du modèle on peut noter cici: ```charset=utf8mb4```
>Le charset=utf8mb4 est une spécification utilisée dans les bases de données MySQL/MariaDB pour définir l'encodage des la plus part des caractères.
## 🌐 Naviguez avec la super globale $_GET : Comment Dynamiser nos pages web et créer un système de views
>🚀 Imaginez que vous puissiez naviguer d'une page à l'autre sur votre site web en utilisant des paramètres simples dans l'URL. C'est exactement ce que la super globale $_GET en PHP permet de faire ! Grâce à elle, vous pouvez récupérer des informations directement à partir de l'URL et les utiliser pour afficher du contenu différent, sans avoir besoin de recharger entièrement la page. Dans notre exemple, nous allons voir comment passer d'une page à l'autre à partir de la page d'index, en envoyant des paramètres comme ?page=about ou ?page=contact. Cela simplifie la gestion des multiples pages sur un site dynamique.
**Exemple: les liens**
```html=
<ul>
<li><a href="index.php?page=1">études</a></li>
<li><a href="index.php?page=2">formations</a></li>
<li><a href="index.php?page=3">contact</a></li>
</ul>
```
>Ceci représente les liens des nos view à appeler dans la barre d'adresse
**Le controller PHP**
```php=
if(isset($_GET['page'])){
$route = $_GET['page'];
# tester la page
print "la page : $route";
# organiser les routes
if($route==1){
include_once "./page/index.html";
}
if($route==2){
include_once "./page/formation.html";
}
if($route==3){
include_once "./page/contact.html";
}
else if($route>=3 || $route<=0){
echo '<p class="warning">
La page demandée n\'existe pas!!</p>';
# header("HTTP/1.0 404 Not Found");
}
}
# inclusion de la page d'index par défaut
else
{
include_once "./page/index.html";
}
```
>Dans un principe de responsabilité unique nous mettons ce modèle de répertoire en place:

