Formulari d'esborrament d'usuari: diferència entre les revisions

De Wiki personal d'en Guillem Serrat
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ó
 
(Hi ha una revisió intermèdia que no es mostren del mateix usuari)
Línia 18: Línia 18:
</form>
</form>
</pre>
</pre>


A més, també requerim una [[Administració de la Base de Dades#Connexió de lectura (R)|connexió de lectura]] i assignem tant el criteri seleccionat com el valor, i comprovem que el criteri n’és un de permès<pre>
A més, també requerim una [[Administració de la Base de Dades#Connexió de lectura (R)|connexió de lectura]] i assignem tant el criteri seleccionat com el valor, i comprovem que el criteri n’és un de permès<pre>
Línia 59: Línia 58:


</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 78:
                 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 96:
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 106:


== 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ó de 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:

S'ha produït un error en crear la miniatura: Fitxer inexistent

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:

S'ha produït un error en crear la miniatura: Fitxer inexistent

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;