Salta el contingut

Desenvolupament web dinàmic backend amb PHP
Conceptes

Sessió 5: Arrays / Superglobals

Objectiu Sessió 5

L'objectiu d'aquesta sessió serà la d'aprendre a utilitzar els arrays o taules amb php per a emmagatzemar i gestionar múltiples valors sota un únic identificador de variable. Això permetrà ampliar la lògica del contingut de dades a gestionar per generar major dinamisme des de backend. Les Variables superglobals treballen sota el paraigües dels arrays per gestionar-les.

Arrays

Enllaç a W3Schools i PHP.net

Una taula és una estructura de dades que permet desar informació composta. Pot contenir informació indexada amb diferents valors de diferents tipus (integers, floats, strings, booleans, altres arrays, objectes, etc.).

Pensa en un array com una llista ordenada d'elements, on cada element pot ser una dada. Aquesta llista té una manera d'identificar cada element per poder accedir-hi o manipular-lo.

Gestió bàsica

per definir un array fem

1
2
3
<?php
    $dades = array();
?>

Si volem guardar-hi valors els separem entre comes al moment d'assignar.

1
2
3
<?php
    $noms = array("Judit", "Laia", "Marc");
?>

Ara la taula té 3 valors de tipus string.

De manera bàsica accedim a la informació amb índexs de posicions.

1
2
3
<?php
    echo $noms[0];
?>

Ens mostrarà el valor de "Judit"

Tipus d'arrays

