EXEMPLE – D’une application php qui utilise le SGBD Oracle.
NOTE: Exercices à réaliser par l’étudiant en classe. Il faut programmer et adapter et exécuter les scripts suivants. Adapter les scripts en fonction du schéma de votre base de données.
# Utilisation d'une image Docker php+Apache+ClientOracle # Pour PHP8+ORI+Argon2 docker pull paliari/apache-php8-oci8:1.3.0-dev $ docker run -itd --name php-oci -v $(pwd)/web:/var/www/html/public -p 80:80 paliari/apache-php8-oci8:1.3.0-dev #--------------------------------------------------------------------------------------- # Pour PHP7+ORI $ docker run -itd --name php-oci -v /Users/alain/docker.projets/web:/var/www/html -p 80:80 adrianharabula/php7-with-oci8 C\> docker run -itd --name php-oci -v C:\Users\Alain\web:/var/www/html -p 88:80 adrianharabula/php7-with-oci8
NOTE: Oracle propose des Dockerfiles pour bâtir des images en fonction des besoins des développeurs. Ces fichiers sont ici.
<?php // Informations de connexion à la base de données Oracle // Informations de connexion à la base de données Oracle $db_username = 'etudiant'; $db_password = 'password'; $db_service = 'CSTJ4205D3'; $db_host = '192.168.2.51'; // Connexion à la base de données Oracle $conn = oci_connect($db_username, $db_password, $db_host . '/' . $db_service); if (!$conn) { die("Échec de la connexion à la base de données 🤪 : " . oci_error()); } else { print("Connexion au SGBD Oracle réussi 🤓 !"); } ?>
NOTE: Ce script doit-être dans le dossier racine Web du conteneur! Oui, je sais, vous le saviez déjà 🤪.
Tester le script de connexion:
<?php // Inclure le fichier de configuration de la base de données include('config.php'); // Requête SQL pour récupérer les albums de Tintin // Auteur = Hergé = auteur_id = 1 # $sql = "SELECT titre FROM Albums"; $sql = "SELECT titre FROM Albums WHERE auteur_id = (SELECT auteur_id FROM Auteurs WHERE nom LIKE 'Herg%')"; // Exécuter la requête SQL $result = oci_parse($conn, $sql); oci_execute($result); ?> <!DOCTYPE html> <html> <head> <title>Albums de Tintin</title> </head> <body> <hr/> <h1>Albums de Tintin</h1> <ul> <?php // Afficher les albums dans une liste while ($row = oci_fetch_assoc($result)) { echo '<li>' . htmlspecialchars($row['TITRE']) . '</li>'; } ?> </ul> </body> </html> <?php // Fermer la connexion à la base de données oci_close($conn); ?>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Liste de tous les Albums</title> <!-- Liens Bootstrap CSS --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> <style> /* Style personnalisé pour l'espacement */ .character { margin-top: 20px; } /* Style personnalisé pour la liste à puces */ .album-list { padding-left: 20px; } /* Style personnalisé pour les albums impairs */ .album-list li:nth-child(odd) { background-color: #f2f2f2; /* Couleur d'arrière-plan pour les albums impairs */ } /* Style personnalisé pour les images des personnages */ .character-image { max-width: 100px; /* Largeur maximale de l'image */ height: auto; /* Ajuster la hauteur proportionnellement */ } /* Style personnalisé pour le carré gris */ .no-photo { width: 100px; /* Largeur du carré gris */ height: 100px; /* Hauteur du carré gris */ background-color: #ccc; /* Couleur de fond gris */ } </style> </head> <body> <div class="container mt-5"> <h1 class="text-center">Liste de tous les Albums</h1> <?php // Inclure le fichier de configuration de la base de données include('config.php'); // Requête SQL pour récupérer tous les albums de tous les personnages $sql = "SELECT P.nom AS personnage, P.photo AS photo, A.titre AS album FROM Personnages P LEFT JOIN Albums_Personnages PA ON P.personnage_id = PA.personnage_id LEFT JOIN Albums A ON PA.album_id = A.album_id ORDER BY P.nom, A.titre"; $result = oci_parse($conn, $sql); oci_execute($result); // Initialisation des variables pour suivre le personnage actuel $currentPersonnage = null; while ($row = oci_fetch_assoc($result)) { $personnage = htmlspecialchars($row['PERSONNAGE']); $album = htmlspecialchars($row['ALBUM']); $photo = htmlspecialchars($row['PHOTO']); // Source de la photo du personnage // Si le personnage actuel change, affichez le nouveau personnage if ($currentPersonnage !== $personnage) { // Fermez la liste précédente si ce n'est pas le premier personnage if ($currentPersonnage !== null) { // Affichez le message si le personnage n'a pas d'albums if (!$hasAlbum) { echo '<p>Ce personnage n\'est pas dans les albums présents dans la base de données.</p>'; } echo '</ul>'; } // Réinitialisez la variable $hasAlbum $hasAlbum = false; // Affichez le nom du nouveau personnage avec une classe Bootstrap echo '<div class="character">'; echo '<h2>' . $personnage . '</h2>'; // Affichez la photo du personnage ou un carré gris s'il n'y a pas de photo if (!empty($photo)) { echo '<img class="character-image" src="' . $photo . '" alt="' . $personnage . '">'; } else { echo '<div class="no-photo"></div>'; } echo '<ul class="list-unstyled album-list">'; $currentPersonnage = $personnage; } // Affichez l'album dans la liste à puces avec une classe Bootstrap echo '<li>' . $album . '</li>'; } // Fermez la dernière liste à puce if ($currentPersonnage !== null) { echo '</ul>'; } // Fermer la connexion à la base de données oci_close($conn); ?> </div> <!-- Liens Bootstrap JavaScript --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.min.js"></script> </body> </html>
Utiliser symphony pour programmer un formulaire permettant l’ajout d’un personnage dans la BD.
NOTE: Il faudra peut-être installer symphony dans le conteneur ou proposer une autre solution. Pas facile d’être en troisième année … 🥵
// src/Controller/PersonnageController.php use App\Entity\Personnage; use App\Form\PersonnageType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class PersonnageController extends AbstractController { /** * @Route("/ajouter-personnage", name="ajouter_personnage") */ public function ajouterPersonnage(Request $request): Response { $personnage = new Personnage(); $form = $this->createForm(PersonnageType::class, $personnage); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // Sauvegardez le personnage en base de données $entityManager = $this->getDoctrine()->getManager(); $entityManager->persist($personnage); $entityManager->flush(); return $this->redirectToRoute('accueil'); // Redirigez vers la page d'accueil ou une autre page } return $this->render('personnage/ajouter.html.twig', [ 'form' => $form->createView(), ]); } }
{# templates/personnage/ajouter.html.twig #} {% extends 'base.html.twig' %} {% block title %}Ajouter un Personnage{% endblock %} {% block body %} <h1>Ajouter un Personnage</h1> {{ form_start(form) }} {{ form_widget(form) }} <button type="submit" class="btn btn-primary">Ajouter</button> {{ form_end(form) }} {% endblock %}
# config/routes.yaml ajouter_personnage: path: /ajouter-personnage controller: App\Controller\PersonnageController::ajouterPersonnage