Correction détaillée de l’Exercice 1 : Création et test de la connexion PHP-Oracle

Objectif :

Établir une connexion entre un script PHP et la base Oracle et afficher un message de succès ou d’échec.

Code corrigé :

Créez un fichier nommé connect.php avec le contenu suivant :

<?php
// Informations de connexion
$username = 'VOTRE_UTILISATEUR'; // Remplacez par votre utilisateur Oracle
$password = 'VOTRE_MOT_DE_PASSE'; // Remplacez par votre mot de passe Oracle
$dbname = 'localhost/XEPDB1'; // Remplacez par votre nom ou adresse de base

// Tentative de connexion
$connection = oci_connect($username, $password, $dbname);

// Vérification de la connexion
if (!$connection) {
    // En cas d'erreur, récupérez les détails
    $error = oci_error();
    echo "<p>Erreur de connexion : " . htmlspecialchars($error['message']) . "</p>";
    exit; // Arrêtez l'exécution en cas d'échec
}

// Si tout va bien, affichez un message de succès
echo "<p>Connexion réussie à la base Oracle !</p>";

// Déconnexion propre (pas obligatoire ici, mais conseillé)
oci_close($connection);
?>

Étapes détaillées du script :

  1. Déclaration des informations de connexion :

    • Le script définit les variables $username, $password, et $dbname nécessaires à oci_connect.
    • Ces informations doivent être adaptées à l’environnement Oracle utilisé.
  2. Tentative de connexion :

    • La fonction oci_connect est utilisée pour établir une connexion à la base Oracle.
    • Elle retourne une ressource si la connexion est réussie ou false en cas d’échec.
  3. Gestion des erreurs :

    • En cas de connexion échouée, oci_error retourne un tableau associatif contenant les détails de l’erreur.
    • Le message d’erreur est affiché avec htmlspecialchars pour éviter tout risque de faille XSS.
  4. Message de succès :

    • Si la connexion réussit, un message de confirmation est affiché à l’utilisateur.
  5. Déconnexion propre :

    • La fonction oci_close est appelée pour fermer la connexion. Cela libère les ressources utilisées par PHP pour interagir avec la base.

Test attendu :

  • Si la connexion est réussie :

    Connexion réussie à la base Oracle !
    
  • Si la connexion échoue (par exemple, en cas d’identifiants incorrects) :

    Erreur de connexion : ORA-XXXXX: description de l’erreur
    

Points importants à vérifier :

  • Le script doit être placé sur un serveur web avec PHP et la bibliothèque OCI8 installée.
  • Le fichier tnsnames.ora sur le serveur doit être correctement configuré pour reconnaître la base Oracle.
  • En cas de problème persistant, vérifiez que le serveur web a accès à la base de données.

Correction détaillée de l’Exercice 2 : Affichage des clients

Objectif :

Récupérer tous les clients depuis la table CLIENT et afficher leurs informations dans un tableau HTML.

Code corrigé :

Créez un fichier nommé clients.php avec le contenu suivant :

<?php
// Informations de connexion
$username = 'VOTRE_UTILISATEUR'; // Remplacez par votre utilisateur Oracle
$password = 'VOTRE_MOT_DE_PASSE'; // Remplacez par votre mot de passe Oracle
$dbname = 'localhost/XEPDB1'; // Remplacez par votre nom ou adresse de base

// Connexion à la base Oracle
$connection = oci_connect($username, $password, $dbname);

