CARIA.2.1

MAJ 2.1
Formulaires :
- Ajout mutliple conditions de validation  BACK-END
- Amélioration des conditions de réservations de véhicule
- MAJ Front-End
- Modification des règles pour les caractères accépté dans l'inscription
- bug d'enregistrement d'image résolu
DB :
- Modification des règles dans réservations
- Ajout de nouvelles entrée en base
General :
- Ajout de nouveaux messages d'erreurs possible
- Deplacement du bloc de visualisation des utilisateurs
- Ajout carte des vehicule sur la page de connexion
- Ajout de nouvelles images au véhicules
- Ajout des mentions légals
---
Résolution de bugs...
This commit is contained in:
ccunatbrule
2024-05-31 15:24:31 +02:00
parent b2f6dd412b
commit 121bade1a9
117 changed files with 1321 additions and 902 deletions
+1
View File
@@ -0,0 +1 @@
Thumbs.db
+1 -1
View File
@@ -2,7 +2,7 @@
// Connexion à la base de données // Connexion à la base de données
try try
{ {
$bdd = new PDO('mysql:host=IP:3307;dbname=CARIA', 'user', 'mdp',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $bdd = new PDO('mysql:host=IP:3307;dbname=CARIA', 'USER', 'MDP',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
} }
catch(Exception $e) catch(Exception $e)
{ {
Binary file not shown.
+21 -17
View File
@@ -5,20 +5,28 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pseudoCo = $_POST['pseudo_connect'] ?? ''; $pseudoCo = $_POST['pseudo_connect'] ?? '';
$passwordCo = $_POST['password_connect'] ?? ''; $passwordCo = $_POST['password_connect'] ?? '';
// Vérification des identifiants // Vérification des identifiants en utilisant la méthode checkCredentials()
$connexionModel = new Connexion(); $connexionModel = new Connexion();
$userData = $connexionModel->check_Password($pseudoCo);
// Vérifier si l'utilisateur est bloqué
if ($connexionModel->isUserBlocked($pseudoCo)) {
// Afficher un message d'erreur indiquant que l'utilisateur est bloqué
require './vue/connexion.html';
displayBlockedMessage();
exit(); // Arrêter l'exécution du script
}
$userData = $connexionModel->check_Password($pseudoCo);
if ($userData && $connexionModel->checkCredentials($pseudoCo, $passwordCo)) { if ($userData && $connexionModel->checkCredentials($pseudoCo, $passwordCo)) {
// Les identifiants sont corrects, connecter l'utilisateur // Les identifiants sont corrects, connecter l'utilisateur
//require_once './vue/home.html';
// displaySuccessMessage();
connectUser($userData); connectUser($userData);
} else { } else {
// Enregistrer une tentative de connexion infructueuse
$connexionModel->recordFailedLoginAttempt($pseudoCo);
// Afficher un message d'erreur en cas de connexion échouée // Afficher un message d'erreur en cas de connexion échouée
require './vue/connexion.html'; require './vue/connexion.html';
displayErrorMessage(); displayErrorMessage();
} }
} }
// Fonction pour connecter l'utilisateur // Fonction pour connecter l'utilisateur
function connectUser($userData) { function connectUser($userData) {
@@ -52,31 +60,27 @@ function displayErrorMessage() {
}); });
</script>'; </script>';
} }
// Fonction pour afficher un message de succès // Fonction pour afficher un message de bloquage
function displaySuccessMessage() { function displayBlockedMessage() {
echo '<script> echo '<script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
var messageDiv = document.getElementById("message"); var messageDiv = document.getElementById("message");
var successMessage = ` var blockedMessage = `
<div class="alert alert-success"> <div class="alert alert-danger">
<section id="content" class="page-content"> <section id="content" class="page-content">
<div class="card text-center"> <div class="card text-center">
<div class="card-header"> <div class="card-header">
<h3>Connexion réussie</h3> <h3>Connexion bloquée</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<p>Bonjour ' . htmlspecialchars($_SESSION['pseudo_session'], ENT_QUOTES, 'UTF-8') . '.</p> <p>Votre compte a été temporairement bloqué en raison de trop de tentatives de connexion infructueuses. Veuillez réessayer plus tard.</p>
</div> </div>
</div> </div>
</section> </section>
</div> </div>
`; `;
messageDiv.innerHTML = successMessage; messageDiv.innerHTML = blockedMessage;
// Redirection après un délai
setTimeout(function() {
window.location.href = "index.php";
}, 3000); // 3 secondes
}); });
</script>'; </script>';
} }
?> ?>
+170 -54
View File
@@ -1,64 +1,180 @@
<?php <?php
require_once './modele/profil.php'; require_once './modele/profil.php';
require_once './modele/vehicule.php'; require_once './modele/vehicule.php';
// Gestion des requêtes POST pour la suppression des véhicules // Récupérer les informations sur les véhicules et les utilisateurs
// Initialisation des variables
$TotalDesMembres = get_MemberCount();
$TotalDesVehicules = get_VehiculesCount();
$data = get_LastMember();
$derniermembre = htmlspecialchars(stripslashes($data['pseudo']), ENT_QUOTES, 'UTF-8');
$vehicules = get_CarsInfo();
$cars = get_CarsInfo();
$users = get_ProfilsInfo();
$errors = [];
// Gestion des requêtes POST pour la suppression des véhicules
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_vehicule'])) { if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_vehicule'])) {
$id = (int)$_POST['vehicule_id']; try {
post_RemoveVehicule($id); // Assurez-vous que vehicule_id est défini et est un nombre valide
header("Location: gestion.php"); // Redirigez vers la page appropriée après la suppression if (!isset($_POST['vehicule_id']) || !is_numeric($_POST['vehicule_id'])) {
exit(); throw new Exception("ID de véhicule invalide.");
} }
#################### // Convertir l'ID en entier de manière sécurisée
# Liste des véhicules de la compagnie # $id = (int)$_POST['vehicule_id'];
$cars = get_CarsInfo(); // Récupère les informations sur les vehicules depuis le modèle pour afficher toutes les voitures // Suppression du véhicule
$users = get_ProfilsInfo(); // Récupère les informations sur les vehicules depuis le modèle pour afficher toutes les voitures post_RemoveVehicule($id);
#################### // Inclure le fichier de vue et afficher le message de succès
# Formulaire pour les nouveaux véhicules # require_once './vue/gestion.html';
if (empty($_POST['plaque'])) { // Si la variable est vide, on peut considérer qu'on est sur la page de formulaire displayDeleteVehiculeSuccessMessage();
} else { // On est dans le cas traitement exit();
$plaque_erreur1 = NULL; } catch (Exception $e) {
$plaque_erreur2 = NULL; // En cas d'erreur, inclure le fichier de vue et afficher le message d'erreur
$image_erreur3 = NULL; require_once './vue/gestion.html';
// On récupère les variables displayAddVehiculeErrorMessage(["Une erreur est survenue lors de la suppression du véhicule : " . $e->getMessage()]);
$i = 0;
$extensions_valides = array('jpg', 'jpeg', 'gif', 'png');
$plaque = $_POST['plaque'];
$marque = $_POST['marque'];
$modele = $_POST['modele'];
$annee = $_POST['annee'];
// Vérification des champs du formulaire
$plaque_free = get_checkPlaque();
if (!$plaque_free) {
$plaque_erreur1 = "Votre immatriculation est déjà utilisée par un vehicule";
$i++;
} }
}
// Formulaire pour les nouveaux véhicules
if (!empty($_POST['plaque'])) {
try {
$plaque = $_POST['plaque'];
$marque = $_POST['marque'];
$modele = $_POST['modele'];
$annee = $_POST['annee'];
// Validation des champs du formulaire
if (empty($plaque) || strlen($plaque) < 7 || strlen($plaque) > 9) {
$errors[] = "L'immatriculation doit comporter entre 7 et 9 caractères.";
}
if (empty($marque) || strlen($marque) < 2 || strlen($marque) > 50) {
$errors[] = "La marque doit comporter entre 2 et 50 caractères.";
}
if (empty($modele) || strlen($modele) < 2 || strlen($modele) > 50) {
$errors[] = "Le modèle doit comporter entre 2 et 50 caractères.";
}
if (empty($annee) || !preg_match('/^\d{4}$/', $annee)) {
$errors[] = "L'année doit être un nombre de 4 chiffres.";
}
if (!get_checkPlaque()) {
$errors[] = "Votre immatriculation est déjà utilisée par un véhicule.";
}
if (!empty($_FILES['image']['size'])) { if (!empty($_FILES['image']['size'])) {
$extension_upload = strtolower(substr(strrchr($_FILES['image']['name'], '.'), 1)); // Vérification de la taille maximale du fichier (par exemple, 5 Mo)
$maxFileSize = 5 * 1024 * 1024; // 5 Mo en octets
if ($_FILES['image']['size'] > $maxFileSize) {
$errors[] = "La taille de l'image dépasse la limite autorisée de 5 Mo.";
}
// Vérification de l'extension du fichier
$extensions_valides = array('jpg', 'jpeg', 'gif', 'png');
$extension_upload = strtolower(pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION));
if (!in_array($extension_upload, $extensions_valides)) { if (!in_array($extension_upload, $extensions_valides)) {
$i++; $errors[] = "Extension de l'image incorrecte. Seules les extensions JPG, JPEG, GIF et PNG sont autorisées.";
$image_erreur3 = "Extension de l'image incorrecte"; }
// Vérification du type MIME du fichier
$allowedMimeTypes = array('image/jpeg', 'image/png', 'image/gif');
$fileMimeType = mime_content_type($_FILES['image']['tmp_name']);
if (!in_array($fileMimeType, $allowedMimeTypes)) {
$errors[] = "Type de fichier non pris en charge. Veuillez télécharger une image au format JPG, JPEG, GIF ou PNG.";
} }
} }
if ($i == 0) { if (empty($errors)) {
// Message de réussite // Enregistrement du véhicule
echo ' post_RegistreCar();
<script> require_once './vue/gestion.html';
alert("Ajout du véhicule terminé.\n\n Le véhicule ' . addslashes(htmlspecialchars($_POST['plaque'])) . ' a été ajouté au véhicule de la plateforme."); displayAddVehiculeSuccessMessage();
</script>'; exit();
// Inclure à nouveau le formulaire pour permettre à l'utilisateur de ressaisir des valeurs } else {
post_RegistreCar(); require_once './vue/gestion.html';
header("Location: gestion.php"); // Redirigez vers la page appropriée après la suppression displayAddVehiculeErrorMessage($errors);
exit(); }
} else { } catch (Exception $e) {
// Affichage des erreurs // Afficher les messages d'erreur
$errorMessages = ''; require_once './vue/gestion.html';
if ($plaque_erreur1) $errorMessages .= "$plaque_erreur1"; displayAddVehiculeErrorMessage(["Une erreur est survenue lors de l'enregistrement du véhicule."]);
if ($image_erreur3) $errorMessages .= "$image_erreur3";
echo '
<script>
alert("' . $i . ' erreurs s\'est produites lors de l\'ajout du véhicule.\n\n' . addslashes($errorMessages) . '");
</script>';
} }
} }
require './vue/gestion.html'; // Fonction pour afficher un message de succès
function displayDeleteVehiculeSuccessMessage() {
echo '<script>
document.addEventListener("DOMContentLoaded", function() {
var messageDiv = document.getElementById("message");
var successMessage = `
<div class="alert alert-success">
<section id="content" class="page-content">
<div class="card text-center">
<div class="card-header">
<h3>Suppression du véhicule terminé</h3>
</div>
<div class="card-body">
<h5>Le véhicule ' . addslashes(htmlspecialchars($_POST['plaque'])) . ' a été supprimé de la plateforme.</h5><br>
</div>
</div>
</section>
</div>
`;
messageDiv.innerHTML = successMessage;
// Redirection après un délai
setTimeout(function() {
window.location.href = "gestion.php";
}, 2000); // 2 secondes
});
</script>';
}
// Fonction pour afficher un message d'erreur
function displayAddVehiculeErrorMessage($errors) {
echo '<script>document.addEventListener("DOMContentLoaded", function() {
var messageDiv = document.getElementById("message");
var errorMessage = `<div class="alert alert-danger">
<section id="content" class="page-content">
<div class="card text-center">
<div class="card-header">
<h3>Ajout du véhicule interrompu</h3>
</div>
<div class="card-body">
<p>Erreur(s) dans le formulaire d\'ajout de véhicule :</p>
<ul style="list-style-type:none;">'; // Début de la liste d'erreurs
foreach ($errors as $error) {
echo "<li>" . htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . "</li>"; // Ajout de chaque erreur à la liste
}
echo ' </ul>
</div>
</div>
</section>
</div>
`;
messageDiv.innerHTML = errorMessage;
});
</script>';
}
// Fonction pour afficher un message de succès
function displayAddVehiculeSuccessMessage() {
echo '<script>
document.addEventListener("DOMContentLoaded", function() {
var messageDiv = document.getElementById("message");
var successMessage = `
<div class="alert alert-success">
<section id="content" class="page-content">
<div class="card text-center">
<div class="card-header">
<h3>Ajout du véhicule terminé</h3>
</div>
<div class="card-body">
<h5>Le véhicule ' . addslashes(htmlspecialchars($_POST['plaque'])) . ' a été ajouté au véhicule de la plateforme.</h5><br>
</div>
</div>
</section>
</div>
`;
messageDiv.innerHTML = successMessage;
// Redirection après un délai
setTimeout(function() {
window.location.href = "gestion.php";
}, 2000); // 3 secondes
});
</script>';
}
require_once './vue/gestion.html';
?> ?>
+1 -5
View File
@@ -1,12 +1,8 @@
<?php <?php
require_once './modele/vehicule.php'; require_once './modele/vehicule.php';
require_once './modele/profil.php'; require_once './modele/profil.php';
// Initialisation des variables
$TotalDesMembres = get_MemberCount();
$TotalDesVehicules = get_VehiculesCount();
$data = get_LastMember();
$derniermembre = htmlspecialchars(stripslashes($data['pseudo']), ENT_QUOTES, 'UTF-8');
$vehicules = get_CarsInfo(); $vehicules = get_CarsInfo();
// Vérification de la session utilisateur // Vérification de la session utilisateur
if (isset($id_session) && $id_session != 0) { if (isset($id_session) && $id_session != 0) {
require './vue/home.html'; require './vue/home.html';
+139 -55
View File
@@ -1,83 +1,166 @@
<?php <?php
require_once './modele/profil.php'; require_once './modele/profil.php';
// Fonction pour vérifier si le pseudo est disponible
function isPseudoAvailable($pseudo) {
$pseudo_free = get_checkPseudo();
if (!$pseudo_free) {
return false; // Pseudo non disponible
}
return true; // Pseudo disponible
}
// Fonction pour vérifier si l'email est disponible
function isEmailAvailable($email) {
$mail_free = get_checkMail();
if (!$mail_free) {
return false; // Email non disponible
}
return true; // Email disponible
}
// Fonction pour vérifier l'extension de l'avatar
function isValidAvatarExtension($filename, $extensions_valides) {
$extension_upload = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
return in_array($extension_upload, $extensions_valides);
}
// Fonction pour inscrire l'utilisateur // Fonction pour inscrire l'utilisateur
function inscriptionUser($userData) { function inscriptionUser($userData) {
global $bdd; global $bdd;
// Enregistrement de l'utilisateur // Enregistrement de l'utilisateur
post_Registre(); post_Registre(
$userData['pseudo'],
$userData['password'],
$userData['email'],
$userData['localisation'],
$userData['prenom'],
$userData['nom'],
$userData['phone'],
$userData['avatar']
);
// Définition des variables de session // Définition des variables de session
$_SESSION['pseudo_session'] = $userData['pseudo']; $_SESSION['pseudo_session'] = $userData['pseudo'];
$_SESSION['id_session'] = $bdd->lastInsertId(); // Assurez-vous d'avoir accès à $bdd ici $_SESSION['id_session'] = $bdd->lastInsertId(); // Assurez-vous d'avoir accès à $bdd ici
$_SESSION['privilege_session'] = 2; $_SESSION['privilege_session'] = 2;
} }
// Traitement de l'inscription // Traitement de l'inscription
if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$errors = []; $errors = [];
// On récupère les variables // Validation de la taille et de la présence des champs
$extensions_valides = array('jpg', 'jpeg', 'gif', 'png'); $nom = trim($_POST['nom']);
$pseudo = $_POST['pseudo']; $prenom = trim($_POST['prenom']);
$email = $_POST['email']; $pseudo = trim($_POST['pseudo']);
$localisation = $_POST['localisation']; $email = trim($_POST['email']);
$prenom = $_POST['prenom']; $password = $_POST['password'];
$nom = $_POST['nom']; $confirm = $_POST['confirm'];
$pass = md5($_POST['password']); $localisation = trim($_POST['localisation']);
$confirm = md5($_POST['confirm']); $phone = trim($_POST['phone']);
// Validation du pseudo
if (!isPseudoAvailable($pseudo)) { if (empty($nom) || strlen($nom) < 3 || strlen($nom) > 25) {
$errors[] = "Le nom est requis et doit contenir entre 3 et 25 caractères.";
}
if (!preg_match('/^[A-Za-zÀ-ÖØ-öø-ÿ0-9 -]+$/', $nom)) {
$errors[] = "Le nom peut contenir uniquement des lettres, des chiffres, des tirets et des espaces.";
}
if (preg_match('/^\s+$/', $nom)) {
$errors[] = "Le nom ne peut pas être composé uniquement d'espaces.";
}
if (empty($prenom) || strlen($prenom) < 3 || strlen($prenom) > 25) {
$errors[] = "Le prénom est requis et doit contenir entre 3 et 25 caractères.";
}
if (!preg_match('/^[A-Za-zÀ-ÖØ-öø-ÿ0-9 -]+$/', $prenom)) {
$errors[] = "Le prénom peut contenir uniquement des lettres, des chiffres, des tirets et des espaces.";
}
if (preg_match('/^\s+$/', $prenom)) {
$errors[] = "Le prénom ne peut pas être composé uniquement d'espaces.";
}
if (empty($pseudo) || strlen($pseudo) < 3 || strlen($pseudo) > 25) {
$errors[] = "Le pseudo est requis et doit contenir entre 3 et 25 caractères.";
}
if (!ctype_alnum($pseudo)) {
$errors[] = "Le pseudo ne doit contenir que des lettres alphabétiques ou des chiffres.";
}
if (!get_checkPseudo($pseudo)) {
$errors[] = "Votre pseudo est déjà utilisé par un membre."; $errors[] = "Votre pseudo est déjà utilisé par un membre.";
} }
// Validation du mot de passe
if ($pass !== $confirm || empty($confirm) || empty($pass)) { if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Votre mot de passe et la confirmation sont différents, ou sont vides."; $errors[] = "L'adresse e-mail est requise et doit être valide.";
} }
// Validation de l'email
if (!isEmailAvailable($email)) { if (!get_checkMail($email)) {
$errors[] = "Votre adresse email est déjà utilisée par un membre."; $errors[] = "Votre adresse email est déjà utilisée par un membre.";
} }
// Validation de l'avatar s'il est uploadé
if (empty($password) || strlen($password) < 6 || strlen($password) > 32) {
$errors[] = "Le mot de passe est requis et doit contenir entre 6 et 32 caractères.";
}
if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&]).+$/', $password)) {
$errors[] = "Le mot de passe doit contenir au moins une lettre, un chiffre et un caractère spécial (@$!%*?&)";
}
if ($password !== $confirm) {
$errors[] = "Les mots de passe ne correspondent pas.";
}
// Gestion des espaces vides pour le numéro de téléphone
if (empty($phone) || strlen($phone) < 10 || strlen($phone) > 15) {
$errors[] = "Le numéro de téléphone est requis et doit contenir entre 10 et 15 caractères.";
}
if (preg_match('/^\s+$/', $phone)) {
$errors[] = "Le numéro de téléphone ne peut pas être composé uniquement d'espaces.";
}
if (!preg_match('/^\d+$/', $phone)) {
$errors[] = "Le numéro de téléphone ne doit contenir que des chiffres.";
}
if (empty($localisation) || strlen($localisation) < 6 || strlen($localisation) > 50) {
$errors[] = "L'adresse postale est requise et doit contenir entre 6 et 50 caractères.";
}
if (!preg_match('/^[A-Za-zÀ-ÖØ-öø-ÿ0-9 ]+$/', $localisation)) {
$errors[] = "L'adresse postale peut contenir uniquement des lettres, des chiffres et des espaces.";
}
if (preg_match('/^\s+$/', $localisation)) {
$errors[] = "L'adresse ne peut pas être composé uniquement d'espaces.";
}
if (!empty($_FILES['avatar']['size'])) { if (!empty($_FILES['avatar']['size'])) {
if (!isValidAvatarExtension($_FILES['avatar']['name'], $extensions_valides)) { // Vérification de la taille maximale du fichier (par exemple, 5 Mo)
$errors[] = "Extension de l'avatar incorrecte."; $maxFileSize = 5 * 1024 * 1024; // 5 Mo en octets
if ($_FILES['avatar']['size'] > $maxFileSize) {
$errors[] = "La taille de l'avatar dépasse la limite autorisée de 5 Mo.";
}
// Vérification de l'extension du fichier
$extensions_valides = array('jpg', 'jpeg', 'gif', 'png');
$extension_upload = strtolower(pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION));
if (!in_array($extension_upload, $extensions_valides)) {
$errors[] = "Extension de l'avatar incorrecte. Seules les extensions JPG, JPEG, GIF et PNG sont autorisées.";
}
// Vérification du type MIME du fichier
$allowedMimeTypes = array('image/jpeg', 'image/png', 'image/gif');
$fileMimeType = mime_content_type($_FILES['avatar']['tmp_name']);
if (!in_array($fileMimeType, $allowedMimeTypes)) {
$errors[] = "Type de fichier non pris en charge. Veuillez télécharger une image au format JPG, JPEG, GIF ou PNG.";
} }
} }
require_once './vue/inscription.html';
if (empty($errors)) { if (empty($errors)) {
$userData = [ $userData = [
'pseudo' => $pseudo, 'pseudo' => $pseudo,
'password' => $password,
'email' => $email, 'email' => $email,
// Autres champs du formulaire 'localisation' => $localisation,
'prenom' => $prenom,
'nom' => $nom,
'phone' => $_POST['phone'],
'avatar' => $_FILES['avatar']
]; ];
require_once './vue/inscription.html'; inscriptionUser($userData);
inscriptionUser($userData); displayInscriptionSuccessMessage();
displayInscriptionSuccessMessage(); exit;
exit;
} }
} }
// Affichage du formulaire d'inscription avec les éventuelles erreurs // Affichage du formulaire d'inscription avec les éventuelles erreurs
require_once './vue/inscription.html'; require_once './vue/inscription.html';
if (!empty($errors)) { if (!empty($errors)) {
displayInscriptionErrorMessage($errors); displayInscriptionErrorMessage($errors);
} }
// Fonction pour afficher un message d'erreur // Fonction pour afficher un message d'erreur
function displayInscriptionErrorMessage($errors) { function displayInscriptionErrorMessage($errors) {
echo '<script>document.addEventListener("DOMContentLoaded", function() { echo '<script>document.addEventListener("DOMContentLoaded", function() {
@@ -94,16 +177,17 @@ function displayInscriptionErrorMessage($errors) {
foreach ($errors as $error) { foreach ($errors as $error) {
echo "<li>" . htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . "</li>"; // Ajout de chaque erreur à la liste echo "<li>" . htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . "</li>"; // Ajout de chaque erreur à la liste
} }
echo ' </ul> echo ' </ul>
</div> </div>
</div> </div>
</section> </section>
</div> </div>
`; `;
messageDiv.innerHTML = errorMessage; messageDiv.innerHTML = errorMessage;
}); });
</script>'; </script>';
} }
// Fonction pour afficher un message de succès // Fonction pour afficher un message de succès
function displayInscriptionSuccessMessage() { function displayInscriptionSuccessMessage() {
echo '<script> echo '<script>
@@ -132,4 +216,4 @@ function displayInscriptionSuccessMessage() {
}); });
</script>'; </script>';
} }
?> ?>
+136 -71
View File
@@ -1,22 +1,29 @@
<?php <?php
require_once './modele/profil.php'; require_once './modele/profil.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_client'])) { if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_client'])) {
$id = (int)$_SESSION['id_session']; $id = (int)$_SESSION['id_session'];
post_RemoveClient($id); post_RemoveClient($id);
header("Location: index.php"); // Redirigez vers la page appropriée après la suppression header("Location: index.php"); // Rediriger vers la page appropriée après la suppression
displayDeleteProfilSuccessMessage();
exit(); exit();
} }
$vehicules = get_ProfilsInfo(); $vehicules = get_ProfilsInfo();
// On récupère la valeur de nos variables passées par URL
// Récupérer l'action et l'ID du membre depuis les paramètres URL
$action = isset($_GET['action']) ? htmlspecialchars($_GET['action']) : 'consulter'; $action = isset($_GET['action']) ? htmlspecialchars($_GET['action']) : 'consulter';
$membre = isset($_GET['m']) ? (int)$_GET['m'] : ''; $membreId = isset($_GET['m']) ? (int)$_GET['m'] : null;
switch($action){ switch($action){
case "consulter": case "consulter":
// On affiche les infos sur le membre // Afficher les informations du membre
$data = get_MemberInfo(); $userData = get_MemberInfo($membreId);
require './vue/profile_view.html'; if ($userData === false) {
$message = "Impossible de récupérer les informations de l'utilisateur où il n'existe pas.";
require_once './vue/erreur.html';
} else {
require_once './vue/profile_view.html';
}
break; break;
case "modifier": case "modifier":
handleProfileModification(); handleProfileModification();
@@ -24,124 +31,182 @@ switch($action){
default: default:
echo '<p>Cette action est impossible</p>'; echo '<p>Cette action est impossible</p>';
} }
function handleProfileModification(){
function handleProfileModification() {
if (empty($_POST['sent'])) { if (empty($_POST['sent'])) {
// On commence par s'assurer que le membre est connecté $userData = get_MemberInfoId();
// if ($id == 0) erreur(ERR_IS_NOT_CO); require_once './vue/edit_profile_view.html';
// Les infos du membre
$data = get_MemberInfoId();
require './vue/edit_profile_view.html';
} else { } else {
$i = 0; // Collecter les données du formulaire
$pass = /*md5*/($_POST['password']); $id = (int)$_SESSION['id_session'];
$confirm = /*md5*/($_POST['confirm']); $pseudo = $_SESSION['pseudo_session'];
$password = $_POST['password'];
$confirm = $_POST['confirm'];
$email = $_POST['email']; $email = $_POST['email'];
$localisation = $_POST['localisation']; $localisation = $_POST['localisation'];
$phone = $_POST['phone']; $phone = $_POST['phone'];
$pseudo = $_SESSION['pseudo_session']; $avatar = $_FILES['avatar'];
$extensions_valides = array('jpg', 'jpeg', 'gif', 'png'); $errors = [];
// Vérification des champs du formulaire
if ($pass != $confirm || empty($confirm) || empty($pass)) { // Validation de l'email
$mdp_erreur = "Votre mot de passe et la confirmation sont différents ou sont vides"; if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
$i++; $errors[] = "L'adresse e-mail est requise et doit être valide.";
} }
if (!get_checkMyMail($email, $id)) {
$errors[] = "Votre adresse email est déjà utilisée par un membre.";
}
// Validation du mot de passe
if (empty($password) || strlen($password) < 6 || strlen($password) > 32) {
$errors[] = "Le mot de passe est requis et doit contenir entre 6 et 32 caractères.";
}
if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&]).+$/', $password)) {
$errors[] = "Le mot de passe doit contenir au moins une lettre, un chiffre et un caractère spécial (@$!%*?&)";
}
if ($password !== $confirm) {
$errors[] = "Les mots de passe ne correspondent pas.";
}
// Validation du numéro de téléphone
if (empty($phone) || strlen($phone) < 10 || strlen($phone) > 15) {
$errors[] = "Le numéro de téléphone est requis et doit contenir entre 10 et 15 caractères.";
}
if (preg_match('/^\s+$/', $phone)) {
$errors[] = "Le numéro de téléphone ne peut pas être composé uniquement d'espaces.";
}
if (!preg_match('/^\d+$/', $phone)) {
$errors[] = "Le numéro de téléphone ne doit contenir que des chiffres.";
}
// Validation de l'adresse postale
if (empty($localisation) || strlen($localisation) < 6 || strlen($localisation) > 50) {
$errors[] = "L'adresse postale est requise et doit contenir entre 6 et 50 caractères.";
}
if (!preg_match('/^[A-Za-zÀ-ÖØ-öø-ÿ0-9 ]+$/', $localisation)) {
$errors[] = "L'adresse postale peut contenir uniquement des lettres, des chiffres et des espaces.";
}
if (preg_match('/^\s+$/', $localisation)) {
$errors[] = "L'adresse ne peut pas être composée uniquement d'espaces.";
}
// Validation de l'avatar
if (!empty($_FILES['avatar']['size'])) { if (!empty($_FILES['avatar']['size'])) {
$extension_upload = strtolower(substr(strrchr($_FILES['avatar']['name'], '.'), 1)); $maxFileSize = 5 * 1024 * 1024; // 5 Mo en octets
if ($_FILES['avatar']['size'] > $maxFileSize) {
$errors[] = "La taille de l'avatar dépasse la limite autorisée de 5 Mo.";
}
$extensions_valides = ['jpg', 'jpeg', 'gif', 'png'];
$extension_upload = strtolower(pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION));
if (!in_array($extension_upload, $extensions_valides)) { if (!in_array($extension_upload, $extensions_valides)) {
$i++; $errors[] = "Extension de l'avatar incorrecte. Seules les extensions JPG, JPEG, GIF et PNG sont autorisées.";
$avatar_erreur3 = "Extension de l'avatar incorrecte"; }
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
$fileMimeType = mime_content_type($_FILES['avatar']['tmp_name']);
if (!in_array($fileMimeType, $allowedMimeTypes)) {
$errors[] = "Type de fichier non pris en charge. Veuillez télécharger une image au format JPG, JPEG, GIF ou PNG.";
} }
} }
if ($i == 0) {
if (empty($errors)) {
if (isset($_POST['delete'])) { if (isset($_POST['delete'])) {
post_RemoveAvatar($pseudo); post_RemoveAvatar($pseudo);
} }
// On modifie la table post_UpdateProfile($_SESSION['id_session'], $pseudo, $password, $email, $localisation, $phone, $avatar);
post_UpdateProfile($pseudo, $pass, $email, $localisation, $phone); $userData = get_MemberInfoId(); // Récupérer les informations mises à jour
$data = get_MemberInfoId(); // Récupérer les informations mises à jour
require_once './vue/edit_profile_view.html'; require_once './vue/edit_profile_view.html';
displayModificationProfilSuccessMessage(); displayModificationProfilSuccessMessage();
exit; exit();
} else { } else {
$data = get_MemberInfoId(); // Récupérer les informations mises à jour $userData = get_MemberInfoId(); // Récupérer les informations pour afficher les erreurs
require_once './vue/edit_profile_view.html'; require_once './vue/edit_profile_view.html';
displayModificationProfilErrorMessage($i, $avatar_erreur3 ?? null, $mdp_erreur ?? null); displayModificationProfilErrorMessage($errors);
} }
} }
} }
// Fonction pour afficher un message de succès
// Fonction pour afficher un message de succès lors de la modification du profil
function displayModificationProfilSuccessMessage() { function displayModificationProfilSuccessMessage() {
echo '<script> echo '<script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
var messageDiv = document.getElementById("message"); var messageDiv = document.getElementById("message");
var successMessage = ` var successMessage = `
<div class="alert alert-success"> <div class="alert alert-success">
<section id="content" class="page-content"> <section id="content" class="page-content">
<div class="card text-center"> <div class="card text-center">
<div class="card-header"> <div class="card-header">
<h2>Modification de profil terminée</h2> <h2>Modification de profil terminée</h2>
</div> </div>
<div class="card-body"> <div class="card-body">
<h5>Votre profil a été modifié avec succès !</h5> <h5>Votre profil a été modifié avec succès !</h5>
</div> </div>
</div> </div>
</section> </section>
</div> </div>
`; `;
messageDiv.innerHTML = successMessage; messageDiv.innerHTML = successMessage;
}); });
</script>'; </script>';
} }
function displayModificationProfilErrorMessage($i, $avatar_erreur3 = null, $mdp_erreur = null) {
// Fonction pour afficher un message d'erreur lors de la modification du profil
function displayModificationProfilErrorMessage($errors) {
echo '<script> echo '<script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
var messageDiv = document.getElementById("message"); var messageDiv = document.getElementById("message");
var errorMessage = ` var errorMessage = `
<div class="alert alert-danger"> <div class="alert alert-danger">
<section id="content" class="page-content"> <section id="content" class="page-content">
<div class="card text-center"> <div class="card text-center">
<div class="card-header"> <div class="card-header">
<h2>Modification de profil interrompue</h2> <h3>Échec de la modification du profil</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<h5>Nous avons rencontré ' . $i . ' erreur(s) lors de la modification de votre profil :</h5><br> <p>Erreur(s) dans le formulaire de modification :</p>
<ul style="list-style-type:none;">'; <ul style="list-style-type:none;">';
if (isset($avatar_erreur3)) { foreach ($errors as $error) {
echo '<li>' . $avatar_erreur3 . '</li>'; echo "<li>" . htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . "</li>"; // Ajouter chaque erreur à la liste
} }
if (isset($mdp_erreur)) { echo ' </ul>
echo '<li>' . $mdp_erreur . '</li>'; </div>
} </div>
echo ' </ul> </section>
</div> </div>
</div>
</section>
</div>
`; `;
messageDiv.innerHTML = errorMessage; messageDiv.innerHTML = errorMessage;
}); });
</script>'; </script>';
} }
// Fonction pour afficher un message de succès lors de la suppression du profil
function displayDeleteProfilSuccessMessage() { function displayDeleteProfilSuccessMessage() {
echo '<script> echo '<script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
var messageDiv = document.getElementById("message"); var messageDiv = document.getElementById("message");
var errorMessage = ` var successMessage = `
<div class="alert alert-success"> <div class="alert alert-success">
<section id="content" class="page-content"> <section id="content" class="page-content">
<div class="card text-center"> <div class="card text-center">
<div class="card-header"> <div class="card-header">
<h2>Suppression de compte confirmée</h2> <h2>Suppression de compte confirmée</h2>
</div> </div>
<div class="card-body"> <div class="card-body">
<p>Votre compte a été supprimé avec succès. Nous vous remercions pour votre utilisation de notre service.</p> <p>Votre compte a été supprimé avec succès. Nous vous remercions pour votre utilisation de notre service.</p>
</div> </div>
</div> </div>
</section> </section>
</div> </div>
`; `;
messageDiv.innerHTML = errorMessage; messageDiv.innerHTML = successMessage;
}); });
</script>'; </script>';
} }
?> ?>
-61
View File
@@ -1,61 +0,0 @@
<?php
require_once './modele/vehicule.php';
if (empty($_POST['plaque'])) { // Si la variable est vide, on peut considérer qu'on est sur la page de formulaire
} else { // On est dans le cas traitement
$plaque_erreur1 = NULL;
$plaque_erreur2 = NULL;
$image_erreur3 = NULL;
// On récupère les variables
$i = 0;
$extensions_valides = array('jpg', 'jpeg', 'gif', 'png');
$plaque = $_POST['plaque'];
$marque = $_POST['marque'];
$modele = $_POST['modele'];
$annee = $_POST['annee'];
// Vérification des champs du formulaire
$plaque_free = get_checkPlaque();
if (!$plaque_free) {
$plaque_erreur1 = "Votre plaque est déjà utilisée par un vehicule";
$i++;
}
if (strlen($plaque) < 7 || strlen($plaque) > 9) {
$plaque_erreur2 = "Votre plaque est soit trop grande, soit trop petite";
$i++;
}
if (!empty($_FILES['image']['size'])) {
$extension_upload = strtolower(substr(strrchr($_FILES['image']['name'], '.'), 1));
if (!in_array($extension_upload, $extensions_valides)) {
$i++;
$image_erreur3 = "Extension de l'image incorrecte";
}
}
if ($i == 0) {
// Affichage du message de réussite
echo '
<div class="container">
<section id="content" class="page-content">
<div class="container text-center">
<hr><h2 style="color: green;">Ajout du véhicule terminé</h2><br>
<h5 style="color: green;">Le véhicule ' . stripslashes(htmlspecialchars($_POST['plaque'])) . ' a été ajouté au véhicule de la compagnie</h5><hr><br>
</div>
</section>
</div>';
// Inclure à nouveau le formulaire pour permettre à l'utilisateur de ressaisir des valeurs
post_RegistreCars();
} else {
// Affichage des erreurs et lien pour retourner au formulaire
echo '
<div class="container"><section id="content" class="page-content"><div class="container text-center">
<hr><h2>Ajout du véhicule interrompu</h2><br>
<h5>' . $i . ' erreurs se sont produites lors de l\'ajout du véhicule</h5><br>
<ul>';
if ($plaque_erreur1) echo "<p>$plaque_erreur1</p>";
if ($plaque_erreur2) echo "<p>$plaque_erreur2</p>";
if ($image_erreur3) echo "<p>$image_erreur3</p>";
echo '
</ul><hr><br>
</div></section></div>';
}
}
require './vue/vehicule.html';
?>
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Some files were not shown because too many files have changed in this diff Show More