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

De Wiki personal d'en Guillem Serrat
Cap resum de modificació
Cap resum de modificació
Línia 303: Línia 303:


== Memòria de les dades introduïdes ==
== Memòria de les dades introduïdes ==
__FORÇATAULA__

Revisió del 00:00, 9 des 2025

Formulari inicial d'alta d'usuari

Dins d'aquesta web trobarem el formulari per dona d'alta usuaris. L'aspecta serà aquest:

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

En total hi haurà 19 camp a emplenar, a partir de la següent taula es pot veure quins són i de quin tipus

Nom del camp Tipus de camp
Tipus de Document Desplegable de selecció
Número Document Text
Nom Text
Cognoms Text
Sexe Desplegable de selecció
Data de naixement Data
Correu electrònic Email
Confirmació de correu electrònic Email
Telèfon mòbil Telèfon
Població Desplegable de selecció
Codi Postal Text
Adreça Text
Periodicitat de cobrament Botons d’opció
Acceptació de condicions Casella de selecció
Acceptació de comunicacions Casella de selecció
Contrasenya Contrasenya
Confirmació de contrasenya Contrasenya
Observacions Àrea de text
Fitxer Fitxer

Tots ells tenen en comú:

  • Tots tenen un label, indicant el nom del campCompten amb un placeholder.
  • En cas de la data i els desplegables de selecció, se’ls hi ha assignat el valor per defecte
  • Tots tenen l’atribut required excepte l’acceptació de comunicacions i les observacions

Alguns elements en especial, tenen certes peculiaritats:

  • En el text de les condicions, s’inclou l’enllaç a les condicions


El formulari serà de tipus POST i inclourà un tipus d'encoding, el qual permet pujar fitxers PDF. L'acció del formulari es un fitxer php que valida les dades segons certes condicions i les enregistra a la BBDD

<form action="../php/validacioDades.php" method="post" enctype="multipart/form-data">

A la part final del formulari comptarem amb dos botons, el primer per enviar el formulari i el segon per netejar les dades, que també dirigeix a l'usuari a l'inici del formulari

<!-- Botons -->
<input type="submit" value="Enviar">
<input type="reset" value="Netejar" onclick="window.location.href='#'">
S'ha produït un error en crear la miniatura: Fitxer inexistent

Validació de dades d’alta d’usuari i inserció de dades a la BBDD

Un cop s'envia el formulari, s'ha de passar per un procés de validació de dades segons certs criteris. Moltes de les verificacions es duen a terme amb les funcions desenvolupades prèviament, i per això les hem d'incorporar a un document (com si fos una biblioteca)

require_once "funcions.php"; // Fem un "copia i enganxa" del contingut del fitxer en el codi
// Únicament ho fem una vegada, en cas d'haver-hi més require iguals, s'ignoraran.


Per comptabilitzar els possibles errors que hi hagi durant les comprovacions, crearem una array. Aquesta emmagatzemarà cadenes de text indicant els errors, que cada verificació podrà personalitzar segons l'error detectat. Així, podrem tant comprovar si hi ha hagut errors per evitar l'inserció de dades, com mostrar els errors trobats a l'usuari

$errors = []; // S'inicïa una array d'errors, on es desaran tots els errors

Amb la següent taula es pot comprovar quines comprovacions es fan en cada camp i amb quines funcions

Camp Comprovacions Funcions utilitzades
Tipus de document
  • És buit
  • Funció campBuit
Número de document
  • És buit
  • Número de document vàlids segons el tipus
  • Funció campBuit
  • Funció validarDNI, validarNIE, validarPassaport, segons el tipus de document
Nom
  • És buit
  • Funció campBuit
Cognoms
  • És buit
  • Funció campBuit
Sexe
  • És buit
  • Funció campBuit
Data de naixement
  • És buit
  • Major d’edat
  • Funció campBuit
  • Funció esMajorEdat
Correu electrònic i verificació
  • És buit
  • Els dos camps són iguals
  • Funció campBuit
  • Comparació (==)
Telèfon
  • És buit
  • Telèfon vàlid
  • Funció campBuit
  • Funció validarTelefon
Població
  • És buit
  • Funció campBuit
Codi Postal
  • És buit
  • Codi postal vàlid
  • Funció campBuit
  • Funció codiPostalValid
Adreça
  • És buit
  • Funció campBuit
Periodicitat
  • És buit
  • Funció campBuit
Acceptació condicions
  • És buit
  • Funció isset de PHP
Contrasenya i verificació
  • És buit
  • Els dos camps són iguals
  • Funció campBuit
  • Comparació (==)
Fitxer PDF
  • És buit
  • És un fitxer PDF
  • Funció isset de PHP
  • Comparació (==)


Un cop fetes totes les verificacions, es comprovarà si l'array d'errors és buida (indicant que no hi ha hagut cap error). En cas que hi hagi hagut, recorrerem tota l'array i imprimirem les cadenes de text (que són els errors) per tal de que l'usuari pugui saber-ho

