Tag: PHP

Descargar PDF base64 con Symfony

Para hacer la recuperación de un archivo, en este caso un PDF, que está almacenado en nuestra base de datos como un BLOB para luego realizar el return añadiendo las cabeceras necesarias para realizar la acción de «Descargar» cuando llamemos a esta URL.

En este ejemplo sencillo, recuperamos el PDF utilizando una función ficticia en la que supuestamente recuperamos los datos del PDF en bruto (raw) y codificado en base64.

El segundo paso es decodificar ese raw utilizando la función base64_decode().

El último paso es crear la respuesta con los métodos que nos da la clase Response. A esta respuesta le vamos a añadir las cabeceras necesarias para poder decirle al navegador que es lo que tiene que hacer con este archivo.

En este caso lo que queremos es descargarlo. Por lo que añadiremos las cabeceras Content-Description y Content-Disposition:

$response->headers->set(‘Content-Description’, ‘File Transfer’);

$response->headers->set(‘Content-Disposition’, ‘attachment; filename=»Archivo.pdf»‘);
Con esto, al realizar una consulta a la ruta creada directamente nos descargará el PDF.
¡Importante! Si vas a realizar la consulta con un formulario, no te olvides de colocar el atributo enctype en tu etiqueta FORM.
<form id="pruebaPDF" method="post" enctype="multipart/form-data">
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
    /**
    * @Route("/show-pdf", name="show_pdf")
    */
    public function getPDFDocument()
    {
        $result = getPdfFromRaw();
        $pdf = base64_decode($result->PDF);
        $response = new Response($pdf);
        $response->headers->set('Content-Type', 'application/octet-stream');
        $response->headers->set('Content-Description', 'File Transfer');
        $response->headers->set('Content-Disposition', 'attachment; filename="Archivo.pdf"');
        // $response->headers->set('Expires', '0');
        // $response->headers->set('Content-Transfer-Encoding', 'binary');
        $response->headers->set('Content-length', strlen($pdf));
        $response->headers->set('Cache-Control', 'no-cache private');
        // $response->headers->set('Pragma', 'public');
        // Send headers before outputting anything
        $response->sendHeaders();
        return $response;
    }

Detectar dispositivo móvil Javascript / PHP

Estas dos funciones son la manera más simple para poder detectar si se está utilizando un dispositivo móvil en nuestra página web.

Existirán funciones más complejas, pero estas cumplen bien su cometido.

Si vemos, la versión de Javascript parece mucho más compleja, por lo que podríamos utilizar AJAX para realizar nuestras validaciones realizando la llamada a un archivo PHP utilizando la función en este lenguaje.

JAVASCRIPT

PHP

function isMobile() {
    return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini
|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}

// Use the function
if(isMobile()){
    // Do something for only mobile users
}
else {
    // Do something for only desktop users
}

Utilizar Mailtrap como Inbox para Desarrollo

Hace poco hemos tenido un problema a la hora de gestionar los correos que utilizabamos desde nuestro entorno de desarrollo. Hemos descargado datos del entorno de producción y hemos utilizado correos reales para hacer pruebas sin querer queriendo. Nuestra intención no era enviarlos, habíamos creado unas condiciones pero nos olvidamos de añadir una condición más y se hizo el envío a unos cuantos. No fueron muchos pero, ¿y si se hubiera enviado el correo a todo el mundo? Estoy seguro que a alguno más le ha pasado esto mismo, ha utilizado su entorno de desarrollo para hacer pruebas de emailing y justo coincide que los correos de prueba son correos reales.

Pues bien, para evitar esto vamos a gestionar de ahora en adelante nuestros correos con un servicio gratuito y fácil de instalar en nuestro framework, sea el framework que sea.

Hablo de Mailtrap.io qué, como su misma página dice, es un entorno para el testeo de emailing seguro para desarrolladores: «SAFE email testing for dev teams«.

