PHP Paso de datos con formularios

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introdución

  • Cando programamos pode darse o caso de que teñamos código (en forma de funcións, variables, constantes, clases ou bloques de código) que teñamos que utilizar en moitas páxinas distintas.
  • Nestes casos é conveniente ter o código gardado nun arquivo separado e poder incorporalo cando o necesitemos.
  • En PHP podemos facelo coas construcións da linguaxe: include, include_once, require e require_once.


include

  • Sintaxe:
include '[path/]arquivo.php';
  • A sentenza include inclúe e avalía o arquivo especificado.
  • O camiño pode ser absoluto ou relativo. Para evitar problemas coa resolución de rutas é recomendable construír a ruta tomando como referencia o directorio do arquivo PHP actual mediante a constante máxica __DIR__.
Por exemplo:
include __DIR__ . '/utilidades/arquivo.php';
  • Antigamente empregábase con frecuencia a extensión .inc.php para este tipo de arquivos, pero actualmente podemos empregar directamente a extensión .php.
  • O código PHP do arquivo incluído debe atoparse entre etiquetas PHP.
Se o arquivo contén unicamente código PHP, é recomendable empregar a etiqueta de apertura <?php e omitir a etiqueta de peche ?> ao final do arquivo.
Desta forma evitamos que espazos ou saltos de liña situados accidentalmente despois da etiqueta de peche produzan unha saída non desexada.
  • Vexamos un exemplo:
Arquivo: FuncionsExternas.php
 1 <?php
 2 
 3 /**
 4  * Crea un array cun número específico de elementos inicializados a null.
 5  *
 6  * @param int $numElementos Número de elementos que terá o array.
 7  *
 8  * @return array Array co número de elementos indicado, todos con valor null.
 9  */
10 function crearArray(int $numElementos): array
11 {
12     $array = [];
13 
14     for ($cont = 0; $cont < $numElementos; $cont++) {
15         $array[$cont] = null;
16     }
17 
18     return $array;
19 }
Arquivo: ReutilizandoCodigo.php
 1 <!DOCTYPE html>
 2 <html lang="gl">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Exemplos de código PHP</title>
 6 </head>
 7 <body>
 8 <?php
 9 include __DIR__ . '/FuncionsExternas.php';
10 
11 $datos = crearArray(10);
12 
13 foreach ($datos as $clave => $dato) {
14     printf(
15         "Clave:%d - Valor:%s<br>",
16         $clave,
17         $dato === null ? 'Sen dato' : $dato
18     );
19 }
20 ?>
21 </body>
22 </html>
  • As funcións e clases definidas nun arquivo incluído teñen ámbito global.
  • No caso das variables, o arquivo incluído herda o ámbito do punto no que se realiza a inclusión.
Por exemplo, se facemos un include dentro dunha función, as variables definidas no arquivo incluído pertencerán ao ámbito desa función.
  • Cando fagamos unha aplicación con acceso a base de datos teremos que gardar información sensible, como datos de conexión.
É recomendable gardar este tipo de información nun arquivo situado fóra da ruta pública do servidor web.
Imaxinemos que o servidor web publica por defecto o cartafol:
/var/www/html
Poderiamos gardar a configuración, por exemplo, en:
/var/www/configuracions/informacionbd.php
Desta forma, coa configuración habitual do servidor web, ese arquivo non poderá solicitarse directamente mediante unha URL.


include_once

  • Sintaxe:
include_once '[path/]arquivo.php';
  • include_once ten o mesmo comportamento que include, pero PHP comproba se o arquivo xa foi incluído previamente. Se xa foi incluído, non o volve procesar.
  • Isto é especialmente útil cando o arquivo define funcións, clases ou constantes, xa que incluílo máis dunha vez podería provocar erros por declaracións duplicadas.
  • Debemos escoller entre include e include_once en función de se queremos permitir ou non que o mesmo arquivo sexa procesado máis dunha vez.
  • Pode darse o caso, por exemplo, cando facemos inclusións condicionais dentro dun if, de que un arquivo xa fose cargado previamente.
  • Os arquivos incluídos tamén poden utilizarse para gardar elementos comúns a varias páxinas web, como unha cabeceira, un menú ou un pé de páxina.
Desta forma, se necesitamos modificar un elemento común, soamente teremos que facelo nun único arquivo.
  • En PHP existe outra forma de organizar os elementos comúns empregando un modelo ou patrón MVC.
Podedes consultalo neste enlace da WIKI.


require

  • Sintaxe:
