PHP Paso de datos na URL
Revisión del 08:02 26 feb 2026 de Angelfg (discusión | contribuciones)
Sumario
Paso de datos
- Unha forma de pasar información de unha páxina a outra é a través dunha URL.
- Se vos fixades cando facedes unha busca en google (por exemplo buscade 'php') na url aparecerá algo coma isto: https://www.google.es/search?q=php&ie=utf-8&oe=utf-8&client=firefox-b&gfe_rd=cr&ei=a1XgV4CmOu6s8wfuibOQAQ
- Os datos que aparecen despois do signo '?' son parámetros:?q=php&ie=utf-8&oe=utf-8
- O formato que teñen este tipo de parámetros é: param1=valor¶m2=valor&.....
- Desvantaxes:
- Calquera persoa pode ver os valores das variables polo que dito método non é moi seguro.
- O usuario pode cambiar o valor de ditas variables polo que pode suceder que o sitio amose ou faga algo diferente do permitido.
- O usuario pode obter información non actual se usa unha URL con datos non actualizados.
- O tamaño do que podemos enviar na URL está limitado (depende de cada navegador, pero pode estar entre 2KB-8KB)
- Vantaxes:
- A través da URL podemos pasar datos dunha páxina a outra sen necesidade de ter un formulario por medio (o veremos no exemplo seguinte).
- As variables que se pasan desta forma poden ser referenciadas en PHP a través da matriz global $_GET['param'].
- Vexamos un exemplo de código:
Arquivo: UD3_paso_var_Ex1_eleccion_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title></title> 8 </head> 9 <body> 10 <?php 11 printf("Mandamos un nome de película fixo na url:<a href='UD3_paso_var_Ex1_datos_pelicula.php?pelicula=SUPERMAN'>PELICULA</a>"); 12 ?> 13 </body> 14 </html>
Arquivo: UD3_paso_var_Ex1_datos_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta charset="utf-8" /> 6 <title>Exemplos de códigos php</title> 7 </head> 8 <body> 9 10 <?php 11 12 printf("A película pasada como parámetro na URL é: <b>%s</b>",$_GET['pelicula']); 13 14 15 ?> 16 </body> 17 </html>
- Podedes comprobar como se modificades a url e poñedes outra valor, premendo a tecla 'enter' para que volva a cargar a páxina aparece o novo valor posto.
Pasando caracteres especiais na URL
- O problema que podemos ter pasando valores desta forma, é que ditos valores teñan espazos en branco ou caracteres especiais.
- Para poder pasar estes valores podemos facer uso da urlencode.
- Para facer a función inversa: urldecode. Pero isto non é necesario no caso de asinar o valor a unha variable na segunda páxina.
- Vexamos unha modificación do código anterior, pasando un nome de película con espazos:
Arquivo: UD3_paso_var_Ex1_eleccion_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title></title> 8 </head> 9 <body> 10 <?php 11 $pelicula=urlencode("E.T. El extraterrestre"); 12 echo "Mandamos un nome de película fixo na url:" 13 . sprintf("<a href='UD3_paso_var_Ex1_datos_pelicula.php?pelicula=%s'>PELICULA</a>",$pelicula); 14 ?> 15 </body> 16 </html>
Arquivo: UD3_paso_var_Ex1_datos_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta charset="utf-8" /> 6 <title>Exemplos de códigos php</title> 7 </head> 8 <body> 9 10 <?php 11 12 // $pelicula=htmlentities($_GET['pelicula']); => Mellor con htmlspecialchars 13 $pelicula = htmlspecialchars($_GET['pelicula'], ENT_QUOTES, 'UTF-8'); 14 echo "A película pasada como parámetro na URL é: <b>$pelicula</b>"; 15 16 ?> 17 </body> 18 </html>
- O resultado:
- Por un lado a URL: http://localhost/PhpOlaMundo/UD3_paso_var_Ex1_datos_pelicula.php?pelicula=E.T.+El+extraterrestre
- Como vemos cambiamos o carácter espazo en branco por un +.
- O que visualiza o usuario na páxina: A película pasada como parámetro na URL é: E.T. El extraterrestre
- Vexamos agora un exemplo de código de decodificación dunha cadea:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta charset="utf-8" /> 6 <title>Exemplos de códigos php</title> 7 </head> 8 <body> 9 10 <?php 11 12 $cadeaCodificada="<br/>Espero + que + isto + se lea + ben"; 13 echo $cadeaCodificada; 14 echo urldecode($cadeaCodificada); 15 16 ?> 17 </body> 18 </html>
- Dará como resultado:
Espero + que + isto + se lea + ben Espero que isto se lea ben Teño un teléfono
- Nota: Tamén é posible codificar a cadea utilizando a función rawurlencode.
- Neste caso utiliza unha codificación segundo o estándar RFC3986. Os espazo en branco son codificados con %20, por exemplo.
- Un uso bastante habitual é de pasar datos relacionados con datos gardados nunha base de datos, no que queiramos obter información detallada sobre un produto.
- Imaxinemos o caso de que temos gardada na base de datos os nosos produtos desta forma:
Código - Nome- Descrición - Resto de campos 0 - Tomates - Tomates da horta. Ecolóxicos,.... - url da imaxe - resto de campos 1 - Coliflor - Coliflor da horta. Ecolóxicos,.... - url da imaxe - resto de campos
- Se fago unha consulta á base de datos pode recuperar a información do código e o nome e amosalo en forma de lista sendo cada elemento da lista un enlace a unha páxina no que amosarei o resto de campos:
<a href='detalleProduto.php?codigo=0'>Tomates</a> <a href='detalleProduto.php?codigo=1'>Coliflor</a>
- Como vemos, podemos enviar na URL o código do produto para así, cando o control chegue á páxina detalleProduto.php podemos obter có array global $_GET o código do produto e facer unha consulta á base de datos para obter a información do resto de campos do produto.
- IMPORTANTE: Se empregamos esta forma de paso de información temos que ter en conta que calquera pode cambiar o código e vería a información do produto asociado a dito código. Se non queremos que pase isto, teríamos que comprobar se a persoa que fai a solicitude ten permiso para ver o código enviado. Outra forma sería empregar un formulario en cada produto da lista empregando un código único evitando ataques CSRF.
Paso de datos con Location
- Lembrar que xa vimos nun punto anterior que podemos redireccionar e cargar outra páxina con header('Location: https://www.paxina.es'). Nesa operación poderíamos enviar datos como acabamos de explicar.
Exercicio Proposto
- Vexamos un exemplo de validación de datos empregando un formulario.
- A situación é a seguinte:
- Páxina alta_alumno.php no que recollemos o nome e data de nacemento dun alumno.
- Dita páxina chama a procesar_alta.php empregando post no action.
- En caso de que procesar_alumno.php atope problemas, amosaremos en forma de lista desordenada todos os problemas atopados.
- Páxina procesar_alumno.php:
- Se verifica que os datos foran enviados e que no nome ten 5 caracteres mínimo e que a lo menos se teña 10 anos de idade.
- Cada un dos erros se garda nun array o cal debe ser enviado na url da forma apropiada (pola URL non se pode enviar arrays, teredes que convertilo a cadea, por exemplo con implode)
- En caso de non cumprir as condicións, cargarase a páxina de alta amosando os erros que se atopen en forma de lista.
- Se todo foi ben, amosaremos a páxina xestion_alumno.php.
- Páxina xestion_alumno.php
- No que amosaremos o nome e data de nacemento do alumno.
- Podedes facer que a visualización dos erros se fagan nun arquivo separado e facer o include de dito arquivo na páxina de alta_alumno.php
Solución Exercicio Proposto
- Páxina alta_alumno.php
<?php // A páxina de procesar envía na URL os posibles erros empregando implode $errores = []; if (isset($_GET['errores'])) { $errores = explode('|', $_GET['errores']); } ?> <!DOCTYPE html> <html lang="gl"> <head> <meta charset="UTF-8"> <title>Alta alumno</title> </head> <body> <h2>Alta de alumno</h2> <!-- A páxina de procesar envía na URL os posibles erros empregando implode --> <?php if (!empty($errores)) : ?> <ul style="color:red;"> <?php foreach ($errores as $e) : ?> <li><?= htmlspecialchars($e) ?></li> <?php endforeach; ?> </ul> <?php endif; ?> <?php // Calculamos a data máxima posible: hoxe menos 10 anos $maxDate = date("Y-m-d", strtotime("-10 years")); ?> <form action="procesar_alumno.php" method="post"> Nome: <input type="text" name="nombre" minlength="5" required><br><br> Data nacemento: <input type="date" name="fecha" required max="<?= $maxDate ?>"><br><br> <input type="submit" value="Enviar"> </form> </body> </html>
- Páxina procesar_alta.php
<?php // procesar_alumno.php $errores = []; // Comprobación individual dos campos if (!isset($_POST['nombre'])) { $errores[] = "Non se recibiu o nome."; } if (!isset($_POST['fecha'])) { $errores[] = "Non se recibiu a data de nacemento."; } // Se ambos existen, validámolos if (isset($_POST['nombre'])) { $nombre = trim($_POST['nombre']); if (strlen($nombre) < 5) { $errores[] = "O nome debe ter polo menos 5 caracteres."; } } if (isset($_POST['fecha'])) { $fecha = $_POST['fecha']; if ($fecha === "") { $errores[] = "Debe indicar unha data de nacemento."; } else { $nac = new DateTime($fecha); $hoxe = new DateTime(); $idade = $hoxe->diff($nac)->y; if ($idade < 10) { $errores[] = "O alumno debe ter polo menos 10 anos."; } } } // Se hai erros volve ao formulario de alta con erros na url separados por | if (!empty($errores)) { $cadena = implode('|', $errores); header("Location: alta_alumno.php?errores=$cadena"); exit; } // Todo correcto header( "Location: xestion_alumno.php?nombre=" . urlencode($nombre) . "&fecha=" . urlencode($fecha) ); exit;
- Páxina xestion_alumno.php
<?php // xestion_alumno.php $nombre = $_GET['nombre'] ?? 'Descoñecido'; $fecha = $_GET['fecha'] ?? '---'; ?> <!DOCTYPE html> <html lang="gl"> <head> <meta charset="UTF-8"> <title>Xestión do alumno</title> </head> <body> <h2>Alumno rexistrado correctamente</h2> <p><strong>Nome:</strong> <?= htmlspecialchars($nombre) ?></p> <p><strong>Data de nacemento:</strong> <?= htmlspecialchars($fecha) ?></p> </body> </html>
-- Ángel D. Fernández González -- (2025).