161 lines
6.1 KiB
PHP
161 lines
6.1 KiB
PHP
<?php
|
||
require_once __DIR__ . '/../includes/init_praticien.php';
|
||
|
||
$success = $erreur = '';
|
||
$id = $_SESSION['compte_id'];
|
||
|
||
// Récupérer e-mail actuel
|
||
$stmt = $pdo->prepare("SELECT email FROM compte WHERE id = ?");
|
||
$stmt->execute([$id]);
|
||
$compte = $stmt->fetch();
|
||
|
||
if (!$compte) {
|
||
die($translations['compte_introuvable']);
|
||
}
|
||
|
||
$email_actuel = $compte['email'];
|
||
|
||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||
$nouvel_email = trim($_POST['email'] ?? '');
|
||
$mdp1 = $_POST['mot_de_passe'] ?? '';
|
||
$mdp2 = $_POST['confirm_mot_de_passe'] ?? '';
|
||
|
||
if (!filter_var($nouvel_email, FILTER_VALIDATE_EMAIL)) {
|
||
$erreur = $translations['erreur_email_non_valide'];
|
||
} elseif ($mdp1 && ($mdp1 !== $mdp2 || strlen($mdp1) < 8)) {
|
||
$erreur = $translations['erreur_mdp_invalides'];
|
||
} else {
|
||
// Vérifier si l'email est déjà pris (sauf si c’est le sien)
|
||
$stmt = $pdo->prepare("SELECT id FROM compte WHERE email = ? AND id != ?");
|
||
$stmt->execute([$nouvel_email, $id]);
|
||
if ($stmt->fetch()) {
|
||
$erreur = $translations['err_email_deja_utilise'];
|
||
} else {
|
||
// Mise à jour
|
||
if ($mdp1) {
|
||
$hash = password_hash($mdp1, PASSWORD_DEFAULT);
|
||
$stmt = $pdo->prepare("UPDATE compte SET email = ?, mot_de_passe = ? WHERE id = ?");
|
||
$stmt->execute([$nouvel_email, $hash, $id]);
|
||
} else {
|
||
$stmt = $pdo->prepare("UPDATE compte SET email = ? WHERE id = ?");
|
||
$stmt->execute([$nouvel_email, $id]);
|
||
}
|
||
$success = $translations['success_compte_mis_a_jour'];
|
||
// Optionnel : mettre à jour $email_actuel pour refléter l'écran
|
||
$email_actuel = $nouvel_email;
|
||
}
|
||
}
|
||
}
|
||
require_once '../includes/header.php';
|
||
?>
|
||
|
||
<div class="main1">
|
||
<div class="container py-5">
|
||
<form method="POST" class="shadow p-4 rounded bg-light">
|
||
<h2 class="text-center mb-4"><?= htmlspecialchars($translations['h2_infos_connexion']) ?></h2>
|
||
|
||
<?php if (!empty($erreur)): ?>
|
||
<div class="alert alert-danger"><?= htmlspecialchars($erreur) ?></div>
|
||
<?php endif; ?>
|
||
<?php if (!empty($success)): ?>
|
||
<div class="alert alert-success"><?= htmlspecialchars($success) ?></div>
|
||
<?php endif; ?>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label"><?= htmlspecialchars($translations['label_email']) ?></label>
|
||
<input type="email" name="email" class="form-control" value="<?= htmlspecialchars($email_actuel ?? '') ?>" required>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label"><?= htmlspecialchars($translations['label_nouveau_mdp_opt']) ?></label>
|
||
<div class="field-wrapper">
|
||
<input type="password" name="mot_de_passe" id="mot_de_passe" class="form-control"
|
||
placeholder="<?= htmlspecialchars($translations['placeholder_nouveau_mdp']) ?>">
|
||
<span class="toggle-password" onclick="toggle('mot_de_passe')">👁️</span>
|
||
</div>
|
||
<div class="strength-bar mt-2">
|
||
<div class="strength-fill"></div>
|
||
<div class="strength-fill"></div>
|
||
<div class="strength-fill"></div>
|
||
</div>
|
||
<div id="niveau-securite" class="mb-2 text-muted">
|
||
<?= htmlspecialchars($translations['securite_label']) ?> : <?= htmlspecialchars($translations['securite_vide']) ?>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label"><?= htmlspecialchars($translations['label_confirmer_mdp']) ?></label>
|
||
<div class="field-wrapper">
|
||
<input type="password" name="confirm_mot_de_passe" id="confirm_mot_de_passe" class="form-control"
|
||
placeholder="<?= htmlspecialchars($translations['placeholder_confirmer_mdp']) ?>">
|
||
<span class="toggle-password" onclick="toggle('confirm_mot_de_passe')">👁️</span>
|
||
</div>
|
||
</div>
|
||
<div class="mt-4 text-center">
|
||
<button type="submit" class="btn btn-primary">
|
||
<?= htmlspecialchars($translations['btn_mettre_a_jour']) ?>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
<script>
|
||
function toggle(id) {
|
||
const el = document.getElementById(id);
|
||
el.type = (el.type === 'password') ? 'text' : 'password';
|
||
}
|
||
|
||
document.getElementById('mot_de_passe').addEventListener('input', function () {
|
||
const val = this.value;
|
||
const segments = document.querySelectorAll(".strength-fill");
|
||
const niveauText = document.getElementById("niveau-securite");
|
||
|
||
segments.forEach(s => s.style.backgroundColor = '#ccc');
|
||
|
||
// base label
|
||
const label = <?= json_encode($translations['securite_label'], JSON_UNESCAPED_UNICODE) ?>;
|
||
const faible = <?= json_encode($translations['securite_faible'], JSON_UNESCAPED_UNICODE) ?>;
|
||
const moyen = <?= json_encode($translations['securite_moyen'], JSON_UNESCAPED_UNICODE) ?>;
|
||
const fort = <?= json_encode($translations['securite_fort'], JSON_UNESCAPED_UNICODE) ?>;
|
||
const vide = <?= json_encode($translations['securite_vide'], JSON_UNESCAPED_UNICODE) ?>;
|
||
|
||
niveauText.textContent = `${label} : ${vide}`;
|
||
niveauText.classList.remove("text-danger", "text-warning", "text-success");
|
||
niveauText.classList.add("text-muted");
|
||
|
||
const longOk = val.length >= 8;
|
||
const lettre = /[A-Za-z]/.test(val);
|
||
const chiffre = /\d/.test(val);
|
||
const maj = /[A-Z]/.test(val);
|
||
const special = /[^A-Za-z0-9]/.test(val);
|
||
|
||
let force = 0;
|
||
if (longOk && lettre && chiffre) force++;
|
||
if (maj) force++;
|
||
if (special) force++;
|
||
|
||
if (force === 1) {
|
||
segments[0].style.backgroundColor = 'red';
|
||
niveauText.textContent = `${label} : ${faible}`;
|
||
niveauText.classList.replace("text-muted", "text-danger");
|
||
} else if (force === 2) {
|
||
segments[0].style.backgroundColor = 'orange';
|
||
segments[1].style.backgroundColor = 'orange';
|
||
niveauText.textContent = `${label} : ${moyen}`;
|
||
niveauText.classList.replace("text-muted", "text-warning");
|
||
} else if (force >= 3) {
|
||
segments.forEach(s => s.style.backgroundColor = 'green');
|
||
niveauText.textContent = `${label} : ${fort}`;
|
||
niveauText.classList.replace("text-muted", "text-success");
|
||
}
|
||
});
|
||
</script>
|
||
</div>
|
||
<footer class="site-footer">
|
||
<div class="container">
|
||
<p><?= $translations['copyr'] ?></p>
|
||
</div>
|
||
</footer>
|
||
</body>
|
||
</html>
|
||
|