Formulari d'esborrament d'usuari: diferència entre les revisions
Es crea la pàgina amb «== Formulari de cerca i selecció per esborrar == De la mateixa manera que amb la cerca d’usuaris, definim criteris de cerca i a l’hora d’obtenir-los ens assegurem que sigui un de definit<pre> <!-- Formulari de cerca --> <form method="post"> <label for="criteri">Selecciona el criteri de cerca:</label> <select name="criteri" id="criteri" required> <option value="">-- Selecciona --</option> <option va...». |
Cap resum de modificació |
||
| Línia 59: | Línia 59: | ||
</pre> | </pre> | ||
Un cop trobats els resultats, generarem un formulari, ja que voldrem enviar certes dades, i la taula amb els resultats, començant per les capçeleres, havent-hi com a novetat, una columna de nom “selecciona” que contindrà caselles de selecció.<pre> | Un cop trobats els resultats, generarem un formulari, ja que voldrem enviar certes dades, i la taula amb els resultats, començant per les capçeleres, havent-hi com a novetat, una columna de nom “selecciona” que contindrà caselles de selecció.<pre> | ||
if (!$result) { // En cas que el SELECT no retorni res | if (!$result) { // En cas que el SELECT no retorni res | ||
| Línia 81: | Línia 79: | ||
echo "</tr>"; | echo "</tr>"; | ||
</pre> | </pre> | ||
I amb les capçaleres ja creades, imprimirem tots els resultats. A cada registre hi haurà un botó d’opció que tindrà com a valor la ID del registre. Això és així per seleccionar quin usuari es vol eliminar. Aques botó de selecció és obligatori, ja que hem de seleccionar quin usuari volem esborrar, tot i que en la cerca únicament aparegui un sol registre.<pre> | I amb les capçaleres ja creades, imprimirem tots els resultats. A cada registre hi haurà un botó d’opció que tindrà com a valor la ID del registre. Això és així per seleccionar quin usuari es vol eliminar. Aques botó de selecció és obligatori, ja que hem de seleccionar quin usuari volem esborrar, tot i que en la cerca únicament aparegui un sol registre.<pre> | ||
| Línia 100: | Línia 97: | ||
echo "</div>"; | echo "</div>"; | ||
</pre> | </pre> | ||
Per últim, crearem un camp per escriure la contrasenya de l’usuari, ja que per eliminar-lo, requerirà la contrasenya d’aquell usuari per tal de completar l’operació; a més del botó d’esborrar<pre> | Per últim, crearem un camp per escriure la contrasenya de l’usuari, ja que per eliminar-lo, requerirà la contrasenya d’aquell usuari per tal de completar l’operació; a més del botó d’esborrar<pre> | ||
| Línia 111: | Línia 107: | ||
== Esborrament a la BBDD i confirmació == | == Esborrament a la BBDD i confirmació == | ||
Un cop hem seleccionat un botó d’opció per a un usuari i premem el botó, el formulari redirigirà al codi que comprovarà si la contrasenya és correcte i esborrarà l'usuari. | |||
Ja que modificarem la BBDD, necessitarem realitzar una [[Administració de la Base de Dades#Connexió d'escriptura (RW)|connexió d'escriptura]].<pre> | |||
require_once "../php/connexioRW.php"; // Requerim una sola vegada la connexió d'escriptura | |||
</pre>A més, es comença desant la ID que ens ha fet arribar el formulari inicial i la contrasenya<pre> | |||
$id = intval($_POST['id_borrar']); // Converteix la ID a numero enter | |||
$contrasenyaIntroduida = $_POST['contrasenya']; // Obtenim la contrasenya introduida | |||
</pre>Un cop recuperada la ID, farem una consulta on recuperem dades bàsiques de l’usuari (pel missatge de confirmació) i el hash, per verificar l’autenticació, segons la ID recuperada. Un cop realitzada la consulta comprovarem si realment és correcte (si la ID realment existeix)<pre> | |||
// Obtenim l'usuari | |||
$stmt = $conn->prepare("SELECT id, nom, cognoms, hash, numeroDocument FROM Usuaris WHERE id = :id"); // Preparem una consulta de les dades amb un usuari en concret | |||
$stmt->bindParam(':id', $id); // Preparem la consulta amb la ID oferta pel radiobutton | |||
$stmt->execute(); // Ens retorna totes les dades de l'usuari. | |||
$usuari = $stmt->fetch(PDO::FETCH_ASSOC); // Recupera tots els registres (files) que retorna la consulta | |||
// PDO::FETCH_ASSOC fa que cada fila es retorni com una array associativa, on les claus són els noms de les columnes | |||
if (!$usuari) { // En cas que l'usuari no existeixi ja que la ID és errònia | |||
echo "<p style='color:red;'>No s'ha trobat l'usuari seleccionat.</p>"; | |||
echo "<a href='../formularis/esborramentUsuari.php' class='styled-button'><i class='fa-solid fa-arrow-left'></i> Tornar enrere</a>"; | |||
exit; | |||
} | |||
</pre>En cas de que retorni un usuari, passarem a comprovar la seva contrasenya<pre> | |||
// Verifiquem la contrasenya | |||
if (password_verify($contrasenyaIntroduida, $usuari['hash']) == false) { // En cas que la contrasenya oferta no sigui la mateixa que la que hi ha a la BD | |||
echo "<p style='color:red;'>La contrasenya no és correcte. No s'ha pogut esborrar l'usuari.</p>"; | |||
echo "<a href='../formularis/esborramentUsuari.php' class='styled-button'><i class='fa-solid fa-arrow-left'></i> Tornar enrere</a>"; | |||
exit; | |||
} | |||
</pre>Per últim esborrarem l'usuari de la BBDD. A més també s'esborrarà el seu directori i PDF corresponents. Aquest procés està definit a l’apartat [[Gestió de PDF#Eliminació de PDF|Eliminació de PDF]]<pre> | |||
// Esborrem l'usuari | |||
$stmt = $conn->prepare("DELETE FROM Usuaris WHERE id = :id"); // Preparem la consulta on esborrem l'usuari segons la seva ID | |||
$stmt->bindParam(':id', $id); // Definim que la ID a esborrar és la ID que ens ha passat el radiobutton | |||
$stmt->execute(); | |||
</pre>El resultat d’un esborrament exitós seria el següent: | |||
[[Fitxer:EsborramentExitos.png|center|miniatura|500x500px]] | |||
En complementació, s'afegeix que en cas que s'accedeixi sense haver enviat cap dada des d’un formulari a la pàgina, es redirigeixi al formulari inicial<pre> | |||
if ($_SERVER["REQUEST_METHOD"] === "POST") { | |||
........ | |||
} else { | |||
// En cas d'accedir a la pàgina sense haver enviat cap formulari | |||
header("Location: ../formularis/esborramentUsuari.php"); // Es redirigeix a la pàgina esborramentUsuari.php | |||
exit; | |||
</pre> | |||
Revisió del 00:35, 9 des 2025
Formulari de cerca i selecció per esborrar
De la mateixa manera que amb la cerca d’usuaris, definim criteris de cerca i a l’hora d’obtenir-los ens assegurem que sigui un de definit
<!-- Formulari de cerca -->
<form method="post">
<label for="criteri">Selecciona el criteri de cerca:</label>
<select name="criteri" id="criteri" required>
<option value="">-- Selecciona --</option>
<option value="numeroDocument">DNI/NIE/Passaport</option>
<option value="email">Correu electrònic</option>
<option value="telf">Telèfon mòbil</option>
<option value="nom_cognoms">Nom i cognoms</option>
</select>
<label for="valor">Introdueix el valor a cercar:</label>
<input type="text" id="valor" name="valor" required>
<input type="submit" value="Cercar">
</form>
A més, també requerim una connexió de lectura i assignem tant el criteri seleccionat com el valor, i comprovem que el criteri n’és un de permès
require_once "../php/connexioR.php"; // Requerim una sola vegada la connexió de lectura
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$criteri = $_POST['criteri']; // Definim la variable criteri
$valor = trim($_POST['valor']); // Definim la variable valor
// Validar criteri
$columnes_permeses = ['numeroDocument', 'email', 'telf', 'nom_cognoms']; // Definim el nom de les columnes permeses en la cerca
if (!in_array($criteri, $columnes_permeses)) { // Si el criteri de cerca no està en l'array de columnes permeses (usat per millorar la seguretat, evitant injeccions SQL)
echo "<p style='color:red;'>Criteri no vàlid.</p>";
}
A partir d'aquí, els resultats que retornarà serà únicament la ID, el nom i cognoms, el nº de document, l’email i el telèfon (dades bàsiques). De la mateixa manera, el SELECT és un pels noms i cognoms i un altre per la resta de criteris
if ($criteri === 'nom_cognoms') { // Ja que el nom i cognom està separat a la base de dades
$stmt = $conn->prepare("SELECT id, tipusDocument, numeroDocument, nom, cognoms, email, telf FROM Usuaris WHERE CONCAT(nom,' ',cognoms) = :valor"); // El WHERE es diferent, ja que hem de concatenar les dues columnes } else { $stmt = $conn->prepare("SELECT id, tipusDocument, numeroDocument, nom, cognoms, email, telf FROM Usuaris WHERE $criteri = :valor"); // Ja que el nom dels valors i el criteri tenen el mateix nom, és el mateix WHERE per tots }$stmt->bindParam(':valor', $valor); // Assignem la variable $valor al paràmetre enllaçat de la consulta preparada $stmt->execute(); // Executem el SELECT $result = $stmt->fetchAll(PDO::FETCH_ASSOC); // Recupera tots els registres (files) que retorna la consulta // PDO::FETCH_ASSOC fa que cada fila es retorni com una array associativa, on les claus són els noms de les columnes
Un cop trobats els resultats, generarem un formulari, ja que voldrem enviar certes dades, i la taula amb els resultats, començant per les capçeleres, havent-hi com a novetat, una columna de nom “selecciona” que contindrà caselles de selecció.
if (!$result) { // En cas que el SELECT no retorni res
echo "<p>No s'ha trobat cap usuari amb aquest criteri.</p>";
} else { // En cas que el SELECT retorni algun registre
echo "<p>Resultats trobats:</p>";
echo "<form method='post' action='../php/esborrarConfirmar.php'>"; // Imprimirem un formulari el qual enviarà l'usuari seleccionat per esborrar i la seva contrasenya
echo "<div class='table-wrapper'>";
echo "<table border='1' cellpadding='5'>"; // Imprimim la taula
// Imprimim les capçaleres de la taula
echo "<tr>";
echo "<th>Selecciona</th>";
echo "<th>Tipus Document</th>";
echo "<th>Nº Document</th>";
echo "<th>Nom</th>";
echo "<th>Cognoms</th>";
echo "<th>Email</th>";
echo "<th>Telèfon</th>";
echo "</tr>";
I amb les capçaleres ja creades, imprimirem tots els resultats. A cada registre hi haurà un botó d’opció que tindrà com a valor la ID del registre. Això és així per seleccionar quin usuari es vol eliminar. Aques botó de selecció és obligatori, ja que hem de seleccionar quin usuari volem esborrar, tot i que en la cerca únicament aparegui un sol registre.
foreach ($result as $fila) { // Imprimim tots els registres
echo "<tr>"; // Iniciem la fila
// Imprimim radiobuttions per seleccionar l'usuari a esborarr
echo "<td><input type='radio' name='id_borrar' value='" . htmlspecialchars($fila['id']) . "' required></td>"; // El valor del radiobutton és l'ID del registre de la base de dades. Així podem identificar-lo únicament
// Imprimim la resta de camps dels registres
echo "<td>" . htmlspecialchars($fila['tipusDocument']) . "</td>";
echo "<td>" . htmlspecialchars($fila['numeroDocument']) . "</td>";
echo "<td>" . htmlspecialchars($fila['nom']) . "</td>";
echo "<td>" . htmlspecialchars($fila['cognoms']) . "</td>";
echo "<td>" . htmlspecialchars($fila['email']) . "</td>";
echo "<td>" . htmlspecialchars($fila['telf']) . "</td>";
echo "</tr>"; // Tanquem la fila
}
echo "</table><br>"; // Tanquem la taula
echo "</div>";
Per últim, crearem un camp per escriure la contrasenya de l’usuari, ja que per eliminar-lo, requerirà la contrasenya d’aquell usuari per tal de completar l’operació; a més del botó d’esborrar
echo "<label for='contrasenya'>Introdueix la contrasenya de l'usuari seleccionat:</label>"; // Requerim la contrasenya per esborrar les dades echo "<input type='password' id='contrasenya' name='contrasenya' required>"; echo "<input type='submit' value='Esborrar usuari'>"; // Botó per esborrar l'usuari echo "</form>";
El resultat final després de fer una cerca al formulari d’esborrament d’usuaris és el següent:
Esborrament a la BBDD i confirmació
Un cop hem seleccionat un botó d’opció per a un usuari i premem el botó, el formulari redirigirà al codi que comprovarà si la contrasenya és correcte i esborrarà l'usuari.
Ja que modificarem la BBDD, necessitarem realitzar una connexió d'escriptura.
require_once "../php/connexioRW.php"; // Requerim una sola vegada la connexió d'escriptura
A més, es comença desant la ID que ens ha fet arribar el formulari inicial i la contrasenya
$id = intval($_POST['id_borrar']); // Converteix la ID a numero enter $contrasenyaIntroduida = $_POST['contrasenya']; // Obtenim la contrasenya introduida
Un cop recuperada la ID, farem una consulta on recuperem dades bàsiques de l’usuari (pel missatge de confirmació) i el hash, per verificar l’autenticació, segons la ID recuperada. Un cop realitzada la consulta comprovarem si realment és correcte (si la ID realment existeix)
// Obtenim l'usuari $stmt = $conn->prepare("SELECT id, nom, cognoms, hash, numeroDocument FROM Usuaris WHERE id = :id"); // Preparem una consulta de les dades amb un usuari en concret $stmt->bindParam(':id', $id); // Preparem la consulta amb la ID oferta pel radiobutton $stmt->execute(); // Ens retorna totes les dades de l'usuari. $usuari = $stmt->fetch(PDO::FETCH_ASSOC); // Recupera tots els registres (files) que retorna la consulta // PDO::FETCH_ASSOC fa que cada fila es retorni com una array associativa, on les claus són els noms de les columnes
if (!$usuari) { // En cas que l'usuari no existeixi ja que la ID és errònia
echo "<p style='color:red;'>No s'ha trobat l'usuari seleccionat.</p>"; echo "<a href='../formularis/esborramentUsuari.php' class='styled-button'><i class='fa-solid fa-arrow-left'></i> Tornar enrere</a>"; exit;}
En cas de que retorni un usuari, passarem a comprovar la seva contrasenya
// Verifiquem la contrasenya
if (password_verify($contrasenyaIntroduida, $usuari['hash']) == false) { // En cas que la contrasenya oferta no sigui la mateixa que la que hi ha a la BD echo "<p style='color:red;'>La contrasenya no és correcte. No s'ha pogut esborrar l'usuari.</p>"; echo "<a href='../formularis/esborramentUsuari.php' class='styled-button'><i class='fa-solid fa-arrow-left'></i> Tornar enrere</a>"; exit; }
Per últim esborrarem l'usuari de la BBDD. A més també s'esborrarà el seu directori i PDF corresponents. Aquest procés està definit a l’apartat Eliminació de PDF
// Esborrem l'usuari $stmt = $conn->prepare("DELETE FROM Usuaris WHERE id = :id"); // Preparem la consulta on esborrem l'usuari segons la seva ID $stmt->bindParam(':id', $id); // Definim que la ID a esborrar és la ID que ens ha passat el radiobutton $stmt->execute();
El resultat d’un esborrament exitós seria el següent:
En complementació, s'afegeix que en cas que s'accedeixi sense haver enviat cap dada des d’un formulari a la pàgina, es redirigeixi al formulari inicial
if ($_SERVER["REQUEST_METHOD"] === "POST") {
........
} else {
// En cas d'accedir a la pàgina sense haver enviat cap formulari
header("Location: ../formularis/esborramentUsuari.php"); // Es redirigeix a la pàgina esborramentUsuari.php
exit;