Saltar a contenido

Acceso a ficheros

¿Es necesario acceder a ficheros en esta actividad?

En el desarrollo de aplicaciones web y bases de datos, el acceso a ficheros puede ser útil en ciertos escenarios, pero no siempre es estrictamente necesario. Antes de implementarlo, conviene reflexionar sobre si realmente aporta valor a la actividad o si complica innecesariamente el proceso.

Casos en los que sí tiene sentido acceder a ficheros:

  • Para cargar datos iniciales desde un archivo .sql o .csv.
  • Para registrar logs o historiales de operaciones realizadas por el usuario.
  • Para exportar información (por ejemplo, lista de campeones en formato CSV o JSON).
  • Para procesar subidas de archivos desde formularios (por ejemplo, imágenes o documentos).

Casos en los que puede NO ser necesario:

  • Cuando el objetivo principal es practicar operaciones CRUD básicas sobre una base de datos.
  • Si ya se está trabajando desde un entorno como phpMyAdmin o con scripts SQL directamente.
  • Cuando el acceso a datos se hace exclusivamente desde y hacia la base de datos, sin intermediación de archivos.

Accediendo a ficheros

Gracias a la función fopen() desde PHP podemos abrir archivos que se encuentren en nuestros servidor o una URL.

A esta función hay que pasarle 2 parámetros; el nombre del archivo que queremos abrir y el modo en el que se abrirá

$fp = fopen("miarchivo.txt", "r");

Muchas veces no podemos abrir el archivo porque éste no se encuentra o no tenemos acceso a él, por eso es recomendable comprobar que podemos hacerlo

if (!$fp = fopen("miarchivo.txt", "r")){
    echo "No se ha podido abrir el archivo";
}

Modos de apertura de ficheros

  • r: Modo lectura. Puntero al principio del archivo.
  • r+: Apertura para lectura y escritura. Puntero al principio del archivo
  • w: Apertura para escritura. Puntero al principio del archivo y lo sobrescribe. Si no existe se intenta crear.
  • w+: Apertura para lectura y escritura. Puntero al principio del archivo y lo sobrescribe. Si no existe se intenta crear.
  • a: Apertura para escritura. Puntero al final del archivo. Si no existe se intenta crear.
  • a+: Apertura para lectura y escritura. Puntero al final del archivo. Si no existe se intenta crear.
  • x: Creación y apertura para sólo escritura. Puntero al principio del archivo. Si el archivo ya existe dará error E_WARNING. Si no existe se intenta crear.
  • x+: Creación y apertura para lectura y escritura. Mismo comportamiento que x.
  • c: Apertura para escritura. Si no existe se crea. Si existe no se sobrescribe ni da ningún error. Puntero al principio del archivo.
  • c+: Apertura para lectura y escritura. Mismo comportamiento que C.
  • b: Cuando se trabaja con archivos binarios como jpg, pdf, png y demás. Se suele colocar al final del modo, es decir rb, r+b, x+b, wb...

Operaciones con archivos

Para poder leer un archivo, una vez que ya lo hemos abierto, necesitamos usar la función fread() de PHP:

<?php
$file = "miarchivo.txt";
$fp = fopen($file, "r");

// filesize() nos devuelve el tamaño del archivo en cuestión
$contents = fread($fp, filesize($file));

// Cerramos la conexión con el archivo
fclose();

Si lo que queremos es escribir en un archivo, deberemos hacer uso de la función fwrite()

<?php

$file = "miarchivo.txt";
$texto = "Hola que tal";

$fp = fopen($file, "w");

fwrite($fp, $texto);
fclose($fp);

Archivos PDF

Con PHP podemos manejar todo tipo de archivos como ya hemos visto, pero… ¿qué pasa si queremos generar archivos PDF con datos sacados de una base de datos?

Gracias a una clase escrita en PHP, podemos generar archivos PDF sin necesidad de instalar extensiones complicadas del servidor.

¿Qué herramienta usamos?

Para generar PDFs con PHP usaremos la clase FPDF, una biblioteca gratuita y fácil de usar.

  • Sitio oficial: http://www.fpdf.org/
  • También puedes instalarla a través de Composer o descargarla manualmente.
  • Documentación y ejemplos disponibles en su web.

Instalación con Composer

Como ya tenemos Composer instalado en nuestra imagen Docker, podemos utilizarlo para gestionar esta dependencia.

¿Cómo instalar FPDF con Composer?

