Registre d'usuaris

De Wiki personal d'en Guillem Serrat
La revisió el 02:10, 12 gen 2026 per Guseba (discussió | contribucions)
(dif.) ← Versió més antiga | Versió actual (dif.) | Versió més nova → (dif.)

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, per registrar un usuari, necessitem modificar la BD per afegir-lo, per tant farem servir la connexió d'escriptura.

require 'funcions.php';
require './connexioBD/connexioRW.php';

Formulari de registre d'usuari

Un usuari es registra mitjançant un formulari de registre, el qual incorpora la següent informació

  • Nom d’usuari (únic en l’aplicació)
  • Contrasenya
  • Nom complet
  • Email (únic en l’aplicació)
  • Telèfon (únic en l’aplicació)
  • Ciutat
  • Edat

Totes les dades han de ser emplenades obligatòriament. Posteriorment, es faran verificacions bàsiques per assegurar que les dades són reals.

El nom d'usuari, el correu electrònic i el telèfon són dades úniques que no es poden repetir a l'aplicació, per tant l'usuari no pot introduir cap valor d'aquests camps que un altre usuari ja hagi registrat

La pàgina inclou un botó de navegació que dirigeix a l'usuari a que iniciï sessió en cas que ja tingui un compte a l'aplicatiu

El formulari de registre es visualitzaria de la següent forma

Procés de registre

Comprovacions bàsiques

Un cop l'usuari ha emplenat i ha enviat el formulari de registre, recuperarem les dades enviades i les desarem en variables

// Recuperem les dades enviades pel formulari
$nom_usuari = trim($_POST['nom_usuari']);
$contrasenya = $_POST['contrasenya'];
$nom_complet = trim($_POST['nom_complet']);
$email = trim($_POST['email']);
$telefon = trim($_POST['telefon']);
$ciutat = trim($_POST['ciutat']);
$edat = $_POST['edat'];

Seguidament, amb aquestes dades, realitzarem les següents comprovacions bàsiques:

  • Verificació d'emplenament (que cap camp estigui buit)
  • Verificació de l'email (que tingui un valor correcte, amb @ i un domini)
  • Verificació de telèfon (que tingui 9 dígits)
  • Verificació de ciutat (que no tingui més de 100 caràcters)
  • Que l'edat sigui vàlida (major de 18 i menor de 120 anys)

En cas que alguna d'aquestes condicions no es cumpleixi, la desarem a una variable nomenada $error

// Verifiquem que cap camp estigui buit
if (empty($nom_usuari) || empty($contrasenya) || empty($nom_complet) || empty($email) || empty($telefon) || empty($ciutat) || empty($edat)) {
    $error = "Manca algun camp";
}

// Verifiquem que l'email sigui realment un email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $error = "L'email introduït no és vàlid";
} 

// Verifiquem que el telèfon sigui vàlid
if (strlen($telefon) != 9) {
    $error = "Telèfon no vàlid";
}

// Verifiquem que la ciutat sigui vàlida
if (strlen($ciutat) > 100) {
    $error = "Ciutat no vàlida";
}

// Verifiquem que l'edat sigui vàlida
if ($edat < 18 || $edat > 120) {
    $error = "Edat no vàlida";
}

Enregistrament de l'usuari

En cas que les condicions bàsiques es cumpleixin, comprovant la variable $error, començarem l'enregistrament de l'usuari

