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 :
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é.
- Le script définit les variables
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.
- La fonction
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.
- En cas de connexion échouée,
Message de succès :
- Si la connexion réussit, un message de confirmation est affiché à l’utilisateur.
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.
- La fonction
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 :
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.
- Le script établit une connexion à la base Oracle en utilisant
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.
- La requête SQL
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.
Récupération et affichage des résultats :
- Une boucle
while
est utilisée pour parcourir les résultats ligne par ligne avecoci_fetch_assoc
. - Les données sont échappées avec
htmlspecialchars
pour éviter les failles XSS et affichées dans un tableau HTML.
- Une boucle
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 :
IDC | NOM | AGE | AVOIR |
---|---|---|---|
1 | Alice | 30 | 2000 |
2 | Bob | 25 | 1500 |
3 | Charlie | 40 | 1000 |
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 :
- 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>
- Fichier
ajouter_client.php
:- Récupère les données du formulaire et appelle la fonction
TRAITEMENT1
pour insérer un nouveau client.
- Récupère les données du formulaire et appelle la fonction
<?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 :
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 fichierajouter_client.php
.
- Crée un formulaire HTML avec deux champs obligatoires :
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é.
- Récupère les données du formulaire avec
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 :
- 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>
- 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 tableCLIENT
. - 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 :
- 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>
- Fichier
reserver_sejour.php
:- Traite les données du formulaire et appelle la procédure PL/SQL
TRAITEMENT2
.
- Traite les données du formulaire et appelle la procédure PL/SQL
<?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 :
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.
- Le formulaire affiche dynamiquement la liste des IDs des clients existants (récupérés depuis la table
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.
- Si
- Récupère les données saisies par l’utilisateur avec
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 :
- 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>
- 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 :
- 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>
- Fichier
consulter_sejours.php
:- Appelle la procédure PL/SQL
CONSULTER_SEJOURS2
et affiche les séjours du client.
- Appelle la procédure PL/SQL
<?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 :
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>
.
- Récupère dynamiquement les IDs et noms des clients depuis la table
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
etoci_execute
pour appelerCONSULTER_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.
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 :
- 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>
- 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 utiliserDBMS_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 :
- 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>
- Fichier
supprimer_sejours.php
:- Traite les données du formulaire et appelle la fonction PL/SQL
TRAITEMENT3
.
- Traite les données du formulaire et appelle la fonction PL/SQL
<?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 :
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
etmax
dans l’attribut HTML du champ.
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.
- Récupère la date saisie par l’utilisateur via
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 :
- 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>
- 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
- 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>
- 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.