--- title: Activities php tags: cours, php, MVC good practice robots: noindex, nofollow author: Giuseppe Militello --- # Activities php &#128540; *PHP: Hypertext Preprocessor* ![](https://i.imgur.com/tT7ekh8.png) > &copy; [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** ![](https://hackmd.io/_uploads/rkK4Kxhl6.png) Il faut respecter le type de donnée concerant les noms. Ci-dessous mySQL générer une table en code: ![](https://hackmd.io/_uploads/S1nqtxhgp.png) En suite nous on insère des données dans la table par le menu **"inserer"**, dans PHPmyAdmin: ![](https://hackmd.io/_uploads/rJdVqghlp.png) ## 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: ![](https://hackmd.io/_uploads/rJCYig2l6.png) 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>&copy; - 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"]." &euro;<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: ![](https://hackmd.io/_uploads/BJz6fb3ga.png) ## 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: ![Capture](https://hackmd.io/_uploads/HyMFStve1x.png) ![AUR license](https://img.shields.io/aur/license/c)