// En cas que no hagi hagut cap error en les comprobacions
if ($error === ''){

Primer, comprovarem que cap altre usuari ja tingui registrat un nom d'usuari, email o telèfon igual que s'ha enviat. Per això realitzem una consulta on cerquem un resultat coincident amb el valor de qualsevol dels tres camps. Si la consulta retorna algun resultat, voldrà dir que ja existeix un usuari amb el mateix valor en algun dels camps

// Comprobar si l'usuari, email o telèfon ja existeixin
$stmt = $pdo->prepare("SELECT * FROM usuaris WHERE nom_usuari = ? OR email = ? OR telefon = ?");
$stmt->execute([$nom_usuari, $email, $telefon]);
if ($stmt->fetch()) {
    $error = "El nom d'usuari, email o telèfon ja existeix.";

Si no retorna res, podrem inserir les dades a la BD

} else {

   // Insertar usuari amb contrasenya encriptada
   $hash = encriptar_contrasenya($contrasenya);
   $stmt = $pdo->prepare("
       INSERT INTO usuaris 
       (nom_usuari, contrasenya, nom_complet, email, telefon, ciutat, edat)
       VALUES (?, ?, ?, ?, ?, ?, ?)
   ");
   $stmt->execute([
       $nom_usuari,
       $hash,
       $nom_complet,
       $email,
       $telefon,
       $ciutat,
       $edat
   ]);

Un cop s'ha registrat l'usuari, recuperarem la ID de l'usuari inserit per, amb la funció registrar_activitat, registrar l'acció "registre" a aquest usuari acabat de crear.

// Registrar activitat $usuari_id = $pdo->lastInsertId(); // Recuperem la ID de l'usuari inserit abans registrar_activitat($pdo, $usuari_id, 'registre'); // Registrem l'acció "registre" a l'usuari creat anteriorment

Per últim, en cas que el procés s'hagi realitzat de forma correcte en la seva totalitat, redirigirem a l'usuari a l'inici de sessió

// Redirigir a login header('Location: login.php'); exit;

Mostra de missatges d'error o èxit

En cas que l'usuari completi el procés de registre correctament, no es mostrarà cap missatge, sinó que directament es redirigirà a la pàgina d'inici de sessió.

En canvi, si hi ha qualsevol error, en la part superior del formulari s'imprimirà el valor de la variable $error, per indicar a l'usuari quin és el problema.

<?php if ($error): // En cas que hi hagi un error es mostrarà?>
    <div class="alert alert-error"><?= htmlspecialchars($error) ?></div>
<?php endif; ?>

Un exemple d'error seria el següent

Codi complet

<?php
// No necessitem iniciar la sessió ja que no s'utilitza en aquest codi
require 'funcions.php';
require './connexioBD/connexioRW.php';

// Inicialitzem la variable que mostra els errors
$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Recuperem les dades enviades pel formulari
    $nom_usuari = trim($_POST['nom_usuari']);
    $contrasenya = $_POST['contrasenya'];
    $nom_complet = trim($_POST['nom_complet']);
    $email = trim($_POST['email']);
    $telefon = trim($_POST['telefon']);
    $ciutat = trim($_POST['ciutat']);
    $edat = $_POST['edat'];

    // Verifiquem que cap camp estigui buit
    if (empty($nom_usuari) || empty($contrasenya) || empty($nom_complet) || empty($email) || empty($telefon) || empty($ciutat) || empty($edat)){
        $error = "Manca algun camp";
    }

    // Verifiquem que l'email sigui realment un email
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = "L'email introduït no és vàlid";
    } 
    
    // Verifiquem que el telèfon sigui vàlid
    if (strlen($telefon) > 9) {
        $error = "Telèfon no vàlid";
    }

    // Verifiquem que la ciutat sigui vàlida
    if (strlen($ciutat) > 100) {
        $error = "Ciutat no vàlida";
    }

    // Verifiquem que l'edat sigui vàlida
    if ($edat < 0 || $edat > 120) {
        $error = "Edat no vàlida";
    }

    // En cas que no hagi hagut cap error en les comprobacions
    if ($error === ''){
        try {
            // Comprobar si l'usuari, email o telèfon ja existeixin
            $stmt = $pdo->prepare("SELECT * FROM usuaris WHERE nom_usuari = ? OR email = ? OR telefon = ?");
            $stmt->execute([$nom_usuari, $email, $telefon]);
            if ($stmt->fetch()) {
                $error = "El nom d'usuari, email o telèfon ja existeix.";
            } else {
                // Insertar usuari amb contrasenya encriptada
                $hash = encriptar_contrasenya($contrasenya);
                $stmt = $pdo->prepare("
                    INSERT INTO usuaris 
                    (nom_usuari, contrasenya, nom_complet, email, telefon, ciutat, edat)
                    VALUES (?, ?, ?, ?, ?, ?, ?)
                ");

                $stmt->execute([
                    $nom_usuari,
                    $hash,
                    $nom_complet,
                    $email,
                    $telefon,
                    $ciutat,
                    $edat
                ]);


                // Registrar activitat
                $usuari_id = $pdo->lastInsertId(); // Recuperem la ID de l'usuari inserit abans
                registrar_activitat($pdo, $usuari_id, 'registre'); // Registrem l'acció "registre" a l'usuari creat anteriorment

                // Redirigir a login
                header('Location: login.php');
                exit;
            }
        } catch (PDOException $e) {
            $error = "Error en registrar l'usuari. Motiu: " . $e->getMessage();
        }    
    }    
}
?>


<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <title>Crea el teu compte</title>
    <link rel="stylesheet" href="./css/registre.css">
</head>
<body>
    <div class="register-container">
        <header class="register-header">
            <h2>Crea el teu compte</h2>
            <p>Uneix-te a la nostra comunitat en pocs segons</p>
        </header>

        <?php if ($error): // En cas que hi hagi un error es mostrarà?>
            <div class="alert alert-error"><?= htmlspecialchars($error) ?></div>
        <?php endif; ?>

        <form method="post" class="register-card">
            <div class="form-section">
                <h3>Informació de compte</h3>
                <div class="input-grid">
                    <div class="input-group">
                        <label>Nom d'usuari</label>
                        <input type="text" name="nom_usuari" required autofocus>
                    </div>
                    <div class="input-group">
                        <label>Contrasenya</label>
                        <input type="password" name="contrasenya" required>
                    </div>
                </div>

                <hr class="divider">

                <h3>Dades personals</h3>
                <div class="input-group">
                    <label>Nom complet</label>
                    <input type="text" name="nom_complet" required>
                </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>

            <button type="submit" class="btn-register">Registrar-me ara</button>
            
            <div class="register-footer">
                Ja tens un compte? <a href="./login.php">Inicia sessió</a>
            </div>
        </form>
    </div>
</body>
</html>