require '[path/]arquivo.php';
  • require fai o mesmo que include, pero existe unha diferenza importante cando non se pode cargar o arquivo:
  • include produce un aviso de tipo E_WARNING e a execución do script pode continuar.
  • require produce un erro de tipo Error. Se non se trata, a execución do script interrómpese.
  • Por este motivo empregaremos normalmente require cando o arquivo sexa imprescindible para que a aplicación poida funcionar.

Exemplo con include

 1 <!DOCTYPE html>
 2 <html lang="gl">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Exemplo con include</title>
 6 </head>
 7 <body>
 8 <?php
 9 include __DIR__ . '/FuncionsExternasNonExiste.php';
10 
11 echo 'Isto aparece porque include permite continuar a execución.';
12 ?>
13 </body>
14 </html>
Se o arquivo non existe, aparecerá un warning, pero a execución poderá continuar.

Exemplo con require

 1 <!DOCTYPE html>
 2 <html lang="gl">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Exemplo con require</title>
 6 </head>
 7 <body>
 8 <?php
 9 require __DIR__ . '/FuncionsExternasNonExiste.php';
10 
11 echo 'Esta instrución non chegará a executarse se o erro non é tratado.';
12 ?>
13 </body>
14 </html>
Neste caso, ao ser o arquivo obrigatorio, a execución interrómpese se non pode cargarse e o erro non é tratado.


require_once

  • Sintaxe:
require_once '[path/]arquivo.php';
  • Ten o mesmo comportamento que require, pero se o arquivo xa foi incluído previamente non se volverá incluír.
  • É especialmente útil cando:
  • o arquivo é obrigatorio para o funcionamento da aplicación;
  • non sabemos con certeza se xa foi cargado previamente;
  • o arquivo define funcións, clases ou constantes que non deben declararse máis dunha vez.
Resumo:
Sentenza O arquivo é obrigatorio Evita incluílo máis dunha vez
include Non Non
include_once Non Si
require Si Non
require_once Si Si


Configuración da visualización e rexistro de erros

  • Durante o desenvolvemento é importante detectar e corrixir erros, warnings e mensaxes de depreciación.
  • Nun servidor de produción, pola contra, non debemos amosar directamente os erros ao usuario, xa que poden revelar información interna da aplicación ou do servidor.

Entorno de desenvolvemento

  • Durante o desenvolvemento podemos pedir a PHP que informe de todos os erros:
error_reporting(E_ALL);
ini_set('display_errors', '1');
  • E_ALL indica que queremos recibir todos os erros, warnings, notices e mensaxes de depreciación configuradas por PHP.

Entorno de produción

  • Nun entorno de produción é recomendable non amosar os erros ao usuario e gardalos no rexistro do servidor.
Unha configuración típica no arquivo php.ini sería:
display_errors = Off
log_errors = On
error_reporting = E_ALL
  • Desta forma os erros seguirán rexistrándose, pero non se amosarán directamente na páxina web.

Máscaras de erros

  • PHP tamén permite combinar constantes de erros mediante operadores a nivel de bits.
Por exemplo:
// Erros, warnings e erros de análise.
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Todos os erros excepto E_NOTICE.
error_reporting(E_ALL & ~E_NOTICE);
Aínda que esta posibilidade existe, durante o desenvolvemento empregaremos normalmente:
error_reporting(E_ALL);

A través do arquivo .htaccess

  • Se PHP se executa como módulo de Apache e a configuración do servidor o permite, é posible modificar determinadas opcións de PHP mediante o arquivo .htaccess.
Por exemplo:
php_value error_reporting 2147483647
php_flag display_errors On
  • Esta forma de configuración non é válida para todas as formas de executar PHP.
Por exemplo, cando PHP se executa mediante CGI/FastCGI poden empregarse arquivos .user.ini para determinadas opcións de configuración.


Colocar arquivos sensibles

  • Veremos nas seguintes unidades que teremos que gardar información sensible en certos arquivos PHP, como os datos necesarios para conectarnos a unha base de datos.
  • Podemos definir esa información nun arquivo PHP, por exemplo informacionbd.php, e incorporalo mediante require ou require_once nas páxinas que necesiten utilizalo.
  • Para evitar que este tipo de arquivos poidan solicitarse directamente desde o navegador, é recomendable situalos fisicamente fóra do DocumentRoot do servidor web.
Por exemplo, se Apache publica:
/var/www/html
podemos gardar o arquivo de configuración en:
/var/www/configuracions/informacionbd.php
  • Ademais, debemos:
  • configurar correctamente os permisos do arquivo;
  • evitar gardar contrasinais ou credenciais en repositorios públicos;
  • permitir o acceso unicamente ao usuario ou servizo que realmente o necesite.