Es un servidor de SMTP creado por y para desarrolladores, para testear, ver, analizar y compartir emails enviados desde el entorno de desarrollo sin tener que «espamear» a emails reales. Podemos utilizar Mailtrap desde Localhost, Stage, QA…

Tendremos la posibilidad de analizar el diseño, datos estructurados y otras opciones relacionadas con el envío de correo.

Mailtrap - Serever Smpt

 

PRECIOS

Este servicio es gratuito pero si queremos más, obviamente tendremos que pagar. Según el plan que elijas podrás obtener menos o más beneficios.

Mailtrap - Pricing

Gestión de Resultados RaceChipAragon.com

Gestor de Resultados Online

RaceChipAragón.com es una empresa que cronometra tiempos de eventos deportivos (running, trail, btt), dando servicio como cronometradores certificados en España. Sus clientes directos son organizadores y los indirectos los atletas que participan en los eventos deportivos, los cuales son los interesados principales en ver los tiempos que realiza cada uno de ellos.

Para gestionar los tiempos he creado un sistema de gestión de clasificaciones utilizando el framework de LARAVEL para gestionar todo el backend de la sección de Resultados.

El usuario puede crear, editar y eliminar eventos. Por cada evento se pueden gestionar las clasificaciones utilizando una importación con EXCEL y/o con archivos PDF.

Cuando se suben los archivos Excel el nombre de cada columna se añade como título de las columnas que se muestran en el listado. Se pueden habilitar o deshabilitar columnas y por cada columna añadir un filtro para que los inscritos puedan utilizarlo.

La página es responsive gracias a Bootstrap 4 y además es capaz de redimensionarse automáticamente en modo iframe utilizando un plugin especifico para ello, evitando que el iframe se muestre con un alto estático.

Podemos verla dentro de la sección https://www.racechiparagon.com/resultados-de-cronometrajes

Cuando publicamos los resultados veremos un listado de los eventos que estén habilitados:

Listado Eventos - RacechipAragon.com

Por cada evento gestionado podemos generar clasificaciones tanto subiendo un Excel como utilizando archivos PDF:

Clasificaciones - RacechipAragon.com

Array limpio de valores vacíos en PHP

Para poder dejar un array limpio de valores vacíos, en PHP utilizaremos la función nativa array_filter. Esta función lo que hace es recorrer el array y en el caso de que exista valor devuelve un «true» junto con el valor. En caso de que devuelva «false», el indice y valor vacío es eliminado.

Al eliminar estos indices con valor vacío, lo que obtendremos al final es un array con saltos de indice. Si necesitamos reinicar estos indices, utilizaremos otra función nativa de PHP: array_values la cual recorrerá todo el array de nuevo y volverá a indexarlo numéricamente.

$newArray = array_values(array_filter($OldArray))

Descargar un archivo con CURL PHP

A veces necesitamos procesos que nos ayuden a simplificar una tarea. En este caso el proceso se encargará de descargar un archivo desde una URL especifica. Para ello utilizaremos CURL de PHP.

Sólo necesitamos la URL de llamada y la URL de destino donde se guardará el archivo.

curl_setopt($ch, CURLOPT_SSLVERSION,3);

$origen = "http://urldedescarga.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $origen);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSLVERSION,3);
$data = curl_exec ($ch);
$error = curl_error($ch);
curl_close ($ch);
$destino = $path_raiz."/export/archivo.extension";
$archivo = fopen($destino, "w+");
fputs($archivo, $data);
fclose($archivo);

Instalar Laravel 5.5 en 1and1

Para crear nuestro proyecto con Laravel en 1and1.com necesitamos revisar que nuestro servicio contratado cumple los requisitos mínimos.

  • PHP >= 7.0.0
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Mbstring PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

En principio la mayoría de estos requisitos los cumplimos. Pero puede ser que la versión de PHP no la tengamos bien configurada. Para ello sigue los pasos de Cambiar la Configuración de PHP en 1and1.

 

Una vez revisado estos puntos vamos a proceder a crear nuestra carpeta de proyecto. Simplemente puedes entrar con el Filezilla y crearla en el raíz o dentro de la carpeta clickandbuilds. No importa donde sea, lo importante es que recuerdes donde lo has creado.