if (count($errors) > 0) { // Si la quantitat d'errors a l'array és més gran que 0
        echo "<h2>No s'ha pogut processar el registre. S'han trobat errors:</h2>";
        foreach ($errors as $error) { // Per cada error dins de l'array d'error
            echo htmlspecialchars($error); // S'imprimeix l'error
            echo '<br>';
        }
// S'ha acabat

En cas d'haber-hi errors, es podria veure de la següent forma:

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


En cas contrari, es podrà procedir amb la inserció de dades. El primer serà connectar-se amb una connexió de lectura i escriptura.

require_once "connexioRW.php";// Fem un "copia i enganxa" de la connexió de lectura i escriptura en el codi

Seguidament, prepararem la inserció, on després assignarem les variables rebudes del formulari

$stmt = $conn->prepare("

               INSERT INTO $nomTaula (
               tipusDocument, numeroDocument, nom, cognoms, sexe, dataNaixement,
               email, telf, poblacio, codiPostal, adreca, periodicitat,
               rebreComunicacions, contrasenya, hash, observacions, arxiu
           ) VALUES (
               :tipusDocument, :numeroDocument, :nom, :cognoms, :sexe, :dataNaixement,
               :email, :telf, :poblacio, :codiPostal, :adreca, :periodicitat,
               :rebreComunicacions, :contrasenya, :hash, :observacions, :arxiu
           )"

I assignarem cada variable amb el seu paràmetre enllaçat

// Bind dels paràmetres

           $stmt->bindParam(':tipusDocument', $_POST["tipus_document"]);
           $stmt->bindParam(':numeroDocument', $_POST["numero_document"]);
           $stmt->bindParam(':nom', $_POST["nom"]);
           $stmt->bindParam(':cognoms', $_POST["cognoms"]);
           $stmt->bindParam(':sexe', $_POST["sexe"]);
           $stmt->bindParam(':dataNaixement', $_POST["data_naixement"]);
           $stmt->bindParam(':email', $_POST["email"]);
           $stmt->bindParam(':telf', $_POST["telefon"]);
           $stmt->bindParam(':poblacio', $_POST["poblacio"]);
           $stmt->bindParam(':codiPostal', $_POST["codi_postal"]);
           $stmt->bindParam(':adreca', $_POST["adreca"]);
           $stmt->bindParam(':periodicitat', $_POST["periodicitat"]);
           // Camps opcionals (checkbox)
           if (!isset($_POST["accepto_comunicacions"])){ // Si "accepto_comunicacions" NO està marcat
               $rebreComunicacions = "No";
           } else { // Si "accepto_comunicacions" ESTÀ marcat
               $rebreComunicacions = "Si";
           }
           $stmt->bindParam(':rebreComunicacions', $rebreComunicacions);
           $stmt->bindParam(':contrasenya', $_POST["contrasenya"]);
           
           // Hash de contrasenya
           $hashContrasenya = password_hash($_POST["contrasenya"], PASSWORD_DEFAULT); // Creem un hash a partir de la contrasenya
           $stmt->bindParam(':hash', $hashContrasenya);
           $stmt->bindParam(':observacions', $_POST["observacions"]);
           $fitxerContingut = file_get_contents($_FILES['fitxer']['tmp_name']); // Afafem el contingut binari del fitxer
           $stmt->bindParam(':arxiu', $fitxerContingut, PDO::PARAM_LOB); // Dins del camp arxiu, inserim el contingut binari, indicant que és un binari amb PARAM_LOB
           $stmt->execute();

A més a més, el PDF no només s'ha de desar a la BBDD, sinó també a un directori del servidor. Aquest procés està definit a l’apartat “Emmagatzematge de PDF al servidor


Per últim, definirem el missatge d'èxit

// Definim les variables necessàries pel missatge final
$nom = $_POST["nom"];
$cognoms = $_POST["cognoms"];
$hora = date("H:i");
$data = date("d/m/Y");

echo "<p class='result-message'>Sr/a $nom $cognoms, les seves dades han estat enregistrades correctament a les $hora hores del $data</p>";

Per assegurar que la data i la hora és la correcte, indicarem a PHP quina és la nostra zona horària al principi del codi

date_default_timezone_set('Europe/Madrid'); // Definim la zona horària

En cas que hi hagi algun error, saltarà el catch, on comprovarà el codi d’error obtingut. En cas de ser 23000, voldrà dir que el número de document ja existeix a la BBDD i mostrarà un missatge informant-ho, i en cas de ser qualsevol altre, indicarà el missatge genèric de PHP. Degut a que és probable que l’error del número de document surti en diverses situacions, es crea un missatge específic per aquest error, mentre que la resta d’errors tenen una probabilitat molt baixa d’aparèixer.

catch (PDOException $e) { // En cas que hi hagi hagut algun error en inserir les dades
      if ($e->getCode() == 23000) { // Si l'error és que el número de document ja existeix (Camp UNIQUE a la taula)
                echo "<p class='result-message' style='color:red;'>❌ El número de document ja està registrat.</p>";
      } else {
                // Altres errors
                echo "<p class='result-message' style='color:red;'>❌ Error en inserir les dades: " . htmlspecialchars($e->getMessage()) . "</p>";
            }

El resultat d’inserir un Nº de document ja existeix és el següent:

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

En complementació, s’afageix 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/altaUsuari.html"); // Es redirigeix a la pàgina altaUsuari.html
    exit;

Memòria de les dades introduïdes