Exercicios propostos

  • Exercicio 1: Define nun arquivo externo dentro dun cartafol de nome utilidades dúas funcións:
  • unha función que, a partir dunha cadea, engada dita cadea a un array se non existe previamente;
  • outra función que, dado un array, devolva unha copia do array recibido.
Xera unha páxina que faga uso das funcións do arquivo anterior. O arquivo é obrigatorio para o funcionamento da páxina.


  • Exercicio 2: Define nun arquivo externo de nome utilidades2.php, dentro do cartafol utilidades, as seguintes constantes:
  • NUM_ELEMENTOS igual a 3;
  • IDADE_MAIOR igual a 18.
Crea tamén unha función que, dado un array numérico, comprobe que o número de elementos do array sexa superior a NUM_ELEMENTOS.
Se non se cumpre esta condición, a función debe devolver false.
En caso contrario, debe devolver un array cos elementos que sexan maiores que IDADE_MAIOR. Se ningún elemento cumpre a condición, debe devolver false.
Crea unha páxina de exemplo de uso da función anterior, tendo en conta que a páxina pode xerarse dinamicamente e non sabemos se o arquivo foi incluído previamente. A páxina necesita cargar obrigatoriamente o arquivo utilidades2.php.


Solución Exercicios propostos

  • Solución Exercicio 1
Páxina utilidades/utilidades1.php
<?php

/**
 * Engade unha cadea ao array se non existe xa.
 *
 * @param array  &$array Array onde se engadirá a cadea.
 * @param string $cadea  Cadea de texto a engadir.
 *
 * @return void
 */
function engadirCadeaAoArray(array &$array, string $cadea): void
{
    if (!in_array($cadea, $array, true)) {
        $array[] = $cadea;
    }
}

/**
 * Devolve unha copia dun array.
 *
 * En PHP os arrays asígnanse por valor. Polo tanto, devolver o array
 * permite obter unha copia que pode modificarse sen alterar o array orixinal.
 *
 * @param array $array Array que se quere copiar.
 *
 * @return array Copia do array recibido.
 */
function copiarArray(array $array): array
{
    return $array;
}
Páxina exercicio1_include.php
<!DOCTYPE html>
<html lang="gl">
<head>
    <meta charset="UTF-8">
    <title>Exemplo PHP en Galego</title>
</head>
<body>
<?php
require __DIR__ . '/utilidades/utilidades1.php';

$meuArray = [];

// Engadir cadeas ao array.
engadirCadeaAoArray($meuArray, 'Ola');
engadirCadeaAoArray($meuArray, 'Mundo');
engadirCadeaAoArray($meuArray, 'Ola'); // Xa existe e non se engadirá de novo.

// Copiar o array.
$copiaArray = copiarArray($meuArray);

echo '<h2>Array orixinal:</h2>';
echo '<pre>';
print_r($meuArray);
echo '</pre>';

echo '<h2>Copia do array:</h2>';
echo '<pre>';
print_r($copiaArray);
echo '</pre>';
?>
</body>
</html>


  • Solución Exercicio 2
Páxina utilidades/utilidades2.php
<?php

const NUM_ELEMENTOS = 3;
const IDADE_MAIOR = 18;

/**
 * Comproba as idades dun array e devolve os elementos que superen un límite.
 *
 * @param array $array Array de números (idades) a comprobar.
 *
 * @return array|false Devolve un array cos elementos maiores que IDADE_MAIOR
 *                     ou false se non se cumpren as condicións.
 */
function comprobarIdade(array $array): array|false
{
    $elementosCumpridos = [];

    if (count($array) <= NUM_ELEMENTOS) {
        return false;
    }

    foreach ($array as $idade) {
        if ($idade > IDADE_MAIOR) {
            $elementosCumpridos[] = $idade;
        }
    }

    return $elementosCumpridos !== [] ? $elementosCumpridos : false;
}
Páxina exercicio2_include.php
<!DOCTYPE html>
<html lang="gl">
<head>
    <meta charset="UTF-8">
    <title>Exemplo PHP en Galego</title>
</head>
<body>
<?php
require_once __DIR__ . '/utilidades/utilidades2.php';

$idades = [2, 62, 2, 2, 2]; // Soamente 62 cumpre a condición.

$resultado = comprobarIdade($idades);

if ($resultado !== false) {
    echo '<h2>Idades que cumpren a condición:</h2>';
    echo '<ul>';

    foreach ($resultado as $idade) {
        echo "<li>$idade anos</li>";
    }

    echo '</ul>';
} else {
    echo '<h2>Ningunha idade cumpre a condición</h2>';
}
?>
</body>
</html>


-- Ángel D. Fernández González -- (2026).