Instalar Composer en 1and1

Nos conectaremos vía SSH con nuestras credenciales vía PUTTY. Las podemos encontrar en la misma sección de «Hosting» en el menú de 1and1 y suelen ser las mismas de acceso FTP.

Una vez dentro buscamos nuestra carpeta de proyecto e instalamos el composer con el siguiente comando:

curl -sS https://getcomposer.org/installer | /usr/bin/php7.1-cli

NOTA: Utilizo la versión 7.1 porque la 7.0 no se encontraba en mi directorio bin. Puedes comprobar si tienes esta versión instalada listando los archivos del directorio: ls -l /usr/bin/ | grep "php7"

Esto nos descargará el composer.phar que es un ejecutable de php para buscar las dependencias de nuestro proyecto.

Ahora ejecutamos el composer por primera vez: /usr/bin/php7.1-cli composer.phar

Para mantenernos actualizados podemos hacerlo con la opción selfupdate: /usr/bin/php7.1-cli composer.phar selfupdate

Crea una BBDD en 1and1

En el menú de la izquierda entramos a la pestaña de «Base de Daots Mysql». Las bases de datos se crean con un nombre que proporciona 1and1. No es personalizable, pero puedes añadir una descripción para diferenciarlas. Introduce tu contraseña y recuerda que esta debe ser lo más segura posible. 1and1 ya nos da un nivel de seguridad según la clave que introducimos.

El proceso de creación tardará unos minutos. Puedes ver el estado de creación en la lista de BBDD.

 

Crear Proyecto Laravel

Puedes crear tu proyecto Laravel en LOCAL (TU PC) o directamente en el servidor conectandonos vía SSH utilizando el composer.

Yo prefiero hacerlo desde LOCAL para trabajar en el entorno habitual de DESARROLLO y PRODUCCIÓN.   (Ver instalación)

Una vez instalado, súbelo a la carpeta de tu proyecto en 1and1 vía Filezilla.

Suponiendo que ya conoces el archivo de conexión .env de laravel, continuaremos con la modificación de éste.

Ya que utilizamos nuestra base de datos en MySql, buscamos la línea de conexión y modificaremos los datos con los que nos da 1and1 para conectarnos a nuestra BBDD de PRODUCCIÓN. Estos datos los puedes encontrar haciendo clic en el nombre de la bbdd dentro del listado.

DB_CONNECTION=mysql
DB_HOST=db709977146.db.1and1.com
DB_PORT=3306
DB_DATABASE=db709977146
DB_USERNAME=dbo709977146
DB_PASSWORD=»Password que has introducido al crearla«

Crear Dominio / Subdominio

Para probar que nuestro proyecto funciona tenemos que hacer que un dominio o subdominio apunte a nuestra carpeta del proyecto.

Entramos a la zona de dominios y buscamos el enlace para crear un subdominio.

 

Una vez se haya creado, entramos a la configuración del subdominio y hacemos clic en el enlace «Ajustar directorio de espacio web». Aquí nos mostrará las carpetas que tenemos en nuestro espacio web. Seleccionamos la de nuestro proyecto, buscamos la carpeta public y la seleccionamos. (Esta configuración también tardará lo suyo)

Si todo ha ido bien, al colocar el nombre de nuestro subdominio veremos que nos mostrará la página de inicio de nuestro nuevo proyecto Laravel.

Actualizar versión PHP en 1and1

Para cambiar la Versión PHP en 1and1 tenemos que logearnos con nuestro usuario y buscar en la sección de «MIS PRODUCTOS» del menú la opción de «Hosting«. Aquí buscamos en la sección de «Administrar espacio web» la opción de «Ajustes de PHP«.

Una vez adentro veremos nuestros productos contratados en un listado con los nombres de dominio. Vamos a seleccionar el que nos interesa y haciendo clic en el checkbox y continuaremos haciendo clic en Modificar versión PHP. Como podrás observar yo ya tengo la versión PHP7.0, pero esto es porque yo he seguido estos pasos previamente.

