Blog

  • Cómo pasar datos de tipo DateTime a través de $_GET

    Cómo pasar datos de tipo DateTime a través de $_GET

    Tenés una fecha guardada en un objeto DateTime y necesitás enviarla a otra página… incluso puede que sea una página de otro sitio (un servicio web por ejemplo).

    Suponiendo que la URL del destino es algo como http://otrositio.com?fecha=dd-mm-YYYY, sólo se trata de tomar el string http://otrositio.com?fecha= y concatenar el objeto.

    No parece muy complicado, ¿no?

    No es que sea una ciencia oculta tampoco, pero no es tan simple.

    ¿Cuál es el problema?

    La clase DateTime no cuenta con un método __toString, con lo cual, si intentás algo como:

    <?php
    
    $d = new DateTime();
    $url = 'http://otrositio.com?fecha='.$d;

    Te vas a encontrar con un error:

    PHP Warning:  Uncaught Error: Object of class DateTime could not be converted to string

    El punto es que no existe una única forma de expresar una fecha como una cadena.

    Por ejemplo:

    • 22-12-1977
    • 22 de Diciembre de 1977
    • Jueves 22 Dic. 1977

    Y unas cuantas más son, en rigor, la misma fecha.

    De modo que PHP no es capaz de adivinar cuál de todos estos formatos querés usar.

    Cómo formatear una fecha usando PHP

    Claro que, siendo un problema tan común, no es extraño asumir que existe una solución estándar.

    Esta solución es precisamente el método format.

    Por ejemplo, para darle formato dd-mm-YYYY a una fecha se puede usar:

    <?php
    
    $d = new DateTime();
    $s = $d->format('d-m-Y');

    Y luego usar el resultado para generar la URL:

    <?php
    
    $d = new DateTime();
    $s = $d->format('d-m-Y');
    $url = 'http://otrositio.com?fecha='.$s;

    Cómo transformar un string recibido por $_GET en un DateTime

    Y ahora… qué pasaría si tu situación es la inversa, es decir, ¿qué deberías hacer si necesitás tomar una fecha como parámetro desde la URL?

    Pues bien, aquí tu aliado será el constructor de la clase DateTime:

    <?php
    
    $d = new DateTime($_GET['fecha']);

    O bien, para evitar problemas, el método estático createFromFormat:

    <?php
    
    $d = DateTime::createFromFormat('d-m-Y', $_GET['fecha']);

    Y una vez convertido en objeto ya puedes usar todo el resto de los métodos que seguro te harán mucho más cómodo el trabajo con datos de tipo fecha.

  • Cuál es la mejor forma de almacenar fechas en MySQL

    Cuál es la mejor forma de almacenar fechas en MySQL

    ¿Tenés que desarrollar una aplicación que maneja fechas?

    Tal vez un portal para reserva de turnos, o quizás algún sistema de membresías por tiempo limitado o por qué no un programa que le pregunte al visitante su fecha de nacimiento y le diga el signo del horóscopo chino al que pertenece.

    Más allá de cuál sea el objetivo de la aplicación en algún lado vas a necesitar almacenar fechas.

    Y ese lado será probablemente una base de datos relacional y, más aún, si estás usando PHP, seguramente sea MySQL.

    Existen varias opciones que podrías usar para definir el tipo de datos del campo en cuestión y la decisión puede no ser trivial.

    Usar un VARCHAR para almacenar un dato fecha

    Si bien técnicamente podrías guardar una fecha en un campo de tipo VARCHAR (O cualquier otro tipo string), esto te hará difícil resolver algunos problemas como por ejemplo ordenar un set de resultados en función de la línea de tiempo.

    Es decir, si una fecha es '2020-02-01' y la otra es '19000-02-01' el motor te dirá que la primera es posterior a la segunda.

    Esto sucede porque, en lugar de tomar el valor como una fecha, se lo está tratando como una simple cadena de caracteres y, por lo tanto, se está aplicando el orden lexicográfico.

    Esto significa que para comparar se están tomando los caracteres y se comparan uno a uno, de este modo:

    20200201
    190000201

    Por otra parte, como se trata de cadenas, el motor no será capaz de determinar que '2020-13-35' no es un valor aceptable.

    Así que… no te lo recomiendo

    Usar un TIMESTAMP para almacenar un dato fecha

    Un segundo tipo de datos que podrías usar para guardar fechas es el TIMESTAMP.

    Este seguramente va a funcionar mejor que el VARCHAR, pero tampoco es el ideal.

    El TIMESTAMP es, internamente, un número muy grande que mide cuántos segundos pasaron desde segundo uno de UNIX (1970-01-01 00:00:01).

    Usualmente este tipo de datos se utiliza para operaciones que requieren altísima precisión, como procesos de tiempo real… un poco exagerado cuando se quiere saber la fecha en que una persona recibió su último aumento de sueldo, ¿no?

    Usar un DATE para almacenar un dato fecha

    La mejor opción es usar un campo de tipo DATE.

    Este tipo de datos modela una fecha mediante una estructura que tiene separados los componentes del mes, día y año.

    Si bien al momento de visualizarlo no será distinguible de un VARCHAR que tenga el mismo contenido, a nivel funcional será muy diferente.

    Entre otras, el tener los datos almacenados usando el tipo correcto permitirá realizar consultas como:

    SELECT * FROM usuarios WHERE subscription_date BETWEEN '2020-01-10' AND '2020-01-20';

    Y obtener como resultado aquellos usuarios que se han suscrito a nuestro sitio entre el 10 y el 20 de Enero de 2020.

    Usar un DATETIME para almacenar un dato fecha

    Si necesitas almacenar, además de la fecha, la hora exacta en que sucedió algo, lo mejor es utilizar el tipo de datos DATETIME que se comporta igual que DATE pero agregando la información de horas, minutos y segundos.

  • PHP me da error… ¿y ahora?

    PHP me da error… ¿y ahora?

    Cuando estás comenzando con php es muy común encontrarte ante alguna situación similar a esta:

    «por algún motivo no puedo insertar datos ni actualizar ni borrar.
    Me da un error en las lineas 51 y 52″

    «estoy queriendo insertar un string en una base de datos pero me da error, no me reconoce el formato de la hora»

    «estoy haciendo un select php con un where, pero no me muestra los resultados, me da error

    Seguramente te estarás preguntando qué puede estar pasando y más importante: ¿¿cómo resolverlo??

    Hay pocas cosas más desesperantes que probar y probar y que nada funcione…

    Te tengo buenas noticias: la solución está más cerca de lo que parece.

    Lo primero que hay que hacer en una situación como esta es respirar hondo, tal vez dar una pequeña vuelta alrededor del escritorio y volver con la cabeza más fresca.

    Una vez pasada la desesperación tenés que comprender algo fundamental:

    No todos los errores son iguales

    Con esto quiero decir que «me da error» ayuda poco cuando se trata de encontrar una solución.

    Hay que comprender la causa del problema para avanzar.

    Es como cuando vas al médico: si todo lo que el profesional sabe es que te sentís mal es difícil que te pueda curar.

    Cómo encontrar la causa del error

    Lo primero que necesitás es comprender exactamente cuál es el error.

    Usualmente, cuando un programa no completa su ejecución, en algún lado se guarda información de qué fue lo que sucedió.

    Dependiendo de la configuración es posible que esa información esté directo frente a tus ojos, a través de un mensaje de error en la pantalla:

    O que se esconda detrás de un mensaje algo genérico como:

    En este caso no significa que esta es toda la información que vas a obtener, sólo que vas a tener que buscar un poco más, probablemente en los archivos de log del servidor web.

    Los mensajes pueden parecer un poco difíciles de leer e interpretar, especialmente si no sabés inglés, pero si les prestás atención notarás que son muy informativos.

    Cerca del 80% de los errores de php se pueden comprender simplemente leyendo el mensaje. Compartir en X

    Veamos algunos ejemplos.

    Call to undefined function

    Fatal error: Uncaught Error: Call to undefined function sqlsrv_query() in /home/mauro/Code/sunat/cambio.php on line 4

    Desmenucemos un poco el mensaje.

    La primera parte dice Fatal error.

    Suena feo ¿no? Error fatal… tranquilo, no se murió nadie, simplemente significa que se ha producido un error que impide que el script siga ejecutándose.

    Luego vemos que dice Uncaught error.

    Uncaught significa «no atrapado», lo que da una idea de que los errores pueden atraparse… tema un poco avanzado para este momento, por lo pronto dejémoslo de lado.

    Y ahora sí llegamos a la parte jugosa: Call to undefined function sqlsrv_query().

    Este es realmente el problema: se está intentando llamar a una función que no ha sido definida aún (o al menos, el intérprete no la conoce).

    ¿Cuál es la función desconocida? sqlsrv_query.

    En php existen dos tipos de funciones:

    1. Propias del lenguaje (o de librerías escritas en C)
    2. Definidas por el programador (vos)

    El caso de sqlsrv_query es el primero, pero si intentaras llamar a una función tuya que el intérprete desconoce el problema sería el mismo.

    Así que aquí tenemos la primera pista.

    Luego tenemos otros dos datos muy importantes:

    in /home/mauro/Code/sunat/cambio.php

    Está indicando cuál es exactamente el archivo que se estaba ejecutando cuando el problema se presentó.

    Por último on line 4 te está indicando cuál fue exactamente la línea que disparó el error.

    Con todo esto tenés bastante de dónde agarrarte: sabés qué línea de qué archivo tenés que ir a mirar… no está mal, ¿cierto?

    Ahora vamos al caso específico.

    Si no sabés mucho sobre la función sqlsrv_query siempre tenés un aliado poderoso: el viejo y querido Google.

    Una búsqueda simple te va a dar estos resultados:

    Y ya que apareció un link a la página oficial de php.net, yo te diría que lo sigas a ver qué aparece :).

    Leyendo un poco vas a encontrar que la función sqlsrv_query pertenece a la extensión SQLSRV.

    Como el resto de las extensiones, puede ser habilitada o deshabilitada en la configuración de PHP (el famoso archivo php.ini).

    Así que una posibilidad es que la librería no esté instalada y/o habilitada.

    Sólo lo vas a saber mirando cómo está tu instalación de php.

    Undefined variable

    Notice: Undefined variable: ejecutar in C:\wamp\www\demo\php\insertar.php on line 19

    Acá lo que está diciendo el intérprete está diciendo:

    1. Que hay una variable no definida llamada ejecutar (Undefined variable: ejecutar)
    2. Que el problema aparece en la línea 19 del archivo C:\wamp\www\demo\php\insertar.php

    Momento.

    ¿No era que en PHP no hacía falta definir las variables?

    ¿En qué quedamos?

    Sin ver el código completo puedo inferir que en la línea 19 se está intentando usar esa variable antes de haberla asignado en algo como:

    <?php
    
    if ( $ejecutar == 'Otro ejemplo:algo' ) ...

    En php la definición y la primera asignación de una variable se producen en el mismo momento.

    Otro detalle interesante para notar es que el mensaje comienza con Notice (A diferencia del anterior que empezaba con Fatal Error).

    PHP tiene diferentes niveles de errores, algunos más graves que otros.

    Según el tipo específico del error se disparará (o no) alguna acción, como por ejemplo finalizar la ejecución del script ante la detección del error.

    Object of class … could not be converted to String

    Catchable fatal error: Object of class DateTime could not be converted to string

    Aquí lo que está sucediendo es que se está tratando de usar un objeto de tipo DateTime en el contexto de un string… y la clase DateTime no tiene un método __toString.

    Un código que podría dar este problema es:

    <?php
    
    echo 'Hoy es '.(new DateTime()).'!';

    Qué hacer cuando el mensaje de error no alcanza

    Claro que no siempre la vida es tan generosa… ¿Qué pasa cuando el mensaje de error no es suficiente?

    ¿Qué podés hacer?

    Bueno… sí, es una opción, pero existen algunas mejores opciones 🙂

    A veces sucede que encontrar la causa de un error requiere algo más que simplemente leer el código.

    Esto sucede, por ejemplo, cuando el programa falla a veces

    Tomemos un código como este:

    <?php
    
    $a = rand(1,3);
    
    switch ($a) {
    case 1:
            echo 'Hoy es: '.(new DateTime());
            break;
    case 2:
            echo $a;
    case 3:
            echo $a * 2;
    }
    
    echo PHP_EOL;

    Estadísticamente este programa debería fallar una de cada 3 veces que es ejecutado.

    ¿Cuándo? Cada vez que $a == 1.

    Y ¿cómo podés saber cuánto vale $a en cada ejecución?

    Necesitás alguna herramienta que te permita ver su contenido.

    Existen diferentes opciones:

    Pero la realidad es que la mejor alternativa es no usar ninguna de ellas, si no más bien un debugger.

    Qué es un debugger

    Un debugger es un programa que te permite ejecutar tu código paso-a-paso.

    Es decir, en lugar de correr el programa entero y, recién entonces, ver la salida y tratar de entender qué valor tenía cada variable al momento de la ejecución, con el debugger podés ver el contenido de tus variables en tiempo real.

    Los más populares para PHP son

    Si querés conocer más sobre cómo usar un debugger en tus aplicaciones podés seguir leyendo acá.

    Si PHP te da errores no corras

    La próxima vez que te encuentres ante un error de PHP (Y creeme, te va a pasar), no te desesperes.

    Tomá un poco de aire y hacé un pequeño esfuerzo por comprender el mensaje de error que estás viendo.

    Te sorprenderá la cantidad de veces que no necesitarás más para subsanar el problema 🙂

  • 5 formas de reforzar la seguridad de tus sesiones en PHP

    5 formas de reforzar la seguridad de tus sesiones en PHP

    En un post anterior había mencionado cuáles son los riesgos a los que están sujetas las sesiones PHP.

    En este artículo voy a darte algunos tips para mejorar la seguridad de tus sesiones y dormir más tranquilo 🙂

    1. Usa siempre HTTPS

    La mejor forma de reforzar la seguridad de tus aplicaciones (No sólo de las sesiones) es utilizar tráfico cifrado, de esta forma, aún si alguien logra capturar el tráfico le será virtualmente imposible leer el contenido.

    Puedes conseguir certificados gratuitos usando, por ejemplo, LetsEncrypt

    2. Cambia el nombre de tu cookie de sesión

    El nombre por defecto de la cookie de sesión es PHPSESSID pero puedes cambiarlo usando session_name() o desde la configuración de php (La variable session.name).

    Al cambiar este dato harás más dificultoso para un atacante saber cuál es la cookie que contiene el id de sesión.

    3. Habilita el modo de sesión estricto

    En este modo (deshabilitado por defecto) el servidor sólo reconocerá como válidas aquellas sesiones cuyo identificador haya sido generado por él.

    Este cambio se realiza a través de la entrada session.use_strict_mode del archivo php.ini.

    4. Fuerza el uso de cookies de sesión

    Con este cambio harás imposible que alguien, sin darse cuenta, comparta un enlace que contiene su id de sesión.

    Para ello debes modificar el valor de session.use-only-cookies

    5. Mantén información adicional dentro de las variables de sesión

    Al momento de inicializar una sesión no guardes sólo el id de usuario si no algún otro dato que permita validar la identidad del visitante, por ejemplo:

    <?php
    
    session_start();
    if (successfulLogin()){
       $_SESSION['uid'] = $userId;
       $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT'];
       $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
    }

    Luego, en cada página donde debas validar la identidad del usuario:

    <?php
    
    session_start();
    if (empty($_SESSION['uid']) || isValidUser($_SESSION['uid'])) {
           http_response_code(403);
          
           die;
       }
    
    if ($_SESSION['userAgent'] !== $_SERVER['HTTP_USER_AGENT']) {
        http_response_code(403);
          
        die;
    }
    
    if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR']) {
        http_response_code(403);
          
        die;
    }

    De este modo, aún si alguien logra robar la cookie de sesión le será imposible utilizarla

    Espero que estos tips te hayan servido, si te quedó alguna pregunta no dudes en dejarla en los comentarios!

  • ¿Qué tan seguras son las sesiones de PHP?

    ¿Qué tan seguras son las sesiones de PHP?

    Seguramente escuchaste alguna versión de estas preguntas:

    ¿Es posible que alguien modifique sus cookies, les otorgue diferentes privilegios o inicie sesión como un usuario diferente?

    ¿Puede alguien robar las variables mientras están guardadas en el lado del servidor?

    ¿Que tan posible es que alguien te copie una session para usarla en su navegador?

    Una de nuestras principales preocupaciones como desarrolladores de software es la posibilidad de que algún hacker pueda robar información que los usuarios han confiado a nuestras aplicaciones.

    Si eso llegara a suceder nuestros clientes podrían verse en serias dificultades (y por lo tanto, nosotros también).

    Existen muchos modos en que un atacante puede colarse en nuestros sistemas y, lamentablemente, las sesiones no están exentas de riesgos.

    Para qué sirven las sesiones en PHP

    Las sesiones de PHP son un modo bastante cómodo de compartir información entre peticiones.

    Un ejemplo clásico es el login: independientemente de cuál sea el método de autenticación usado, una vez validada la identidad del visitante, es necesario indicar a las siguientes páginas que este usuario está autorizado a verlas.

    Para ello un modo muy común es utilizar el arreglo $_SESSION con algún código similar a:

     <?php
    
    // Obtener el $userId de la base de datos
    session_start();
    $_SESSION['userId'] = $userId;

    Y, en las siguientes páginas tener un chequeo similar a:

     <?php
    
    session_start();
    if (empty($_SESSION['userId'])) {
      header('Location: login.html');
    
      die;
    }

    Usar las sesiones no es realmente complejo pero si para responder qué tan seguras son las sesiones primero debemos comprender cómo funcionan internamente.

    Cómo funcionan las sesiones en PHP

    Del lado de nuestros scripts tenemos ese arreglo superglobal ($_SESSION) que, en principio, puede guardar cualquier valor que se desee y estará ahí cuando lo necesitemos.

    Existen varias formas de almacenar esta información. La más común es la utilización de archivos temporales en algún lugar del disco del servidor, aunque existen varias alternativas (Puedes consultar más sobre esto en el manual de PHP).

    Claro que un mismo servidor web puede estar atendiendo a muchos visitantes a la vez (al menos eso es lo que esperamos que suceda :)), de modo que necesitamos alguna forma de asociar ese archivo en el disco del servidor al visitante que realizó la solicitud:

    Múltiples clientes son atendidos en forma simultánea por un servidor web

    El protocolo HTTP (En el que se basa la web) pertenece al conjunto conocido como sin-estado (stateless).

    Esto significa que cada petición es independiente de las otras… ¡lo cual es precisamente lo contrario de lo que necesitamos!

    Debido a esta característica de HTTP, cada aplicación que quiera vincular una petición con otras deberá hacerlo por sus propios medios.

    En el caso de PHP la forma de asociar a un visitante con su sesión es agregar un parámetro a cada petición: el ID de sesión.

    Hoy en día lo más usual es guardar este id en una cookie especial (La cookie de sesión) y de ese modo asegurarse de que este valor:

    • Acompañe al usuario en su recorrido por nuestro sitio
    • Desaparezca en forma automática cuando ya no se lo necesita

    Qué riesgos presentan las sesiones de PHP

    Como vemos, toda la información de las sesiones está almacenada del lado del servidor, con lo cual, el riesgo de que alguien acceda a dicha información se reduce a dos posibilidades:

    1. Que una persona no autorizada pueda acceder directamente a los archivos del servidor
    2. Que un atacante suplante la identidad de un usuario que ha iniciado sesión

    Evitar el primer riesgo no depende de nuestro código si no de la configuración del servidor.

    Una forma de atacar una aplicación web a través del mecanismo de sesiones consiste en el secuestro de la sesión (session hi-jacking).

    De lo que se trata es de copiar el contenido de una cookie de sesión y crear con él otra cookie en otra computadora.

    Si no se han tomado medidas precautorias, el servidor no será capaz de distinguir a un visitante del otro.

    Obtener una cookie de sesión no es algo sencillo pero tampoco imposible.

    Basta con:

    • Tener acceso a la computadora de la víctima
    • Interceptar el tráfico de red (Suponiendo que no esté cifrado)
    • Ejecutar un ataque de tipo XSS

    En definitiva: las seguridad de las sesiones depende fuertemente de qué tan seguro sea el mecanismo de validación de identidad de un visitante.

  • ¿cURL o file_get_contents? 6 tips para decidir

    ¿cURL o file_get_contents? 6 tips para decidir

    Estás haciedo un script para obtener contenido desde una url y te encuentras que se puede hacer con curl y con file_get_contents… ¿cuál es la más apropiada para este caso?

    Antes de decidir, hazte estas preguntas

    ¿Qué diferencias hay entre cURL y file_get_contents?

    file_get_contents es una función de bastante alto nivel.

    Puede usarse tanto para leer archivos locales como remotos.

    cURL es una librería que permite la comunicación con diferentes tipos de servidores y protocolos.

    Esto significa que, si bien con cURL es posible lograr el objetivo, esta herramienta tiene muchas más aplicaciones que la primera.

    ¿Cuál es la más segura?

    Un punto muy importante es el de la seguridad, dado que se trata de intercambiar información con servidores remotos y, ahí donde dejamos una puerta abierta… el diablo puede colarse 🙂

    En general se considera a cURL como la opción más segura.

    Si vas a usar file_get_contents para obtener contenido de archivos remotos debes validar que la URL no esté creada en forma maliciosa.

    ¿Cuál es la que menos recursos consume?

    En cuanto al consumo de recursos, ninguna de las dos presenta una ventaja significativa sobre la otra, en definitiva, lo más probable es que no sea este el culpable de que agotes las capacidades instaladas.

    ¿Cuál es la más rápida?

    En general las pruebas de velocidad dan a cURL como el ganador.

    ¿Cuál es la más simple?

    Definitivamente, la más simple de utilizar es file_get_contents, en principio porque forma parte el núcleo de PHP, a diferencia de cURL que es un módulo que debe ser activado y configurado.

    ¿Cuál funcionará en mi hosting?

    Esta es probablemente la pregunta que definirá cuál es la solución adecuada.

    Si estás en un entorno compartido es posible que no puedas usar ninguna, lamentablemente, este tipo de comunicaciones suele estar deshabilitada en estos proveedores… claro que también puedes subir de plan.

    Si utilizas tu propio servidor el límite es tuyo.

    En todo caso, para utilizar file_get_contents necesitarás tener habilitada la opción allow_url_fopen y, para utilizar cURL php deberá estar compilado con la opción --with-curl

  • Cómo validar que el usuario tiene permisos para ver la pagina web

    Cómo validar que el usuario tiene permisos para ver la pagina web

    Me encuentro a menudo con problemas como estos:

    Estoy haciendo un sistema para validar las personas que ingresan a un modulo especifico.
    El sistema solicita una clave de acceso que yo les genero, por ejemplo la página del formulario es el index.html y cuando completan e introducen la clave correcta los lleva a view.html, el problema está en que si una persona pone en la url directamente view.html, pueden ingresar sin pasar por el formulario.
    Como puede hacer para si alguien conoce la URL view.html, al ingresarla en el navegador lo redirija al index.html


    Diseñando mi sitio web con PHP, he notado algo que no es correcto. En la primera pagina, el usuario ingresas sus datos (usuario y contraseña). Luego de que es validado en la base de datos identificando que existe, se le da acceso a la pagina del menú que le permite hacer consultas a la base de datos. Al copiar la URL de la pagina donde esta el menú, note que se puede ingresar sin hacer la validación de usuario y contraseña. Entonces pensé, que pasaría si el usuaria le comparte la URL de la pagina donde esta el menú a otra persona que no tiene permisos? pues ingresará a los datos.

    Está claro que si un usuario accede a un módulo para el que no tiene permisos estamos ante un problema de seguridad… al fin y al cabo, ¡es lo mismo que no haber puesto un formulario de login! (Y en tal caso al menos nos habríamos ahorrado algo de trabajo, ¿no? 🙂 )

    La solución a este problema puede pensarse como la solución a dos sub-problemas:

    Cómo saber si un visitante pasó antes por una página de tu sitio

    Una forma de saber si un usuario ha visitado o no una página de tu sitio antes de llegar a la actual (En este caso view.html) es utilizar algún tipo de marca.

    La implementación más sencilla es utilizar el mecanismo de sesiones que provee PHP.

    Al hacerlo de esta forma te garantizas que la información acompañe al visitante a lo largo de todo su recorrido.

    El uso es muy simple, sólo tienes que escribir algo como:

    <?php
    
    session_start();
    $_SESSION['paso_por_index'] = true;

    Al comienzo del archivo que responde a la URI /index.html

    Cómo redireccionar a un visitante no autorizado

    Luego, el archivo que quieras ocultar debe comenzar con algo como:

    <?php
    
    session_start();
    
    if (!array_key_exists('paso_por_index', $_SESSION)) {
       header('Location: index.html');
       die;
    }

    De esta forma, si la marca no está colocada el script entenderá que el usuario no ha pasado por index.html al llegar a view.html y, en consecuencia, lo redireccionará a la página inicial.

  • ¿Por qué tantos programadores odian PHP?

    ¿Por qué tantos programadores odian PHP?

    PHP es un MAL lenguaje, es el VB de esta decada

    PHP hace que aumente la probabilidad de que te lleguen proyectos que sabes que no tendrán futuro.

    Un día entero desperdiciado gracias a php maldito seas.

    Muerte al php y apache admin

    ¿Te suena algo de esto? Apuesto a que sí.

    Y sin embargo, también se escuchan cosas como:

    Yo pensé que PHP era un mal lenguaje también. Pero me di cuenta que el idioma mejoró muchísimo después de la versión 7.

    2020 y sigue habiendo un montón de trabajo backend para PHP.

    yo no considero php mal lenguaje, solo existe desarrolladores con malas pràcticas

    Entonces… ¿en qué quedamos? PHP ¿es o no un mal lenguaje?

    Claramente la comunidad de desarrolladores está dividida en este punto.

    Quienes odian a PHP se han quedado con una visión bastante vieja de lo que era. Compartir en X

    Y sí, PHP fue un lenguaje muy malo… pero no olvides que se inventó por allá por 1994… ¿qué otro lenguaje de esa época todavía se usa?

    El PHP actual no tiene mucho que envidiarle a sus competidores más cercanos (Ruby, Python o NodeJs).

    • ¿Querés usar programación funcional en PHP? Es perfectamente posible.
    • ¿Querés usar un manejador de dependencias robusto? Probá composer.
    • ¿Querés hacer testing automatizado? Hay muchos frameworks que podés probar.

    Esto no significa que PHP no tenga sus problemas (como cualquier otro lenguaje), de hecho, su sintaxis no es de lo mejor.

    Un artículo muy conocido que resalta las falencias de PHP es este.

    Pero aún quienes odian el lenguaje no pueden pasar por alto el hecho de que más del 80% de la web está soportada por PHP.

    ¿Eso significa que el lenguaje es bueno? No necesariamente… pero lo que sí significa es que si vas a trabajar en la web, es muy probable que te encuentres con PHP en algún momento.

    ¿El lenguaje es malo o es malo el programador?

    Hay una realidad innegable: usando el mejor lenguaje se puede escribir código malo.

    Y lo inverso también es cierto: usando el peor lenguaje se puede escribir código bueno.

    En definitiva

    Es más importante la calidad del programador que la del lenguaje de programación. Compartir en X

    De modo que, si querés programar bien usando PHP:

    1. Conocé el lenguaje
    2. Conocé las buenas prácticas
    3. Conocé sus frameworks
    4. Compará con otros
    5. Sacá tus propias conclusiones

    Como en cualquier otro entorno, hacer las cosas bien con PHP es posible, pero requiere práctica y dedicación.

    Y sobre todo, la disciplina de no quedarse con la primera solución que viene a la mente.

    Si buscás mejorar tu forma de encarar tus desafíos acá hay algo que te puede interesar.

  • Cómo mejorar la calidad de tus aplicaciones PHP

    Cómo mejorar la calidad de tus aplicaciones PHP

    A nadie le gusta encontrar bugs en sus aplicaciones.

    Mucho menos que sea el cliente quien los encuentre.

    ¿Qué podemos hacer para evitar estas desagradables situaciones? Testear.

    Qué significa testear una aplicación

    Testear una aplicación puede significar varias cosas pero básicamente, se trata de probar el funcionamiento tratando de confirmar que todo ocurre según lo planeado.

    La parte desagradable del testing es que sólo puede darnos seguridad de que la aplicación falla.

    En otras palabras el hecho de que todas las pruebas resulten exitosas puede significar dos cosas:

    1. Que efectivamente la aplicación esté libre de errores
    2. Que no hayamos realizado suficientes pruebas

    Desafortunadamente no es posible determinar si estamos en la situación uno o la dos.

    ¡Claro que esto no significa que testear no valga la pena!

    El punto es que nunca podremos tener un 100% de confianza en que la aplicación es correcta… aunque tener algo de confianza es mejor que no tener nada.

    Qué tipos de testing existen

    Existen diversos tipos de pruebas que pueden realizarse en aplicaciones.

    La más básica es el testing manual.

    Este tipo de prueba se trata de uno mismo usando la aplicación como espera que lo haría un usuario y evaluando los resultados a ojo.

    Claramente se trata del testing más simple que puede realizarse pero, a su vez, el menos ventajoso:

    • Es lento
    • Es tedioso
    • Es poco confiable

    Una segunda categoría de tests son los automatizados y, dentro de ellos, existen subdivisiones:

    • Los tests unitarios
    • Los tests de integración
    • Los tests de aceptación

    Qué son los tests unitarios

    Los tests unitarios son aquellos en los que se prueba una parte muy específica del código (Un método por ejemplo).

    Se sabe de antemano qué resultado debe retornar una función dado un input y se verifica que así suceda.

    Qué son los tests de integración

    Los tests de integración son similares a los unitarios, salvo que lo que se prueba no es una unidad en aislamiento si no cómo dos o más unidades interactúan entre sí.

    Qué son los tests de aceptación

    Los tests de aceptación apuntan a verificar el correcto funcionamiento del sistema como tal, sin tomar en cuenta el código que está detrás.

    La idea de estas pruebas es automatizar las que se realizarían en forma manual.

    Qué herramientas pueden usarse para testear PHP

    Existen varias herramientas que pueden utilizarse para verificar el código escrito con PHP.

    La más conocida y utilizada es phpUnit.

    Si bien esta herramienta está diseñada para la realización de pruebas unitarias, es posible utilizarla en otros tipos de pruebas también.

    Las pruebas de aceptación requieren algún mecanismo de automatización de la interface de usuario (En el caso de aplicaciones web se trata de automatizar el navegador).

    Una herramienta muy interesante para realizar pruebas de aceptación es CodeCeption para escribir las pruebas y Selenium para automatizar el uso del navegador.

    ¿Qué partes del código deben ser testeadas?

    Como te podrás imaginar, no es posible tener el 100% del código cubierto por tests… una aplicación de mediana complejidad plantea un número realmente elevado de escenarios.

    Esto quiere decir que debemos elegir qué partes deben ser verificadas y cuáles no.

    La decisión no es sencilla, pero hay que tratar de fallar en favor de las partes críticas del sistema (Aquellas que, de no funcionar correctamente nos pondrían en serios problemas).

    La buena noticia es que los tests, al ser automatizados, pueden ejecutarse tantas veces como sea necesario y, a medida que se descubren nuevos inconvenientes, nuevos tests pueden ser agregados al conjunto, haciendo que la aplicación se robustezca más y más.

    ¿Lo único que puede hacerse es testear?

    No.

    Existe otra serie de herramientas que apuntan a detectar problemas antes de ejecutar el código.

    En lenguajes compilados por ejemplo, la verificación de compatibilidad de tipos de datos se produce antes de la ejecución de los programas… no es el caso de PHP.

    Herramientas como phpStan pueden ayudar a mejorar la calidad del código mientras se está desarrollando.

    Conclusión

    El testing es una práctica sumamente importante a la hora de realizar desarrollos profesionales.

    ¿De qué forma verificas la calidad de tus aplicaciones?

  • Cómo extraer las imágenes de un PDF usando PHP

    Trabajar con pdfs no es lo más cómodo del mundo.. especialmente cuando se trata de extraer información de ellos.

    Cuando se requiere realizar una misma tarea muchas veces es sumamente útil crear scripts para automatizar estas tareas.

    En este ejemplo te mostraré cómo extraer una imagen guardada en un documento como este:

    Por supuesto que no partiremos desde 0 habiendo tantas librerías disponibles.

    Qué librería PHP permite leer archivos PDF

    Existen diversas librerías para leer archivos PDF en PHP. Para este caso, una buena es https://github.com/smalot/pdfparser.

    Utilizarla es bastante simple.

    Comenzamos por instalarla usando Composer:

    composer require smalot/pdfparser

    Con esto tendremos acceso a objetos de tipo Smalot\PdfParser\Parser con los que podremos interpretar el contenido del archivo sin problemas.

    Lo próximo entonces es abrir el archivo utilizando las capacidades de la librería:

    <?php
    
    require_once 'vendor/autoload.php';
    use Smalot\PdfParser\XObject\Image;
    
    $parser = new \Smalot\PdfParser\Parser();
    $pdf    = $parser->parseFile($argv[1]);
    

    En este caso estoy usando un script que recibirá el nombre del archivo .pdf por la línea de comandos

    Cómo identificar una imagen dentro de un PDF

    Las imágenes dentro de los archivos pdf constituyen un tipo de objeto especial llamado XObject.

    Para identificarlos tenemos un método especial del parser: getObjectsByType que podemos utilizar de esta forma:

    foreach ($pdf->getObjectsByType('XObject') as $xobject) {
        ...
    }
    

    Ahora entonces tenemos en la variable $xobject la referencia a la imagen.

    Lo que nos falta es guardar ese contenido en algún archivo, enviarlo por email o cualquier otra cosa que queramos hacer.

    Simplemente se trata de utilizar el método getContent del objeto, por ejemplo:

    $images = array_filter($pdf->getObjectsByType('XObject'), fn($o) => $o InstanceOf Image );
    foreach ( $images as $image ) {
        file_put_contents( 'image_'.$i, $image->getContent());
    }
    

    Y luego, si quisiéramos conocer el número de imágenes que había podríamos hacer un echo count($images);