Diferencia entre revisiones de «PHP Paso de datos na URL»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 110: Línea 110:
 
     <?php   
 
     <?php   
  
−
         $pelicula=htmlentities($_GET['pelicula']);
+
         // $pelicula=htmlentities($_GET['pelicula']); => Mellor con htmlspecialchars
 +
        $pelicula = htmlspecialchars($_GET['pelicula'], ENT_QUOTES, 'UTF-8');  
 
         echo "A película pasada como parámetro na URL é: <b>$pelicula</b>";
 
         echo "A película pasada como parámetro na URL é: <b>$pelicula</b>";
  

Revisión del 08:02 26 feb 2026

Paso de datos

  • Unha forma de pasar información de unha páxina a outra é a través dunha URL.
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&param2=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:
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).