Ahora sólo nos queda utilizar la herramienta para cambiar nuestra versión de PHP. Veremos que tenemos la versión 5.6, 7.0, 7.1  y  7.2. Vamos a elegir la 7.0 porque es la versión más estable.

1&1 PHP Versión 1and1

Con esto ya tendríamos actualizada la versión de PHP en nuestro servicio contratado de 1and1.

Validación Cuenta IBAN PHP

El código IBAN sirve para identificar a nivel internacional una cuenta bancaria. Su nombre viene de las siglas en inglés de la norma IBAN (Internacional Bank Account Number), la cual nació para que los las entidades financieras pudieran automatizar fácilmente las transferencias entre bancos de la Unión Europea.

El código IBAN es un código que lleva 4 caracteres iniciales y, a continuación, el número de cuenta:

  • 4 caracteres iniciales: código del país (2 dígitos) + código de control (2 dígitos). Ejemplo: ES21 (código de país “ES” para España) + código de control (“21”).
  • Número de cuenta: 20 caracteres que identifican la cuenta. Ejemplo:1465 0100 72 2030876293.

VALIDACIÓN IBAN

Ejemplos Cuentas IBAN

Para gestionar perfectamente algunas validaciones necesitamos tener ejemplos concretos de algunos datos. A la hora de desarrollar la validación para el control de cuentas bancarias he utilizado estas cuentas de ejemplo:

España IBAN Ejemplo
Banco IBAN Entidad Oficina Digito Control Cuenta
CAIXABANK ES6621000418401234567891 1210 0418 40 1234567891
BANCO SANTANDER ES6000491500051234567892 0049 1500 05 1234567892
ABANCA CORPORACION BANCARIA ES9420805801101234567891 2080 5801 10 1234567891
BANCO DE CREDITO BALEAR ES9000246912501234567891 0024 6912 50 1234567891
BANCO ESPAÑOL DE CREDITO ES7100302053091234567895 0030 2053 09 1234567895
BANCO SANTANDER ES1000492352082414205416 0049 2352 08 2414205416
IBERCAJA BANCO ES1720852066623456789011 2085 2066 62 3456789011
Italia IBAN Ejemplo
IBAN Número de control BBAN Entidad Oficina Cuenta
IT60X0542811101000000123456 X 05428 11101 000000123456
IT86L0617501432000001134250 L 06175 01432 000001134250

Buscar registros duplicados con MySQL

A veces nos encontramos con el caso de que por error de programación duplicamos sin querer registros en nuestra base de datos.

Vamos a utilizar esta consulta SQL para poder buscar los duplicados de una tabla utilizando un COUNT para hacer el conteo de registros duplicados.

SELECT id_registro, COUNT(*) Total
FROM registros
GROUP BY id_registro
HAVING COUNT(*) > 1

Para hacerlo un poco más complejo, vamos a buscar los valores duplicados dentro de una tabla cuyo problema sería el siguiente:

El problema ha sido con una talla de camiseta en el que se nos ha añadido 3 veces. Al crear el registro se ha creado de forma incorrecta vía PHP.

Desde otra tabla se recuperó 3 valores distintos al hacer una consulta con un where «%L%» y esto fue lo que nos creo los registros duplicados.

Entonces vamos a hacer lo mismo pero en la tabla donde se han añadido los registros viendo cuales han sido los que se han duplicado:

SELECT id_registro, COUNT(*) Total
FROM camisetas
WHERE talla LIKE ‘%L%’
GROUP BY id_registro
HAVING COUNT(*) > 1

Esto nos devolvería que personas han seleccionado la talla de camiseta L pero además nos devolverá a los que se les ha añadido la XL y la XXL duplicando así sus valores.

Este fue un problema real y por lo tanto ha servido de mucha ayuda para poder solventar de forma manual este problema.

id_registro Total
00001 3
00002 2