Asegúrate de haber inicializado Composer en tu proyecto:

composer init

Luego instala FPDF desde Packagist con:

composer require setasign/fpdf

Esto añadirá FPDF como dependencia y podrás usarla desde el autoload de Composer o requerirla manualmente si prefieres trabajar en modo clásico.

Ejemplo: Generar un PDF con "Hello World"

<?php

ob_end_clean();
require('fpdf/fpdf.php');

// Instanciamos la clase
// P = Portrait | mm = milímetros | A4 = tamaño papel
$pdf = new FPDF('P','mm','A4');

// Añadimos una página
$pdf->AddPage();

// Establecemos la fuente y tamaño
$pdf->SetFont('Arial', 'B', 18);

// Escribimos una celda con texto
$pdf->Cell(60,20,'Hello World!');

// Terminamos el PDF
$pdf->Output();
?>

Hay muchos ejemplos y tutoriales, así como documentación de la clase FPDF en la página oficial.

Visita la sección de tutoriales y el manual para sacar mayor partido a esta clase.

Pero además de añadir contenido, podemos configurar su encabezado, pie de página o diferentes elementos, por ejemplo:

<?php

require('fpdf/fpdf.php');

class PDF extends FPDF {

    // Cabecera
    function Header() {

        // Añadimos un logotipo
        $this->Image('logo.png',10,8,33);

        // establecemos la fuente y el tamaño
        $this->SetFont('Arial','B',20);

        // Movemos el contenido un poco a la derecha
        $this->Cell(80);

        // Pintamos la celda
        $this->Cell(50,10,'Cabecera',1,0,'C');

        // Pasamos a la siguiente línea
        $this->Ln(20);
    }

    // Pie de página
    function Footer() {

        // Nos posicionamos a 1.5 cm  desde abajo del todo de la página
        $this->SetY(-15);

        // Arial italic 8
        $this->SetFont('Arial','I',8);

        // Número de página
        $this->Cell(0,10,'Página ' . 
            $this->PageNo() . '/{nb}',0,0,'C');
    }
}

// Instanciamos la clase
$pdf = new PDF();

// Definimos un alias para la numeración de páginas
$pdf->AliasNbPages();

$pdf->AddPage();
$pdf->SetFont('Times','',14);

for($i = 1; $i <= 30; $i++)
    $pdf->Cell(0, 10, 'Número de línea ' 
            . $i, 0, 1);
$pdf->Output();

?>
Fichero PDF

Actividades

  • :📝 AC 620 (RA6 / CE6c / IC1 / 3p) - Añade una funcionalidad al proyecto lol que permita exportar todos los campeones de la base de datos a un archivo .csv. Este archivo debe contener:

    • Nombre del archivo: campeones.csv
    • Columnas: id, nombre, rol, dificultad, descripcion

    Guarda el archivo en el servidor y asegúrate de que se pueda descargar desde el navegador.

  • ⚓ AR 621. (RA6 / CE6c CE6g / IC1 / 3p) - Añade una funcionalidad al proyecto lol que muestre un listado de usuarios, mostrando únicamente su nombre y login. No se debe mostrar el campo password bajo ningún concepto. El listado puede mostrarse en HTML o como archivo descargable en .txt o .csv.

  • 🔬 AP 622 (RA6 / CE6c CE6g / IC1 / 3p) - Crea una funcionalidad en proyecto lol que genere un archivo .json con todos los campeones registrados en la base de datos. Este archivo debe contener los datos de forma estructurada y bien formateada.

  • 📝 AC 623 (RA6 / CE6c / IC1 / 3p) Crea un script que, al seleccionar un campeón concreto, genere un archivo PDF con todos sus detalles (nombre, rol, dificultad, descripcion). Usa la librería FPDF para crear el documento.

    El archivo debe poder descargarse desde el navegador. Guarda el archivo como campeones.json y permite su descarga.

  • 🧪 PR 624. (RA6 / CE6f CE6g / IC2 / 5p) - Necesitas añadir una serie de funcionalidades a tu e-commerce. Para ello tienes que modificar PR 613 para que:

    1. El trabajador puede exportar todos los pedidos a un archivo .csv.
    2. Cada cliente puede exportar solo sus propios pedidos a .csv.
    3. El cliente puede descargar la factura de cada pedido como archivo PDF, que debe incluir:
      • Número de pedido
      • Fecha
      • Productos, cantidades, precios
      • Total del pedido