Recuperació de contrasenya
Recuperació de contrasenya
Qualsevol usuari de l'aplicatiu pot intentar recuperar la seva contrasenya en cas que s'hagi oblidat. Per això únicament haurà de respondre un formulari que li preguntarà totes les seves dades personals per assegurar que és qui diu ser.
Inicialització de la sessió i connexió a la BD
En aquest cas, no cal iniciar la sessió en aquesta pàgina, ja que no requerim recuperar-n'hi ni desar-n'hi cap informació
En canvi, hem de requerir el fitxer amb les funcions i una connexió a la BD. En aquest cas, com hem de modificar la contrasenya de l'usuari a la BD, farem servir la connexió d'escriptura.
require 'funcions.php'; require './connexioBD/connexioRW.php';
Formulari de recuperació de contrasenya
Per tal de que l'usuari pugui demostrar qui diu ser, ha d'emplenar un formulari amb les seves dades personals:
- Nom d'usuari
- Correu
- Telèfon
- Edat
- Ciutat
A continuació, tindrà un espai per definir una nova contrasenya.
El formulari de recuperació de contrasenya es visualitzaria de la següent manera

Recuperació de contrasenya
Un cop es respon al formulari anterior, recuperem les dades enviades i les desem
// Recuperem les dades // Trim retira els espais de l'inici i el final de la cadena $nom_usuari = trim($_POST['nom_usuari']); $email = trim($_POST['email']); $telefon = trim($_POST['telefon']); $ciutat = trim($_POST['ciutat']); $edat = $_POST['edat']; $nova_pass = $_POST['nova_contrasenya'];
A continuació realitzarem una consulta SQL on buscarem un registre d'un usuari que tingui tots els valors de tots els camps exactament iguals als que s'ha enviat al formulari. Si es troba un registre, voldrà dir que les dades introduides al formulari són correctes respecte al seu usuari. En cas que no es trobi cap registre, voldrà dir que mínim una dada no és correcte
// Busquem un usuari que tingui exactament els mateixos valors
$stmt = $pdo->prepare("
SELECT id
FROM usuaris
WHERE nom_usuari = ?
AND email = ?
AND telefon = ?
AND ciutat = ?
AND edat = ?
");
$stmt->execute([$nom_usuari, $email, $telefon, $ciutat, $edat]);
$usuari = $stmt->fet
Si l'usuari existeix, agafarem la nova contrasenya i la encriptarem per posteriorment actualitzar l'usuari la ID del qual ha estat recuperada de la consulta anterior, i definirem la nova contrasenya per aquest usuari. En cas que no existeixi l'usuari (no s'hagin introduit les dades correctes), definirem un error
// Si l'usuari existeix, vol dir que ha emplenat tots els valors correctament if ($usuari) {
// Actualitzem la contrasenya $hash = encriptar_contrasenya($nova_pass);$update = $pdo->prepare(" UPDATE usuaris SET contrasenya = ? WHERE id = ? "); $update->execute([$hash, $usuari['id']]);// Registrem "recuperacio-contrasenya" a la taula activitat registrar_activitat($pdo, $usuari['id'], 'recuperacio-contrasenya');$missatge = "Contrasenya actualitzada correctament.";} else {
$error = "Les dades introduïdes no coincideixen amb cap usuari.";}
Mostra de missatges d'error o èxit
En cas que l'usuari introdueixi alguna informació incorrecte o completi l'operació amb èxit, es mostrarà un missatge a la part superior del formulari, indicant quin ha sigut l'error o si l'operació s'ha completat
<?php if ($error): // En cas que hi hagi un error es mostrarà?>
<div class="alert alert-error"><?= htmlspecialchars($error) ?></div>
<?php endif; ?>
<?php if ($missatge): // En cas que hi hagi algun missatge d'èxit es mostrarà?>
<div class="alert alert-success"><?= htmlspecialchars($missatge) ?></div>
<?php endif; ?>
Un exemple de missatge d'error es visualitzaria de la següent forma

Un exemple de missatge d'èxit es visualitzaria de la següent forma

Codi complet
<?php
// No necessitem iniciar la sessió ja que no s'utilitza en aquest codi
require 'funcions.php';
require './connexioBD/connexioRW.php';
// Iniciem les variables del missatge
$error = '';
$missatge = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Recuperem les dades
// Trim retira els espais de l'inici i el final de la cadena
$nom_usuari = trim($_POST['nom_usuari']);
$email = trim($_POST['email']);
$telefon = trim($_POST['telefon']);
$ciutat = trim($_POST['ciutat']);
$edat = $_POST['edat'];
$nova_pass = $_POST['nova_contrasenya'];
try {
// Busquem un usuari que tingui exactament els mateixos valors
$stmt = $pdo->prepare("
SELECT id
FROM usuaris
WHERE nom_usuari = ?
AND email = ?
AND telefon = ?
AND ciutat = ?
AND edat = ?
");
$stmt->execute([$nom_usuari, $email, $telefon, $ciutat, $edat]);
$usuari = $stmt->fetch(PDO::FETCH_ASSOC);
// Si l'usuari existeix, vol dir que ha emplenat tots els valors correctament
if ($usuari) {
// Actualitzem la contrasenya
$hash = encriptar_contrasenya($nova_pass);
$update = $pdo->prepare("
UPDATE usuaris
SET contrasenya = ?
WHERE id = ?
");
$update->execute([$hash, $usuari['id']]);
// Registrem "recuperacio-contrasenya" a la taula activitat
registrar_activitat($pdo, $usuari['id'], 'recuperacio-contrasenya');
$missatge = "Contrasenya actualitzada correctament.";
} else {
$error = "Les dades introduïdes no coincideixen amb cap usuari.";
}
} catch (PDOException $e) {
$error = "Error en la recuperació. Motiu: " . $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<title>Recuperació de contrasenya</title>
<link rel="stylesheet" href="./css/recuperacio.css">
</head>
<body>
<div class="recovery-container">
<header class="recovery-header">
<h2>Recuperar accés</h2>
<p>Verifica la teva identitat per restablir la contrasenya</p>
</header>
<?php if ($error): // En cas que hi hagi un error es mostrarà?>
<div class="alert alert-error"><?= htmlspecialchars($error) ?></div>
<?php endif; ?>
<?php if ($missatge): // En cas que hi hagi algun missatge d'èxit es mostrarà?>
<div class="alert alert-success"><?= htmlspecialchars($missatge) ?></div>
<?php endif; ?>
<form method="post" class="recovery-card">
<div class="form-section">
<h3>Verificació de dades</h3>
<div class="input-group">
<label>Nom d'usuari</label>
<input type="text" name="nom_usuari" required autofocus>
</div>
<div class="input-group">
<label>Correu electrònic</label>
<input type="email" name="email" required>
</div>
<div class="input-grid">
<div class="input-group">
<label>Telèfon</label>
<input type="text" name="telefon" required>
</div>
<div class="input-group">
<label>Edat</label>
<input type="number" name="edat" min="0" max="120" required>
</div>
</div>
<div class="input-group">
<label>Ciutat</label>
<input type="text" name="ciutat" required>
</div>
</div>
<hr class="divider">
<div class="form-section">
<h3>Modificació de contrasenya</h3>
<div class="input-group">
<label>Nova contrasenya</label>
<input type="password" name="nova_contrasenya" placeholder="Escull una clau forta" required>
</div>
</div>
<button type="submit" class="btn-recovery">Restablir contrasenya</button>
<div class="recovery-footer">
<a href="login.php">← Tornar al login</a>
</div>
</form>
</div>
</body>
</html>