Tenim 3 tipus d'arrays:

  • indexats: Els elements estan associats a un índex numèric, que comença automàticament per 0 (zero) per al primer element i s'incrementa seqüencialment per als elements següents.
  • Associatius: Els elements estan associats a claus que són strings (o també poden ser integers, però l'ús més comú és amb strings). Aquestes claus actuen com a identificadors personalitzats per a cada valor. Són similars als diccionaris o mapes en altres llenguatges de programació.
  • Multidimensional: Són arrays que contenen un o més altres arrays com a elements. Això permet representar estructures de dades més complexes, com taules o matrius.

Per guardar un valor associat a una clau fem:

1
2
3
4
5
<?php
    // clau => valor

    $alumne = array("nom" => "Judit", "cognoms" => "Soler");
?>

Per accedir al nom fariem:

1
2
3
<?php
    echo $alumne["cognom"];
?>

Ens mostrarà el valor de "Soler"

Podem fer arrays multidimensionals per guardar, per exemple, valors de varis alumnes d'un grups:

1
2
3
4
5
<?php
    $alumnes = array( array("nom" => "Judit", "cognoms" => "Soler"),
                      array("nom" => "Laia", "cognoms" => "Soler"),
                      array("nom" => "Marc", "cognoms" => "Martinez") );
?>

Per accedir al nom del 2n alumne:

1
2
3
<?php
    echo $alumnes[1]["nom"];
?>

Ens mostrarà el valor de "Laia"

Podem fer arrays multidimensionals associatius

1
2
3
4
5
<?php
    $dades = array( "pare" => array("nom" => "Pere", "cognoms" => "Soler"),
                    "mare" => array("nom" => "Laia", "cognoms" => "Martinez"),
                    "fill" => array("nom" => "Marc", "cognoms" => "Soler Martinez") );
?>

Ara per saber el nom del fill fariem:

1
2
3
<?php
    echo $dades["fill"]["nom"];
?>

Ens mostrarà el nom de "Marc"

Com ho fem per...

recorrer tots els valors d'un array podem usar for o foreach

dividir en un array un string, segons un criteri

Característiques principals dels arrays en PHP

Característiques principals dels arrays en PHP:

  • Poden contenir múltiples valors: Aquesta és la seva característica definidora.
  • Els valors poden ser de diferents tipus: Un mateix array pot barrejar integers, strings, etc.
  • Són dinàmics: La seva mida pot créixer o disminuir segons sigui necessari durant l'execució del script.
  • Es poden indexar numèricament o associativament: Ofereixen flexibilitat en la manera d'organitzar i accedir a les dades.
  • Poden ser multidimensionals: Permeten representar estructures de dades amb més d'una dimensió.

Funcions de PHP

Hi ha un llista de funcions de php disponibles per a realitzar diverses accions:

  • afegir valors
  • ordenar valors
  • eliminar valors
  • fusionar valors
  • ...

Podem utilitzar la sintaxi simple [ ] de creació i posterior assignació de valors, optimitza l'execució.

    $fruites = [];
    $fruites[0] = "pera";
    $fruites[1] = "poma";
    $fruites[2] = "pruna";
    $fruites[10] = "pinya";

Per exemple per a afegir un element podem usar:

<?php
    $var = "pomes";

    $array[] = $var; // això ho afageix a partir de la última possició
?>
o fer servir la funció

<?php
    $var = "pomes";
    $array[];

    array_push($array,$var);
?>

Notar que la mida d'elements de l'array és 4, els valors que no s'ha definit l'índex quedem com a no assignats.

Exemple arrays associatius

    <!DOCTYPE html>
    <html lang="ca">
    <head>
        <meta charset="UTF-8">
        <title>Tasques</title>
        <link rel="stylesheet" href="p3-s5-ex1.css">
    </head>
    <body>
    <?php   
    /*
     * Exemple de dades arrays associatius
    */

    // Definició de l'array associatiu d'alumnes d'una classe
    $classe = [
        0 => ["nom" => "Joan", "edat" => 15, "nota" => 7.5],
        1 => ["nom" => "Maria", "edat" => 16, "nota" => 8.0],
        2 => ["nom" => "Pere", "edat" => 16, "nota" => 8.5],
        3 => ["nom" => "Anna", "edat" => 15, "nota" => 9.0],
        4 => ["nom" => "Jordi", "edat" => 17, "nota" => 6.5],
    ];

    // Mostrem els alumnes de la classe
    echo "<h2>Alumnes de la classe</h2>";
    echo "<table id='alumnes'>";
    echo "<tr><th>Nom</th><th>Edat</th><th>Nota</th></tr>"; 
    foreach ($classe as $alumne) {
        echo "<tr>";
        echo "<td>" . $alumne["nom"] . "</td>";
        echo "<td>" . $alumne["edat"] . "</td>";
        echo "<td>" . $alumne["nota"] . "</td>";
        echo "</tr>";
    }
    echo "</table>";

    // Mostrem la nota mitjana de la classe
    $notaMitjana = 0;   
    foreach ($classe as $alumne) {
        $notaMitjana += $alumne["nota"];
    }
    $notaMitjana /= count($classe); 
    echo "<h2>Nota mitjana de la classe: " . number_format($notaMitjana, 2) . "</h2>";  

    // Mostrem el nom de l'alumne amb la millor nota
    $millorNota = 0;    
    $millorAlumne = "";
    foreach ($classe as $alumne) {
        if ($alumne["nota"] > $millorNota) {
            $millorNota = $alumne["nota"];
            $millorAlumne = $alumne["nom"];
        }
    }   
    echo "<h2>Millor alumne: " . $millorAlumne . " amb una nota de " . number_format($millorNota, 2) . "</h2>";
    ?>

    </body>
    </html>
    #alumnes
    {
      background-color: #ffffff;
      border: 1px solid #ccc;
      padding: 5px;
      border-radius: 5px;
    }

    #alumnes th
    {
      background-color: #f8f9fa;
      color: #333;
      padding: 10px;
    }
    #alumnes td
    {
      padding: 10px;
      border-bottom: 1px solid #ddd;
    }

    h2
    {
      color: #333;
      font-size: 1.5em;
      margin-bottom: 10px;
    }

Tenim l'array de base

$classe = [
    0 => ["nom" => "Joan", "edat" => 15, "nota" => 7.5],
    1 => ["nom" => "Maria", "edat" => 16, "nota" => 8.0],
    2 => ["nom" => "Pere", "edat" => 16, "nota" => 8.5],
    3 => ["nom" => "Anna", "edat" => 15, "nota" => 9.0],
    4 => ["nom" => "Jordi", "edat" => 17, "nota" => 6.5],
];

Tenim 5 entrades indexades (tot i que no caldria, ja ho faria sol) amb dades corresponents a uns alumnes on hi guardem de manera associativa el nom, l'edat i la nota.

Per tant l'alumne 1r té el nom $classe[0]["nom"] ---> Joan

Notem com els valors són de diferent tipus de dades.

El que farem serà maquetar una petita taula html estilitzada amb un css

    <table id='alumnes'>
        <th>
            <td>

Tot seguit farem un recorregut per calcular la nota mitjana de tots els alumnes

    // Mostrem la nota mitjana de la classe
    $notaMitjana = 0;   
    foreach ($classe as $alumne) {
        $notaMitjana += $alumne["nota"];
    }
    $notaMitjana /= count($classe); 
    echo "<h2>Nota mitjana de la classe: " . number_format($notaMitjana, 2) . "</h2>";  

Ens va molt bé la utilització del foreach de php per aquests casos.

I ara calculem la nota més alta, guardant el nom de l'alumne

    // Mostrem el nom de l'alumne amb la millor nota
    $millorNota = 0;    
    $millorAlumne = "";
    foreach ($classe as $alumne) {
        if ($alumne["nota"] > $millorNota) {
            $millorNota = $alumne["nota"];
            $millorAlumne = $alumne["nom"];
        }
    }   
    echo "<h2>Millor alumne: " . $millorAlumne . " amb una nota de " . number_format($millorNota, 2) . "</h2>";

Superglobals

Enllaç a W3Schools i PHP.net

Les superglobals en PHP són un conjunt de variables predefinides que estan disponibles en tots els àmbits d'un script PHP. Això significa que pots accedir a aquestes variables des de qualsevol lloc del teu codi: dins de funcions, dins de classes, i en l'àmbit global, sense necessitat de declarar-les com a global explícitament.

També les tindrem accessibles a totes les pàgines .php que usem en el mateix concepte de sessió de navegació. sobretot la variable $_SESSION.

La característica principal de les superglobals és la seva accessibilitat global automàtica. A diferència de les variables normals en PHP, que tenen un àmbit (scope) limitat a la funció o bloc on es defineixen, les superglobals estan sempre a la teva disposició.

En general, les superglobals s'estructuren com a arrays associatius. Això vol dir que cada superglobal és una col·lecció de parells clau-valor, on la clau és un nom (generalment una cadena de text) que identifica la informació, i el valor és la dada associada a aquesta clau.

$_GET

  • Propòsit: Emmagatzema les variables que s'envien a través de la URL mitjançant el mètode HTTP GET. Aquest mètode és visible a la barra d'adreces del navegador i s'utilitza sovint per passar paràmetres no sensibles o per compartir enllaços amb certs filtres o opcions.
  • Funcionament: Les variables s'afegeixen a la URL després del signe de preguntació (?), amb el format nom=valor. Si hi ha múltiples variables, es separen amb el signe d'ampersand (&).
  • Exemple: Si un usuari visita la URL http://example.com/producte.php?id=123&categoria=llibres, el script producte.php podrà accedir a les variables id i categoria mitjançant $_GET:

    <?php
        $producte_id = $_GET['id']; // $producte_id contindrà "123"
        $categoria = $_GET['categoria']; // $categoria contindrà "llibres"
    
        echo "ID del producte: " . htmlspecialchars($producte_id) . "<br>";
        echo "Categoria: " . htmlspecialchars($categoria);
    ?>
    

    Warning

    És important utilitzar htmlspecialchars() per evitar vulnerabilitats de Cross-Site Scripting (XSS) quan es mostren dades proporcionades per l'usuari.

$_POST

  • Propòsit: Emmagatzema les variables que s'envien a través del cos de la petició HTTP mitjançant el mètode HTTP POST. Aquest mètode no mostra les dades a la URL i s'utilitza generalment per enviar informació més sensible (com credencials de login) o grans quantitats de dades (com la informació d'un formulari llarg).
  • Funcionament: Les dades s'envien en segon pla amb la petició HTTP.
  • Exemple: Considerem un formulari HTML senzill:

    <form action="processa_formulari.php" method="post">
        <label for="nom">Nom:</label><br>
        <input type="text" id="nom" name="nom"><br>
        <label for="email">Email:</label><br>
        <input type="email" id="email" name="email"><br><br>
        <input type="submit" value="Enviar">
    </form>
    

    Al script processa_formulari.php, es podrà accedir a les dades enviades mitjançant $_POST:

    <?php
        $nom = $_POST['nom']; // $nom contindrà el valor del camp "nom"
        $email = $_POST['email']; // $email contindrà el valor del camp "email"
    
        echo "Nom rebut: " . htmlspecialchars($nom) . "<br>";
        echo "Email rebut: " . htmlspecialchars($email);
    ?>
    

$_REQUEST

  • Propòsit: Conté el contingut de $_GET, $_POST i $_COOKIE.
  • Funcionament: PHP fa una fusió de les dades d'aquestes tres superglobals en $_REQUEST. L'ordre en què es prioritzen les fonts de dades (GET, POST, COOKIE) està determinat per la directiva variables_order al fitxer de configuració php.ini.
  • Consideracions: Tot i que pot semblar convenient, l'ús de $_REQUEST es desaconsella generalment per motius de seguretat i claredat. No permet saber amb certesa d'on prové una variable (si de la URL, del cos del formulari o d'una cookie), cosa que pot facilitar atacs i dificultar la depuració. És millor utilitzar $_GET o $_POST explícitament segons el mètode HTTP esperat, i $_COOKIE per a les cookies.

$_SERVER

  • Propòsit: Conté informació sobre el servidor web i l'entorn d'execució del script PHP.
  • Funcionament: És un array associatiu amb una gran quantitat de claus que proporcionen diversos detalls.
  • Exemples d'ús comú:

    • $_SERVER['PHP_SELF']: El nom del script actual en relació amb el directori root del document.
    • $_SERVER['SERVER_NAME']: El nom del host del servidor.
    • $_SERVER['SERVER_ADDR']: L'adreça IP del servidor.
    • $_SERVER['REQUEST_METHOD']: El mètode de la petició HTTP (GET, POST, etc.).
    • $_SERVER['QUERY_STRING']: La cadena de consulta de la URL (la part després del ?).
    • $_SERVER['HTTP_USER_AGENT']: Informació sobre el navegador de l'usuari.
    • $_SERVER['REMOTE_ADDR']: L'adreça IP del client que està veient la pàgina actual.
    <?php
        echo "Nom del script actual: " . $_SERVER['PHP_SELF'] . "<br>";
        echo "Mètode de la petició: " . $_SERVER['REQUEST_METHOD'] . "<br>";
        echo "Adreça IP del client: " . $_SERVER['REMOTE_ADDR'] . "<br>";
    ?>
    

$_SESSION

  • Propòsit: Permet emmagatzemar variables de sessió per a un usuari específic al llarg de múltiples peticions. Les dades de sessió es mantenen al servidor i s'associen a un identificador de sessió únic que es guarda en una cookie al navegador de l'usuari (per defecte).
  • Funcionament: Per utilitzar sessions, primer s'ha d'iniciar o reprendre una sessió amb la funció session_start() al principi del script. Després, es poden assignar i accedir a variables a l'array $_SESSION.
  • Exemple:

    <?php
    session_start();
    
    // Assignar una variable de sessió
        $_SESSION['usuari_id'] = 123;
        $_SESSION['nom_usuari'] = "Joan";
    
        // Accedir a variables de sessió en una altra pàgina (després de cridar session_start())
        echo "ID d'usuari de la sessió: " . $_SESSION['usuari_id'] . "<br>";
        echo "Nom d'usuari de la sessió: " . $_SESSION['nom_usuari'] . "<br>";
    
        // Per destruir la sessió:
        // session_destroy();
    ?>
    

    Info

    La sessió 7 serà específica sobre Sessions !

$_COOKIE

  • Propòsit: Emmagatzema les cookies que han estat enviades pel servidor al navegador de l'usuari i que el navegador ha retornat amb la petició actual. Les cookies s'utilitzen per recordar informació sobre l'usuari entre diferents visites al lloc web.
  • Funcionament: Les cookies es defineixen al servidor mitjançant la funció setcookie() i s'envien en les capçaleres HTTP de la resposta. El navegador les guarda i les envia amb les peticions posteriors al mateix domini o camí.
  • Exemple:

    <?php
        // Definir una cookie que expira en 30 dies
        $titol = "Benvingut de nou!";
        setcookie("darrer_titol_vist", $titol, time() + (86400 * 30), "/"); // 86400 segons en un dia
    
        // Accedir a una cookie
        if(isset($_COOKIE['darrer_titol_vist'])) {
            echo "El darrer títol que vas veure va ser: " . htmlspecialchars($_COOKIE['darrer_titol_vist']);
        } else {
            echo "Aquesta és la teva primera visita.";
        }
    ?>
    

    Info

    Aquest curs no treballarem més aquest concepte.

    Tot i que és molt utilitzat en les aplicacions web per gestionar informacions i configuracions de la banda de client.

    Hi ha un aspecte legal que cal tenir present i per aquest motiu cal demanar-ne el seu consentiment.

$_FILES

  • Propòsit: Emmagatzema informació sobre els fitxers que s'han pujat a través d'un formulari HTML amb l'atribut enctype="multipart/form-data".
  • Funcionament: Quan s'envia un formulari amb pujada de fitxers, per cada camp de tipus file, l'array $_FILES conté un sub-array amb informació sobre el fitxer pujat, com el nom, el tipus MIME, la mida, la ubicació temporal al servidor i un codi d'error.
  • Exemple: Considerem un formulari de pujada de fitxers:

    <form action="processa_pujada.php" method="post" enctype="multipart/form-data">
        Selecciona un fitxer per pujar:
        <input type="file" name="el_fitxer" id="el_fitxer"><br><br>
        <input type="submit" value="Pujar fitxer">
    </form>
    

    Al script processa_pujada.php:

    <?php
    if(isset($_FILES['el_fitxer'])) {
        $nom_fitxer = $_FILES['el_fitxer']['name'];
        $tipus_fitxer = $_FILES['el_fitxer']['type'];
        $mida_fitxer = $_FILES['el_fitxer']['size'];
        $tmp_nom = $_FILES['el_fitxer']['tmp_name'];
        $error = $_FILES['el_fitxer']['error'];
    
        if ($error === UPLOAD_ERR_OK) {
            // Mou el fitxer pujat de la ubicació temporal a una ubicació permanent
            $destinacio = 'uploads/' . $nom_fitxer;
            if (move_uploaded_file($tmp_nom, $destinacio)) {
                echo "Fitxer pujat amb èxit a: " . htmlspecialchars($destinacio);
            } else {
                echo "Error en moure el fitxer pujat.";
            }
        } else {
            echo "Hi ha hagut un error en la pujada del fitxer. Codi d'error: " . $error;
        }
    }
    ?>
    

$_ENV

  • Propòsit: Conté variables d'entorn del servidor. Aquestes variables són definides pel sistema operatiu o la configuració del servidor web.
  • Funcionament: El contingut d'$_ENV depèn de la configuració específica del servidor. Algunes variables comunes poden incloure la ruta d'execució, el nom d'usuari del servidor, etc.
  • Consideracions: La disponibilitat i el contingut de $_ENV poden variar significativament entre diferents entorns de servidor. Sovint, pot ser necessari configurar explícitament les variables d'entorn per a la vostra aplicació.

Info

Un exemple podria ser:

S'ha 'configurat una variable d'entorn anomenada APP_ENV per indicar l'entorn en què s'està executant l'aplicació (per exemple, development, staging, production).

    <?php

    // Accedir a la variable d'entorn APP_ENV
    $appEnvironment = getenv('APP_ENV');

    // Alternativa per accedir a través de $_ENV (menys recomanada directament)
    // $appEnvironment = $_ENV['APP_ENV'] ?? null;

    // Validar el valor de la variable d'entorn
    $allowedEnvironments = ['development', 'staging', 'production'];

    if (in_array($appEnvironment, $allowedEnvironments)) {
        echo "L'aplicació s'està executant en l'entorn: " . htmlspecialchars($appEnvironment) . "\n";

        // Utilitzar el valor de manera segura dins de l'aplicació
        if ($appEnvironment === 'development') {
            // Activar la depuració
            error_reporting(E_ALL);
            ini_set('display_errors', 1);
        } else {
            // Desactivar la depuració en entorns de producció
            error_reporting(0);
            ini_set('display_errors', 0);
        }

    } else {
        // La variable d'entorn no està definida o té un valor inesperat
        echo "Error: Entorn de l'aplicació no vàlid o no definit.\n";
        // Registrar l'error o prendre les mesures necessàries
    }

    ?>

$GLOBALS

  • Propòsit: És un array associatiu que conté referències a totes les variables que estan definides en l'àmbit global del script. Les claus d'aquest array són els noms de les variables globals.
  • Funcionament: Permet accedir a variables globals des de dins de funcions o mètodes, on normalment no serien visibles a causa de l'àmbit local.
  • Exemple:

    <?php
    $variable_global = "Aquesta és una variable global.";
    
    function mostrarGlobal() {
        // Per accedir a una variable global dins d'una funció,
        // es pot utilitzar l'array $GLOBALS
        echo $GLOBALS['variable_global'];
    }
    
    mostrarGlobal(); // Sortida: Aquesta és una variable global.
    ?>