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¶
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
Si volem guardar-hi valors els separem entre comes al moment d'assignar.
Ara la taula té 3 valors de tipus string.
De manera bàsica accedim a la informació amb índexs de posicions.
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:
Per accedir al nom fariem:
Ens mostrarà el valor de "Soler"
Podem fer arrays multidimensionals per guardar, per exemple, valors de varis alumnes d'un grups:
Per accedir al nom del 2n alumne:
Ens mostrarà el valor de "Laia"
Podem fer arrays multidimensionals associatius
Ara per saber el nom del fill fariem:
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:
o fer servir la funció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>
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
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¶
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 formatnom=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 scriptproducte.php
podrà accedir a les variablesid
icategoria
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
:
$_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 directivavariables_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.
$_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: