Formulari de consulta d'usuari: diferència entre les revisions

De Wiki personal d'en Guillem Serrat
Es crea la pàgina amb «== Formulari de consulta d'usuari == En aquesta pàgina web s'inclou un formulari per cercar usuaris, els quals es mostraran en format taula en la mateixa pàgina. Primerament, s'incorpora el següent formulari per realitzar la cerca:<pre> <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">...».
 
Cap resum de modificació
 
Línia 32: Línia 32:
</pre>Seguidament, realitzarem la consulta per seleccionar les dades. Degut a que a la BBDD el nom i cognoms estan separats i a la cerca estan junts, hem de fer una consulta especialitzada en aquest criteri, concatenant les dues columnes en la comparació. Posteriorment, assignem la variable del valor al paràmetre enllaçat<pre>
</pre>Seguidament, realitzarem la consulta per seleccionar les dades. Degut a que a la BBDD el nom i cognoms estan separats i a la cerca estan junts, hem de fer una consulta especialitzada en aquest criteri, concatenant les dues columnes en la comparació. Posteriorment, assignem la variable del valor al paràmetre enllaçat<pre>
// Preparar SELECT
// Preparar SELECT
            if ($criteri === 'nom_cognoms') { // Ja que el nom i cognom està separat a la base de dades
if ($criteri === 'nom_cognoms') { // Ja que el nom i cognom està separat a la base de dades
                 $stmt = $conn->prepare("SELECT
                 $stmt = $conn->prepare("SELECT
                 id,
                 id,

Revisió de 00:15, 9 des 2025

Formulari de consulta d'usuari

En aquesta pàgina web s'inclou un formulari per cercar usuaris, els quals es mostraran en format taula en la mateixa pàgina.

Primerament, s'incorpora el següent formulari per realitzar la 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>

El qual té el següent aspecte:

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

A l'enviar el formulari, recollirem tant el criteri de cerca com el valor cercat. Per evitar injeccions SQL i millorar la seguretat, implementem una verificació del criteri seleccionat. A més a més, requerim una connexió de lectura.

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    require_once "../php/connexioR.php"; // Requerim una sola vegada la connexió de lectura
    $criteri = $_POST['criteri']; // Definim la variable criteri
    $valor = trim($_POST['valor']); // Definim la variable, l'ultim i el primer caràcter no poden ser espais

    // 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) == false) { // 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>";

Seguidament, realitzarem la consulta per seleccionar les dades. Degut a que a la BBDD el nom i cognoms estan separats i a la cerca estan junts, hem de fer una consulta especialitzada en aquest criteri, concatenant les dues columnes en la comparació. Posteriorment, assignem la variable del valor al paràmetre enllaçat

// Preparar SELECT if ($criteri === 'nom_cognoms') { // Ja que el nom i cognom està separat a la base de dades

               $stmt = $conn->prepare("SELECT
               id,
               tipusDocument AS 'Tipus de document',
               numeroDocument AS 'Nº Document',
               nom AS 'Nom',
               cognoms AS 'Cognoms',
               sexe AS 'Sexe',
               dataNaixement AS 'Data de naixement',
               email AS 'Email',
               telf AS 'Telèfon',
               poblacio AS 'Població',
               codiPostal AS 'Codi postal',
               adreca AS 'Adreça',
               periodicitat AS 'Periodicitat de cobrament',
               rebreComunicacions AS 'Accepta comunicacions',
               contrasenya AS 'Contrasenya',
               observacions AS 'Observacions',
               reg_date AS 'Data de registre',
               arxiu 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 AS 'Tipus de document',
               numeroDocument AS 'Nº Document',
               nom AS 'Nom',
               cognoms AS 'Cognoms',
               sexe AS 'Sexe',
               dataNaixement AS 'Data de naixement',
               email AS 'Email',
               telf AS 'Telèfon',
               poblacio AS 'Població',
               codiPostal AS 'Codi postal',
               adreca AS 'Adreça',
               periodicitat AS 'Periodicitat de cobrament',
               rebreComunicacions AS 'Accepta comunicacions',
               contrasenya AS 'Contrasenya',
               observacions AS 'Observacions',
               reg_date AS 'Data de registre',
               arxiu FROM Usuaris WHERE $criteri = :valor"); // Ja que el nom dels valors i el criteri tenen el mateix nom, és el mateix WHERE per tots
               // El valor de cerca ha de ser exactament igual al valor de la base de dades.
           }
           $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

Per últim, imprimirem la taula amb els resultats trobats

// Capçaleres 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 "<div class='table-wrapper'>";
      echo "<table border='1' cellpadding='5'>";
      echo "<tr>";
      foreach (array_keys($result[0]) as $col) {
             if ($col !== 'arxiu') echo "<th>" . htmlspecialchars($col) . "</th>"; // Evitem mostrar la columna amb el contingut binari de l'arxiu
      }
      echo "<th>PDF</th>"; // Columna per descarregar PDF
      echo "</tr>";


// Comença la mostra de registres foreach ($result as $fila) { // Per cada registre (que s'identificarà com a $fila) dins de result

        echo "<tr>"; // Es crea una fila
        foreach ($fila as $col => $valorCol) { // Per cada columna (identificat com a $col) dins de la fila. El valor de cada columna s'identifica com a $valorCol
              if ($col !== 'arxiu') { // Mentre el nom de la columna no sigui "arxiu" (// Evitem mostrar la columna amb el contingut binari de l'arxiu)
                     echo "<td>" . htmlspecialchars($valorCol) . "</td>"; // Imprimim una cel·la amb el valor de la columna
              } 
         }

// Botó descarregar PDF echo "<td>"; // Creem una cel·la nova dins la fila pel fitxer

     if (empty($fila['arxiu']) == false ) { // Si HI HA fitxer
           echo '<a href="../php/descarregarPDF.php?id=' . $fila['id'] . '" target="_blank" class="styled-button">Descarregar PDF</a>';
           // S'imprimeix la cadena "Descarregar PDF"
           // Que porta a la pàgina ../php/descarregarPDF.php
           // La pàgina rebrà el paràmetre ID amb valor $fila['id'], és a dir, la ID del registre de la BD
            // " target="_blank" indica que s'obrirà en una nova pàgina
            // La funció de descarregarPDF.php és, segons la ID proporcionada, descarregar un PDF
     } else { // Si NO HI HA fitxer
               echo 'No hi ha fitxer';
     }
       echo "</td>"; // Es tanca la cel·la del fitxer
       echo "</tr>"; // Es tanca la fila

} echo "</table>"; echo "</div class='table-wrapper'>";

El resultat d’una cerca seria el següent, on mitjançant CSS hem pogut definir un scroll:

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