// Vérification de la connexion
if (!$connection) {
    $error = oci_error();
    echo "<p>Erreur de connexion : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Préparation de la requête SQL
$query = "SELECT IDC, NOM, AGE, AVOIR FROM CLIENT";
$cursor = oci_parse($connection, $query);

// Exécution de la requête
if (!oci_execute($cursor)) {
    $error = oci_error($cursor);
    echo "<p>Erreur lors de l'exécution de la requête : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Affichage des résultats dans un tableau HTML
echo "<table border='1'>";
echo "<tr><th>ID</th><th>Nom</th><th>Âge</th><th>Avoir</th></tr>";
while ($row = oci_fetch_assoc($cursor)) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($row['IDC']) . "</td>";
    echo "<td>" . htmlspecialchars($row['NOM']) . "</td>";
    echo "<td>" . htmlspecialchars($row['AGE']) . "</td>";
    echo "<td>" . htmlspecialchars($row['AVOIR']) . "</td>";
    echo "</tr>";
}
echo "</table>";

// Libération des ressources
oci_free_statement($cursor);
oci_close($connection);
?>

Étapes détaillées du script :

  1. Connexion à la base :

    • Le script établit une connexion à la base Oracle en utilisant oci_connect.
    • En cas d’échec, il affiche un message d’erreur et termine l’exécution.
  2. Préparation de la requête :

    • La requête SQL SELECT IDC, NOM, AGE, AVOIR FROM CLIENT permet de récupérer les colonnes nécessaires.
    • oci_parse prépare cette requête pour exécution.
  3. Exécution de la requête :

    • oci_execute exécute la requête préparée. Si elle échoue, un message d’erreur est affiché avec les détails.
  4. Récupération et affichage des résultats :

    • Une boucle while est utilisée pour parcourir les résultats ligne par ligne avec oci_fetch_assoc.
    • Les données sont échappées avec htmlspecialchars pour éviter les failles XSS et affichées dans un tableau HTML.
  5. Libération des ressources :

    • oci_free_statement libère la mémoire allouée pour la requête.
    • oci_close ferme la connexion avec la base.

Résultat attendu :

Si la table CLIENT contient les données suivantes :

IDCNOMAGEAVOIR
1Alice302000
2Bob251500
3Charlie401000

Le script affichera le tableau suivant dans le navigateur :

<table border="1">
    <tr><th>ID</th><th>Nom</th><th>Âge</th><th>Avoir</th></tr>
    <tr><td>1</td><td>Alice</td><td>30</td><td>2000</td></tr>
    <tr><td>2</td><td>Bob</td><td>25</td><td>1500</td></tr>
    <tr><td>3</td><td>Charlie</td><td>40</td><td>1000</td></tr>
</table>

Points importants à vérifier :

  • Le script doit afficher un tableau HTML bien formaté même si la table CLIENT est vide (seules les en-têtes apparaîtront).
  • Les données doivent être correctement échappées pour éviter les problèmes de sécurité (failles XSS).
  • Les erreurs de connexion ou d’exécution doivent être gérées proprement avec des messages explicites.

Correction détaillée de l’Exercice 3 : Inscription d’un nouveau client

Objectif :

Créer un formulaire HTML pour ajouter un client dans la table CLIENT, et utiliser la fonction PL/SQL TRAITEMENT1 pour gérer l’insertion.

Code corrigé :

Créez deux fichiers :

  1. Fichier formulaire_client.php :
    • Contient le formulaire HTML pour saisir les informations du nouveau client.
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Ajout d'un client</title>
</head>
<body>
    <h1>Ajouter un nouveau client</h1>
    <form method="post" action="ajouter_client.php">
        <label for="nom">Nom :</label>
        <input type="text" id="nom" name="nom" required>
        <br>
        <label for="age">Âge :</label>
        <input type="number" id="age" name="age" min="0" max="120" required>
        <br>
        <button type="submit">Ajouter</button>
    </form>
</body>
</html>
  1. Fichier ajouter_client.php :
    • Récupère les données du formulaire et appelle la fonction TRAITEMENT1 pour insérer un nouveau client.
<?php
// Informations de connexion
$username = 'VOTRE_UTILISATEUR'; // Remplacez par votre utilisateur Oracle
$password = 'VOTRE_MOT_DE_PASSE'; // Remplacez par votre mot de passe Oracle
$dbname = 'localhost/XEPDB1'; // Remplacez par votre nom ou adresse de base

// Connexion à la base Oracle
$connection = oci_connect($username, $password, $dbname);
if (!$connection) {
    $error = oci_error();
    echo "<p>Erreur de connexion : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Récupération des données du formulaire
$nom = $_POST['nom'] ?? '';
$age = $_POST['age'] ?? 0;

// Vérification des données
if (empty($nom) || $age <= 0 || $age > 120) {
    echo "<p>Données invalides. Veuillez vérifier les champs.</p>";
    exit;
}

// Préparation de l'appel à la fonction TRAITEMENT1
$query = "BEGIN :idc := TRAITEMENT1(:nom, :age); END;";
$cursor = oci_parse($connection, $query);

// Lier les paramètres
oci_bind_by_name($cursor, ":idc", $idc, 32); // Retourne l'ID du client ajouté
oci_bind_by_name($cursor, ":nom", $nom);
oci_bind_by_name($cursor, ":age", $age);

// Exécution de la requête
if (!oci_execute($cursor)) {
    $error = oci_error($cursor);
    echo "<p>Erreur lors de l'insertion : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Affichage d’un message de confirmation
echo "<p>Client ajouté avec succès ! ID du client : " . htmlspecialchars($idc) . "</p>";

// Libération des ressources
oci_free_statement($cursor);
oci_close($connection);
?>

Étapes détaillées du script :

  1. Fichier formulaire_client.php :

    • Crée un formulaire HTML avec deux champs obligatoires : nom (texte) et âge (nombre).
    • Le formulaire envoie les données via la méthode POST au fichier ajouter_client.php.
  2. Fichier ajouter_client.php :

    • Récupère les données du formulaire avec $_POST.
    • Vérifie la validité des données saisies (par exemple, un âge entre 0 et 120, un nom non vide).
    • Prépare une requête PL/SQL pour appeler la fonction TRAITEMENT1 :
      • :idc récupère l’ID du client inséré.
      • Les variables liées :nom et :age transmettent les données.
    • Exécute la requête avec oci_execute.
    • Affiche un message de confirmation contenant l’ID du client ajouté.
  3. Gestion des erreurs :

    • Gère les erreurs de connexion, d’exécution, et de validation des données en affichant des messages explicites.

Résultat attendu :

  1. Formulaire affiché dans formulaire_client.php :
<h1>Ajouter un nouveau client</h1>
<form method="post" action="ajouter_client.php">
    <label for="nom">Nom :</label>
    <input type="text" id="nom" name="nom" required>
    <br>
    <label for="age">Âge :</label>
    <input type="number" id="age" name="age" min="0" max="120" required>
    <br>
    <button type="submit">Ajouter</button>
</form>
  1. Message affiché après soumission valide dans ajouter_client.php :

Si les données sont valides :

<p>Client ajouté avec succès ! ID du client : 5</p>

Si les données sont invalides :

<p>Données invalides. Veuillez vérifier les champs.</p>

Si une erreur d’exécution survient :

<p>Erreur lors de l'insertion : ORA-XXXXX: Description de l'erreur</p>

Points importants à vérifier :

  • Les données invalides (nom vide, âge hors limites) ne doivent pas être insérées dans la base.
  • L’ID retourné par la fonction TRAITEMENT1 doit correspondre à l’ID inséré dans la table CLIENT.
  • Le message de confirmation doit être clair et compréhensible.

Correction détaillée de l’Exercice 4 : Réservation d’un séjour

Objectif :

Créer un formulaire HTML permettant à un client de réserver un séjour, et utiliser la procédure PL/SQL TRAITEMENT2 pour gérer l’insertion.

Code corrigé :

Créez deux fichiers :

  1. Fichier formulaire_reservation.php :
    • Contient le formulaire HTML pour saisir les informations nécessaires à une réservation.
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Réservation d'un séjour</title>
</head>
<body>
    <h1>Réserver un séjour</h1>
    <form method="post" action="reserver_sejour.php">
        <label for="idc">ID Client :</label>
        <select id="idc" name="idc" required>
            <?php
            // Connexion à la base Oracle pour récupérer les IDs des clients
            $username = 'VOTRE_UTILISATEUR';
            $password = 'VOTRE_MOT_DE_PASSE';
            $dbname = 'localhost/XEPDB1';
            $connection = oci_connect($username, $password, $dbname);

            if (!$connection) {
                echo "<option>Erreur de connexion</option>";
            } else {
                $query = "SELECT IDC, NOM FROM CLIENT";
                $cursor = oci_parse($connection, $query);
                oci_execute($cursor);
                while ($row = oci_fetch_assoc($cursor)) {
                    echo "<option value='" . htmlspecialchars($row['IDC']) . "'>" 
                         . htmlspecialchars($row['IDC'] . " - " . $row['NOM']) 
                         . "</option>";
                }
                oci_free_statement($cursor);
                oci_close($connection);
            }
            ?>
        </select>
        <br>
        <label for="ville">Ville :</label>
        <select id="ville" name="ville" required>
            <option value="NY">NY</option>
            <option value="Chatelaillon">Chatelaillon</option>
            <option value="Cergy">Cergy</option>
        </select>
        <br>
        <label for="jour">Jour :</label>
        <input type="number" id="jour" name="jour" min="1" max="365" required>
        <br>
        <button type="submit">Réserver</button>
    </form>
</body>
</html>
  1. Fichier reserver_sejour.php :
    • Traite les données du formulaire et appelle la procédure PL/SQL TRAITEMENT2.
<?php
// Informations de connexion
$username = 'VOTRE_UTILISATEUR'; // Remplacez par votre utilisateur Oracle
$password = 'VOTRE_MOT_DE_PASSE'; // Remplacez par votre mot de passe Oracle
$dbname = 'localhost/XEPDB1'; // Remplacez par votre nom ou adresse de base

// Connexion à la base Oracle
$connection = oci_connect($username, $password, $dbname);
if (!$connection) {
    $error = oci_error();
    echo "<p>Erreur de connexion : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Récupération des données du formulaire
$idc = $_POST['idc'] ?? 0;
$ville = $_POST['ville'] ?? '';
$jour = $_POST['jour'] ?? 0;

// Vérification des données
if ($idc <= 0 || empty($ville) || $jour <= 0 || $jour > 365) {
    echo "<p>Données invalides. Veuillez vérifier les champs.</p>";
    exit;
}

// Préparation de l'appel à la procédure TRAITEMENT2
$query = "BEGIN TRAITEMENT2(:idc, :ville, :jour, :idv, :ids, :activite); END;";
$cursor = oci_parse($connection, $query);

// Lier les paramètres
oci_bind_by_name($cursor, ":idc", $idc);
oci_bind_by_name($cursor, ":ville", $ville);
oci_bind_by_name($cursor, ":jour", $jour);
oci_bind_by_name($cursor, ":idv", $idv, 32);
oci_bind_by_name($cursor, ":ids", $ids, 32);
oci_bind_by_name($cursor, ":activite", $activite, 50);

// Exécution de la procédure
if (!oci_execute($cursor)) {
    $error = oci_error($cursor);
    echo "<p>Erreur lors de la réservation : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Affichage du résultat
if ($idv == -1) {
    echo "<p>Aucun séjour disponible pour cette ville.</p>";
} else {
    echo "<p>Réservation réussie ! Détails :</p>";
    echo "<ul>";
    echo "<li>ID du séjour : " . htmlspecialchars($ids) . "</li>";
    echo "<li>ID du village : " . htmlspecialchars($idv) . "</li>";
    echo "<li>Activité : " . htmlspecialchars($activite) . "</li>";
    echo "</ul>";
}

// Libération des ressources
oci_free_statement($cursor);
oci_close($connection);
?>

Étapes détaillées :

  1. Fichier formulaire_reservation.php :

    • Le formulaire affiche dynamiquement la liste des IDs des clients existants (récupérés depuis la table CLIENT).
    • Les villes proposées dans le formulaire sont prédéfinies (par exemple, NY, Chatelaillon, Cergy).
    • Le champ jour permet de saisir un jour valide entre 1 et 365.
  2. Fichier reserver_sejour.php :

    • Récupère les données saisies par l’utilisateur avec $_POST.
    • Vérifie leur validité (par exemple, jour entre 1 et 365, idc valide, etc.).
    • Prépare un appel à la procédure PL/SQL TRAITEMENT2 :
      • Les paramètres liés permettent de transmettre et de récupérer les données de la procédure.
      • Les sorties :idv, :ids, et :activite sont utilisées pour afficher les détails de la réservation.
    • Exécute la procédure et affiche un message :
      • Si idv == -1, aucun séjour n’est disponible.
      • Sinon, les détails du séjour sont affichés.
  3. Gestion des erreurs :

    • Vérifie les erreurs de connexion, de validation des données, et d’exécution.
    • Affiche des messages explicites pour guider l’utilisateur en cas de problème.

Résultat attendu :

  1. Formulaire affiché dans formulaire_reservation.php :
<h1>Réserver un séjour</h1>
<form method="post" action="reserver_sejour.php">
    <label for="idc">ID Client :</label>
    <select id="idc" name="idc">
        <option value="1">1 - Alice</option>
        <option value="2">2 - Bob</option>
    </select>
    <br>
    <label for="ville">Ville :</label>
    <select id="ville" name="ville">
        <option value="NY">NY</option>
        <option value="Chatelaillon">Chatelaillon</option>
    </select>
    <br>
    <label for="jour">Jour :</label>
    <input type="number" id="jour" name="jour" min="1" max="365">
    <br>
    <button type="submit">Réserver</button>
</form>
  1. Message affiché dans reserver_sejour.php après soumission valide :

Si un séjour est disponible :

<p>Réservation réussie ! Détails :</p>
<ul>
    <li>ID du séjour : 101</li>
    <li>ID du village : 10</li>
    <li>Activité : resto</li>
</ul>

Si aucun séjour n’est disponible :

<p>Aucun séjour disponible pour cette ville.</p>

Correction détaillée de l’Exercice 5 : Consultation des séjours d’un client

Objectif :

Permettre à un utilisateur de consulter les séjours d’un client en appelant la procédure PL/SQL CONSULTER_SEJOURS2.

Code corrigé :

Créez deux fichiers :

  1. Fichier formulaire_consulter.php :
    • Contient le formulaire HTML pour sélectionner l’ID du client.
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Consultation des séjours</title>
</head>
<body>
    <h1>Consulter les séjours d'un client</h1>
    <form method="post" action="consulter_sejours.php">
        <label for="idc">ID Client :</label>
        <select id="idc" name="idc" required>
            <?php
            // Connexion à la base Oracle pour récupérer les IDs des clients
            $username = 'VOTRE_UTILISATEUR';
            $password = 'VOTRE_MOT_DE_PASSE';
            $dbname = 'localhost/XEPDB1';
            $connection = oci_connect($username, $password, $dbname);

            if (!$connection) {
                echo "<option>Erreur de connexion</option>";
            } else {
                $query = "SELECT IDC, NOM FROM CLIENT";
                $cursor = oci_parse($connection, $query);
                oci_execute($cursor);
                while ($row = oci_fetch_assoc($cursor)) {
                    echo "<option value='" . htmlspecialchars($row['IDC']) . "'>" 
                         . htmlspecialchars($row['IDC'] . " - " . $row['NOM']) 
                         . "</option>";
                }
                oci_free_statement($cursor);
                oci_close($connection);
            }
            ?>
        </select>
        <br>
        <button type="submit">Consulter</button>
    </form>
</body>
</html>
  1. Fichier consulter_sejours.php :
    • Appelle la procédure PL/SQL CONSULTER_SEJOURS2 et affiche les séjours du client.
<?php
// Informations de connexion
$username = 'VOTRE_UTILISATEUR'; // Remplacez par votre utilisateur Oracle
$password = 'VOTRE_MOT_DE_PASSE'; // Remplacez par votre mot de passe Oracle
$dbname = 'localhost/XEPDB1'; // Remplacez par votre nom ou adresse de base

// Connexion à la base Oracle
$connection = oci_connect($username, $password, $dbname);
if (!$connection) {
    $error = oci_error();
    echo "<p>Erreur de connexion : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Récupération de l'ID du client
$idc = $_POST['idc'] ?? 0;

// Vérification des données
if ($idc <= 0) {
    echo "<p>Données invalides. Veuillez sélectionner un client valide.</p>";
    exit;
}

// Activer la sortie DBMS_OUTPUT
oci_execute(oci_parse($connection, "BEGIN DBMS_OUTPUT.ENABLE(NULL); END;"));

// Préparation de l'appel à la procédure CONSULTER_SEJOURS2
$query = "BEGIN CONSULTER_SEJOURS2(:idc); END;";
$cursor = oci_parse($connection, $query);
oci_bind_by_name($cursor, ":idc", $idc);

// Exécution de la procédure
if (!oci_execute($cursor)) {
    $error = oci_error($cursor);
    echo "<p>Erreur lors de la consultation : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Récupération des résultats DBMS_OUTPUT
$output_cursor = oci_parse($connection, "BEGIN DBMS_OUTPUT.GET_LINE(:line, :status); END;");
oci_bind_by_name($output_cursor, ":line", $line, 255);
oci_bind_by_name($output_cursor, ":status", $status);

echo "<h2>Résultats des séjours pour le client ID : " . htmlspecialchars($idc) . "</h2>";
echo "<ul>";

// Lire toutes les lignes renvoyées par DBMS_OUTPUT
do {
    oci_execute($output_cursor);
    if ($status == 0) {
        echo "<li>" . htmlspecialchars($line) . "</li>";
    }
} while ($status == 0);

echo "</ul>";

// Libération des ressources
oci_free_statement($output_cursor);
oci_free_statement($cursor);
oci_close($connection);
?>

Explications détaillées :

  1. Fichier formulaire_consulter.php :

    • Récupère dynamiquement les IDs et noms des clients depuis la table CLIENT.
    • Présente ces données dans une liste déroulante <select>.
  2. Fichier consulter_sejours.php :

    • Validation des données : Vérifie que l’ID du client est valide avant d’appeler la procédure.
    • Appel de la procédure : Utilise oci_parse et oci_execute pour appeler CONSULTER_SEJOURS2 avec l’ID du client.
    • Gestion de DBMS_OUTPUT :
      • Active DBMS_OUTPUT pour capturer les messages renvoyés par la procédure PL/SQL.
      • Récupère et affiche chaque ligne générée par DBMS_OUTPUT.PUT_LINE dans une liste HTML.
  3. Gestion des erreurs :

    • Vérifie les erreurs de connexion, de validation, et d’exécution de la procédure.
    • Affiche des messages explicites en cas de problème.

Résultat attendu :

  1. Formulaire affiché dans formulaire_consulter.php :
<h1>Consulter les séjours d'un client</h1>
<form method="post" action="consulter_sejours.php">
    <label for="idc">ID Client :</label>
    <select id="idc" name="idc">
        <option value="1">1 - Alice</option>
        <option value="2">2 - Bob</option>
        <!-- Options générées dynamiquement -->
    </select>
    <br>
    <button type="submit">Consulter</button>
</form>
  1. Message affiché dans consulter_sejours.php après soumission valide :

Si des séjours existent pour le client :

<h2>Résultats des séjours pour le client ID : 1</h2>
<ul>
    <li>séjour 100, 10, 1</li>
    <li>séjour 101, 11, 15</li>
</ul>

Si aucun séjour n’existe :

<h2>Résultats des séjours pour le client ID : 1</h2>
<ul>
    <li>Aucun séjour trouvé.</li>
</ul>

Points importants à vérifier :

  • La procédure PL/SQL CONSULTER_SEJOURS2 doit être correctement définie dans la base Oracle et utiliser DBMS_OUTPUT.PUT_LINE pour afficher les résultats.
  • Les IDs des clients doivent être récupérés dynamiquement pour refléter les données actuelles de la table CLIENT.

Correction détaillée de l’Exercice 6 : Suppression des séjours anciens

Objectif :

Permettre à un utilisateur de supprimer tous les séjours antérieurs à une date donnée en utilisant la fonction PL/SQL TRAITEMENT3 et afficher le nombre de séjours supprimés.

Code corrigé :

Créez deux fichiers :

  1. Fichier formulaire_suppression.php :
    • Contient le formulaire HTML pour saisir la date (jour limite) de suppression.
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Suppression des séjours anciens</title>
</head>
<body>
    <h1>Suppression des séjours anciens</h1>
    <form method="post" action="supprimer_sejours.php">
        <label for="jour">Jour limite (1 à 365) :</label>
        <input type="number" id="jour" name="jour" min="1" max="365" required>
        <br>
        <button type="submit">Supprimer</button>
    </form>
</body>
</html>
  1. Fichier supprimer_sejours.php :
    • Traite les données du formulaire et appelle la fonction PL/SQL TRAITEMENT3.
<?php
// Informations de connexion
$username = 'VOTRE_UTILISATEUR'; // Remplacez par votre utilisateur Oracle
$password = 'VOTRE_MOT_DE_PASSE'; // Remplacez par votre mot de passe Oracle
$dbname = 'localhost/XEPDB1'; // Remplacez par votre nom ou adresse de base

// Connexion à la base Oracle
$connection = oci_connect($username, $password, $dbname);
if (!$connection) {
    $error = oci_error();
    echo "<p>Erreur de connexion : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Récupération de la date (jour limite)
$jour = $_POST['jour'] ?? 0;

// Vérification des données
if ($jour <= 0 || $jour > 365) {
    echo "<p>Données invalides. Veuillez saisir un jour valide (entre 1 et 365).</p>";
    exit;
}

// Préparation de l'appel à la fonction TRAITEMENT3
$query = "BEGIN :deleted_count := TRAITEMENT3(:jour); END;";
$cursor = oci_parse($connection, $query);

// Lier les paramètres
oci_bind_by_name($cursor, ":jour", $jour);
oci_bind_by_name($cursor, ":deleted_count", $deleted_count, 32);

// Exécution de la fonction
if (!oci_execute($cursor)) {
    $error = oci_error($cursor);
    echo "<p>Erreur lors de la suppression : " . htmlspecialchars($error['message']) . "</p>";
    exit;
}

// Affichage du résultat
echo "<p>Suppression terminée ! Nombre de séjours supprimés : " . htmlspecialchars($deleted_count) . "</p>";

// Libération des ressources
oci_free_statement($cursor);
oci_close($connection);
?>

Explications détaillées :

  1. Fichier formulaire_suppression.php :

    • Crée un formulaire HTML avec un champ pour saisir la date (jour limite).
    • Vérifie que la valeur saisie est comprise entre 1 et 365 grâce à min et max dans l’attribut HTML du champ.
  2. Fichier supprimer_sejours.php :

    • Récupère la date saisie par l’utilisateur via $_POST.
    • Vérifie que la valeur est valide (entre 1 et 365).
    • Prépare un appel à la fonction PL/SQL TRAITEMENT3 :
      • :jour transmet la date limite à la fonction.
      • :deleted_count récupère le nombre de séjours supprimés.
    • Exécute la fonction et affiche le résultat sous forme de message HTML.
  3. Gestion des erreurs :

    • Gère les erreurs de connexion, de validation des données, et d’exécution de la fonction.
    • Affiche des messages clairs et informatifs pour guider l’utilisateur.

Résultat attendu :

  1. Formulaire affiché dans formulaire_suppression.php :
<h1>Suppression des séjours anciens</h1>
<form method="post" action="supprimer_sejours.php">
    <label for="jour">Jour limite (1 à 365) :</label>
    <input type="number" id="jour" name="jour" min="1" max="365" required>
    <br>
    <button type="submit">Supprimer</button>
</form>
  1. Message affiché dans supprimer_sejours.php après soumission valide :

Si des séjours sont supprimés :

<p>Suppression terminée ! Nombre de séjours supprimés : 5</p>

Si aucun séjour n’est supprimé :

<p>Suppression terminée ! Nombre de séjours supprimés : 0</p>

Si une erreur survient (par exemple, problème de connexion) :

<p>Erreur de connexion : ORA-XXXXX: Description de l'erreur</p>

Points importants à vérifier :

  • La fonction PL/SQL TRAITEMENT3 doit être correctement définie et opérationnelle dans la base Oracle.
  • La suppression doit affecter uniquement les séjours antérieurs au jour limite spécifié.

Correction détaillée de l’Exercice 7 : Validation des données utilisateur

Objectif :

Valider et filtrer les données utilisateur avant de les transmettre à la procédure PL/SQL TRAITEMENT2 pour garantir leur conformité et éviter les vulnérabilités.

Étape 1 : Formulaire HTML

Créez un fichier nommé reservation_validation.php contenant le formulaire HTML.

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Réservation avec validation</title>
</head>
<body>
    <h1>Réserver un séjour avec validation</h1>
    <form method="post" action="reservation_validation.php">
        <label for="idc">ID Client :</label>
        <select id="idc" name="idc" required>
            <?php
            // Connexion à la base Oracle pour récupérer les IDs des clients
            $username = 'VOTRE_UTILISATEUR';
            $password = 'VOTRE_MOT_DE_PASSE';
            $dbname = 'localhost/XEPDB1';
            $connection = oci_connect($username, $password, $dbname);

            if (!$connection) {
                echo "<option>Erreur de connexion</option>";
            } else {
                $query = "SELECT IDC, NOM FROM CLIENT";
                $cursor = oci_parse($connection, $query);
                oci_execute($cursor);
                while ($row = oci_fetch_assoc($cursor)) {
                    echo "<option value='" . htmlspecialchars($row['IDC']) . "'>" 
                         . htmlspecialchars($row['IDC'] . " - " . $row['NOM']) 
                         . "</option>";
                }
                oci_free_statement($cursor);
                oci_close($connection);
            }
            ?>
        </select>
        <br>
        <label for="ville">Ville :</label>
        <select id="ville" name="ville" required>
            <option value="NY">NY</option>
            <option value="Chatelaillon">Chatelaillon</option>
            <option value="Cergy">Cergy</option>
        </select>
        <br>
        <label for="jour">Jour :</label>
        <input type="number" id="jour" name="jour" min="1" max="365" required>
        <br>
        <button type="submit">Réserver</button>
    </form>
</body>
</html>

Étape 2 : Validation des données et réservation

Dans le même fichier, ajoutez le traitement PHP après le formulaire pour valider les données et appeler TRAITEMENT2.

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Connexion à la base Oracle
    $username = 'VOTRE_UTILISATEUR'; // Remplacez par votre utilisateur Oracle
    $password = 'VOTRE_MOT_DE_PASSE'; // Remplacez par votre mot de passe Oracle
    $dbname = 'localhost/XEPDB1'; // Remplacez par votre nom ou adresse de base
    $connection = oci_connect($username, $password, $dbname);
    if (!$connection) {
        $error = oci_error();
        echo "<p>Erreur de connexion : " . htmlspecialchars($error['message']) . "</p>";
        exit;
    }

    // Récupération et validation des données
    $idc = $_POST['idc'] ?? 0;
    $ville = $_POST['ville'] ?? '';
    $jour = $_POST['jour'] ?? 0;

    // Validation de l'ID client
    $query = "SELECT COUNT(*) AS COUNT FROM CLIENT WHERE IDC = :idc";
    $cursor = oci_parse($connection, $query);
    oci_bind_by_name($cursor, ":idc", $idc);
    oci_execute($cursor);
    $row = oci_fetch_assoc($cursor);
    $idc_valid = ($row['COUNT'] > 0);

    // Validation de la ville
    $valid_villes = ["NY", "Chatelaillon", "Cergy"];
    $ville_valid = in_array($ville, $valid_villes);

    // Validation du jour
    $jour_valid = ($jour >= 1 && $jour <= 365);

    // Vérification des validations
    if (!$idc_valid) {
        echo "<p>ID Client invalide.</p>";
    } elseif (!$ville_valid) {
        echo "<p>Ville invalide.</p>";
    } elseif (!$jour_valid) {
        echo "<p>Jour hors limites.</p>";
    } else {
        // Appel de la procédure PL/SQL TRAITEMENT2
        $query = "BEGIN TRAITEMENT2(:idc, :ville, :jour, :idv, :ids, :activite); END;";
        $cursor = oci_parse($connection, $query);

        // Lier les paramètres
        oci_bind_by_name($cursor, ":idc", $idc);
        oci_bind_by_name($cursor, ":ville", $ville);
        oci_bind_by_name($cursor, ":jour", $jour);
        oci_bind_by_name($cursor, ":idv", $idv, 32);
        oci_bind_by_name($cursor, ":ids", $ids, 32);
        oci_bind_by_name($cursor, ":activite", $activite, 50);

        // Exécution de la procédure
        if (oci_execute($cursor)) {
            if ($idv == -1) {
                echo "<p>Aucun séjour disponible pour cette ville.</p>";
            } else {
                echo "<p>Réservation réussie !</p>";
                echo "<ul>";
                echo "<li>ID du séjour : " . htmlspecialchars($ids) . "</li>";
                echo "<li>ID du village : " . htmlspecialchars($idv) . "</li>";
                echo "<li>Activité : " . htmlspecialchars($activite) . "</li>";
                echo "</ul>";
            }
        } else {
            $error = oci_error($cursor);
            echo "<p>Erreur lors de la réservation : " . htmlspecialchars($error['message']) . "</p>";
        }

        // Libération des ressources
        oci_free_statement($cursor);
    }

    oci_close($connection);
}
?>

Résultat attendu

  1. Formulaire valide avec réservation réussie :

Si les données sont valides et un séjour est disponible :

<p>Réservation réussie !</p>
<ul>
    <li>ID du séjour : 101</li>
    <li>ID du village : 10</li>
    <li>Activité : resto</li>
</ul>
  1. Données invalides :
  • Si l’ID client est invalide :
<p>ID Client invalide.</p>
  • Si la ville est invalide :
<p>Ville invalide.</p>
  • Si le jour est hors limites :
<p>Jour hors limites.</p>

Points importants à vérifier

  • Toutes les données utilisateur sont validées avant leur utilisation dans les requêtes ou les procédures.
  • Les messages d’erreur sont clairs et informatifs pour l’utilisateur.
  • Les requêtes utilisent des paramètres liés pour éviter les injections SQL.
Pierre-Henri Paris
Pierre-Henri Paris
Associate Professor in Artificial Intelligence

My research interests include Knowlegde Graphs, Information Extraction, and NLP.