Entradas

Mostrando las entradas etiquetadas como script php

GraphQL en Zend Expressive 3

Imagen
Voy a intentar hacer una guia de paso a paso para utilizar GraphQL en Zend Expressive 3 . Existe algo de documentación por la red pero, o está incompleta o desactualizada, por eso me he decidido a hacer este manual. ¿Que vamos a utilizar? La última versión de Zend Expressive 3 y la implementación de GraphQLpara PHP hecha por webonyx . Otro día hablaré del por qué Zend Expressive. ¿Comenzamos? Lo primero es crear un proyecto $ composer create-project zendframework/zend-expressive-skeleton graphql-expressive Recuerda que el directorio graphql-expressive debe estar vacío. Ahora añadimos las dependencias para GraphQL $ cd graphql-expressive $ composer require webonyx/graphql-php Ahora vamos con el código, lo primero que haremos será configurar un middleware para procesar correctamente las peticiones en JSON, editamos el archivo config/pipeline.php agregando estas dos líneas: use Zend\Expressive\Helper\BodyParams\BodyParamsMiddleware; ... $app->pipe...

Personalizar las tablas users y password_resets en Laravel 5.6

Imagen
La autenticación en Laravel es un proceso muy sencillo, pero de tan sencillo personalizarlo tiene sus detalles, en este post veremos como personalizar, en parte, las tablas de usuarios y reinicio de contraseñas. Según lo estricto que seas con la estructura de tu base de datos y el formato que hayas elegido seguir puede que los valores de los campos y las tablas por defecto de Laravel no sean de tu agrado, como es mi caso, por ejemplo: Laravel prefiere minúsculas y plurales para los nombres de las tablas, yo utilizo UpperCamelCase y singular. Para los nombres de los campos Laravel utiliza guión bajo (underscore) y minúsculas, yo prefiero lowerCamelCase, con lo cual, necesito renombrar los siguientes campos de estas tablas: remember_token - rememberToken  created_at - createdAt updated_at  - updatedAt id - userId Y renombrar las tablas: users - User password_resets - PasswordReset Si utilizas las migraciones de Laravel tienes que cambiar los nombres de las...

Reduciendo el tamaño de mPDF

Imagen
mPDF es una clase PHP que genera archivos PDF desde HTML con codificación UTF-8. Se basa en FPDF y HTML2FPDF, con una serie de mejoras. Según el propio autor la librería, que ya va por su versión 6.0 y es sobre la que hablaré en este post, se creó para producir archivos PDF de diferentes idiomas al vuelo. Es más lento que los scripts originales, por ejemplo HTML2FPDF, y produce archivos más grandes cuando se usa Unicode, pero tiene soporte de estilos CSS y muchas mejoras . Pero bueno, si has llegado hasta aquí buscando como reducir el tamaño de esta librería supongo que sepas lo anterior así que vamos al grano. Este post va dedicado a todos aquellos que generan PDF pero que no requieren funcionalidades extras, en mi caso solo necesito que un HTML en español e inglés, con imágenes y estilos básicos sea convertido en un PDF de una sola página, por ejemplo el siguiente código: $mpdf = new mPDF('en-GB-x','A4','','',5,5,5,5,0,0); $mpdf->mirrorMargins =...

El modo pasivo de FTP en PHP

Antes de cualquier explicación debemos saber las diferencias entre el modo activo y el modo pasivo en FTP. Podemos decir, resumiendo mucho, en modo pasivo las conexiones son siempre abiertas por el pc cliente , mientras que en modo activo se abren por el que envía los datos, el servidor si se trata de bajar archivos o información al pc local, el cliente si se trata de subir archivos al servidor. Tendiendo lo anterior en cuenta en el modo activo se abre una conexión para datos desde el servidor a la maquina cliente, esto es, una conexión desde fuera hacia dentro; si la maquina cliente está protegida por un firewall, este filtra o bloquea la conexión entrante al serle un proceso desconocido. En modo pasivo es el cliente el que inicia ambas conexiones, de control y de datos, con lo cual el firewall no tiene ninguna conexión entrante que filtrar. Por este motivo la razón de que algunas funciones de PHP nos funcionen en un servidor u otro con el mismo código no depende de la versión inst...

Nuevas funcionalidades en PHP 5.5

Una vez que hemos visto todas las ventajas que nos puede traer PHP 5.4 y sabiendo que esta no es la última versión estable sería interesante ver cuáles son las ventajas de esta para una vez decididos migrar optemos por una u otra. Generadores Una de las necesidades de programación más comunes, es ser capaz de realizar una acción sobre todos los elementos de un objeto. Por ejemplo, usando un foreach en una matriz, para obtener cada clave o, un foreach sobre un objeto, para obtener el nombre de cada parámetro y su valor. El mecanismo para la aplicación de este comportamiento es conocido como un iterador, que se utiliza para recorrer todos los elementos de un objeto o una matriz. Los iteradores se pueden definir de forma explícita con clases personalizadas, pero eso puede ser un proceso difícil de manejar y complejo, con apaños y, más que un puñado de funciones. ¿Qué pasa si quiero actuar en un subconjunto de una matriz, y realizar algo de lógica a medida que avanzo, pero aún así ser...

Rellenar SELECT con AJAX y jQuery

Uno de los usos más básicos con AJAX es rellenar combos (SELECT). Pero no por básico dejar de ser a veces complicado. Lo primero que debemos saber es que las funciones AJAX de jQuery utilizan la codificación UTF-8 tanto para recibir como para enviar datos. Existen mil maneras de pasar los datos con AJAX aunque las más lógicas serían las que utilizan formatos unificados para el tráfico de datos como son XML y JSON. Particularmente a mi me gusta mucho más utilizar JSON pero en Chrome si creamos un objeto JSON a partir de un array numerado el objeto resultante se ordena obviando el orden que se le haya dado previamente . Rellenando un SELECT con XML Lo primero que haremos será construir un objeto XML codificado en UTF-8 para ello podemos ayudarnos de funciones como utf8_encode en caso de que los valores vengan codificados en ISO. Aquí es dejo un ejemplo de un XML $xml = new XmlWriter(); $xml->openMemory(); $xml->startDocument('1.0', 'UTF-8'); $xml-...

Obtener tags de videos con PHP

Imagen
Buscando alguna clase para PHP con la que pudiera obtener los tags de información de cualquier tipo de archivo multimedia (AVI, MP3) he descubierto una utilidad bastante interesante, no es una librería de PHP sino una herramienta externa con la cual podremos procesar cualquier archivo de video y obtener toda la información disponible del mismo. La herramienta se llama MediaInfo y es un programa ejecutable al que pasándole la ruta del archivo nos devuelve toda la información, la cual podemos analizar y utilizar solo los campos necesarios. Lo primero que debemos hacer es descargarnos la última versión de MediaInfo pero solo el cliente (esta explicación la haré para Windows pero utilizando el mismo procedimiento es totalmente compatible con Linux). Una vez descargado, descomprimimos el archivo ZIP y ubicamos los archivos en algún lugar de fácil acceso, en mi caso c:\Program Files\MediaInfoShell\. La sintaxis para obtener la información de un video es la siguiente: mediainfo.exe -...

Eliminar espacios repetidos en PHP

El post de hoy es bastante corto, voy a dejaros un pequeño código que elimina los espacios en blanco repetidos en el medio de una cadena , utilizando para ello expresiones regulares en PHP. Nota: el código está actualizado para utilizar las funciones de expresiones regulares más actuales de PHP y los las deprecadas. El código para eliminar estos espacios en blanco repetidos en el medio de cualquier cadena para PHP es el siguiente: $cadena_sin_espacios = preg_replace('/( ){2,}/u',' ',$cadena_con_espacios); Ejemplo: Esta    cadena    contiene   espacios    repetidos Quedaría así Esta cadena contiene espacios repetidos. Espero que os sea tan útil como la encuentro yo.

Archivos grandes con PHPseclib

Imagen
Uno de los mejores conjuntos de plugins, o clases, o librerías externas, para PHP es PHPseclib (PHP secure library) la cual implementa de manera mucho más intuitiva las funcionalidades para acceder a servidores con SSH y SFTP. Lo malo de casi todas estas librerías es que no son distribuciones oficiales y por tanto estamos sujetos a los intereses o convicciones de cada programador. Las ventajas de PHPseclib son muchísimo mayores que sus desventajas, que las hay, una de ellas por ejemplo es su incapacidad de gestionar correctamente el tamaño de archivos superiores a 4 GB. Según reza en la misma documentación de la clase: Los archivos de más de 4GB se mostrarán como si tuviesen exactamente 4GB. Los tamaños de archivos están representado por un número entero de 64 bits, no se debe utilizar Net_SFTP para transferir archivos con más de 4 GB (0xFFFFFFFF bytes) porque todos los tamaños de los archivos que son más grandes se representarán como 4GB. La solución para esto es reescribir la f...

Convertir Minutos o Segundos a fecha formateada

A veces tenemos un valor de minutos o segundos y queremos convertirlo a una cadena de tiempo formateada del tipo x horas x minutos etc. Esta clase que os voy a presentar ahora es precisamente para ello. La clase se basa en la modificación de una clase parecida que lo que hace es dando una fecha determinada calcula el tiempo que ha pasado desde esa fecha hasta el momento actual, la clase original se puede encontrar en el post Clase para mostrar fechas al estilo “hace 1 dia 6 min” con PHP . class haceTanto extends DateTime { protected $strings = array( 'y' => array( '1 año' , '%d años' ), 'm' => array( '1 mes' , '%d meses' ), 'd' => array( '1 día' , '%d dias' ), 'h' => array( '1 hora' , '%d horas' ), 'i' => array( '1 min' , '%d minutos' ), ...

Los like en SQL y la función sprintf de PHP

Esto más que un fallo es algo de sentido común pero que le puede pasar a cualquiera, supongamos que tienes una consulta: $query = “select a from b where c like ‘%hola’ and d = ‘34’”; Imaginemos que hola es una expresión constante entonces podríamos hacer lo siguiente: $query = “select a from b where c like ‘%hola’ and d = ‘%d”; $query = sprintf($query,$valor_numerico); Aquí $query tendría valor vacío porque sprintf interpreta todos los caracteres % como parámetros de la función, lo correcto sería: $query = “select a from b where c like ‘%s’ and d = ‘%d”; $query = sprintf($query,”%hola”,$valor_numerico);

Calcular último día de cada mes con PHP

En el siguiente post voy a publicar algunas variantes en PHP para calcular el último día de un mes y un año dado (o lo que es lo mismo: cuantos días tiene un mes) Voy a mostrar 3 opciones en orden de preferencia. Devolver el número de días de un mes para un año y un calendario dados Para esto utilizaremos la librería (extension=calendar.so) de PHP Calendario (php5-calendar) la cual hay que instalar primero . Luego llamaremos a la función cal_days_in_month que nos devolverá el número de días del mes del año para el calendario especificado. En caso de que la función cal_days_in_month no esté definida porque no podamos instalar la librería calendar entonces podremos utilizar la función date como sigue a continuación: date('t', mktime(0, 0, 0, $month, 1, $year)) La opción t de la función date de PHP nos devuelve el número de días del mes dado. Y si somos más artesanales podemos utilizar la función de PHP checkdate con un pequeño script: function GetLastDayofMonth($...

Trucos o atajos en PHP

Imagen
Leyendo un artículo del blog de Pedro Ventura sobre PHP se me ocurrió la idea de escribir un post con las cosas que me han asombrado y/o ayudado en algún momento específico en PHP, no son scripts concretos ni mucho menos, son mas bien trucos o atajos poco conocidos de este lenguaje de programación. Voy a dividir el post en varias secciones e intentaré agrupar en cada una os trucos o atajos que me han llamado la atención. Validaciones en PHP Validar siempre es una tarea difícil no, más bien tediosa y a veces he echado en falta algunas características de Java muy particulares como pasar a las funciones variables específicas, para mi sorpresa en PHP ya está soportado ese tema y puedes definir una función y decirle de qué tipo es la variable que le estas pasando, la sintaxis sería la siguiente: funcion name (ObjectType variable){} Muchas veces necesitamos trabajar con librería y aunque en local o en nuestro server las tengamos instaladas siempre es bueno validar que estén cargadas, e...

Calcular el día máximo de un mes

Para celebrar el nuevo diseño del blog, por cierto muy buena la actualización de blogger para cambiar el diseño y las plantillas, os dejo esta función que según el mes te devuelve el día máximo del mes, o sea de enero el 31 y febrero si es un año bisiesto 29 y de lo contrario 28. Espero que os sirva: function dameMaximoDiaMes($mes,$anno = null){ if (is_numeric($mes) && ! empty ($mes) && $mes < 13){ $largos = array (1,3,5,7,8,10,12); $cortos = array (4,6,9,11); if (in_array($mes,$largos)) return 31; if (in_array($mes,$cortos)) return 30; if ( empty ($anno) || !is_numeric($anno) || $anno < 0) return 28; $cualquiera = "$anno-01-01" ; $biciesto = date( "L" ,strtotime($cualquiera)); return (! empty ($biciesto))?29:28; } return false; } ¿Alguna otra forma?

Convertir fechas de excel a PHP

Un archivo de Microsoft Excel almacena las fechas en un formato numérico que corresponde a los días desde el 1 de enero de 1900, teniendo en cuenta que php las fechas las guarda a partir de 1970 y en segundos pues es un poco engorroso convertir una fecha de un formato a otro, para ello PHPExcel de codeplex tiene una clase llamada PHPExcel_Shared_Date con una función estática que hace esta operación, la función como tal se llama ExcelToPHP y devuelve la cantidad de segundos correspondientes a la fecha en PHP. Podemos utilizarla de la siguiente forma: // leo el archivo excel $objPHPExcel = HPExcel_IOFactory::load('prueba.xlsx'); // utilizo como activa la hoja 1 $objPHPExcel->setActiveSheetIndex(0); $objWorksheet = $objPHPExcel->getActiveSheet(); // obtengo el valor de la celda $fecha_excel = objWorksheet->getCell('A1')->getValue(); // utilizo la función y obtengo el timestamp $timestamp = PHPExcel_Shared_Date::ExcelToPHP($fecha); $fecha_php = date(...

Comparar con cero en php

PHP tiene mucha flexibilidad y muchas herramientas para comparar valores aunque no deja de tener algunas particularidades especiales a la hora de tratar los valores vacíos, por ejemplo si tenemos: a = ‘’; si hacemos a == 0 esto devolverá true y si hacemos (int)a === 0 también devolverá true. Con ello sacamos la conclusión de que el valor vacío de una cadena al llevarlo a valor numérico es cero. Como otro ejemplo si tenemos un formulario el cual tiene valor 0 (un input de texto por ejemplo, aunque es válido para todos) al recibirlo nuestro script en PHP tendríamos que: si hacemos $_POST[‘variable’] === 0 esto daría false tenemos que compararlo de esta forma $_POST[‘variable’] === ‘0’ (como cadena). Concluyendo: si utilizamos el operador == los siguientes valores son iguales 0, ‘0’, (int)’’, ‘’, FALSE, false. En cambio si utilizamos el operador === todos estos valores son distintos salvo (int)’’ que si es igual a 0.

Convertir números romanos en PHP

He reutilizado una clase en PHP de Víctor De la Rocha que convierte números romanos en arábigos y viceversa para agregarles nuevas funciones y compatibilidad con PHP 5, si necesitas una clase que: convierta de números romanos a arábigos (números normales) convierta de decimales a números romanos valide números romanos Entonces esta es tu clase y puedes descargarla en el enlace: clase para convertir números romanos a decimales . Nota: se puede utilizar tanto como un objeto o como funciones estáticas. La función para saber si un número es romano o no utiliza expresiones regulares a la hora de validar los números romanos introducidos.

DOMPDF y codificaciones utf-8

Algunas veces cuando generamos con dompdf un archivo a partir de un html si este contiene caracteres en castellano como acentos, etc; es muy posible que no se muestren partes del texto en el archivo generado, para corregir esto solo basta con utilizar la función de php utf8_encode de la siguiente manera: $dompdf = new DOMPDF(); $dompdf->load_html(utf8_encode($htmlbuffer)); $dompdf->render(); $dompdf->stream("file.pdf"); No ocurre siempre que no se muestren todos los caracteres, es posible que una misma frase se muestre unas veces sí y otras no, es más bien un bug de esta clase en php pero de esta manera es muy sencillo corregirlo.

Variables por referencia y por defecto

En PHP es posibles pasar variables por referencia (punteros) a una función y también en una función a los parámetros darles valores por defecto en caso de que no se pasen estos, mi pregunta era ¿pueden estos dos casos convivir en una misma variable? Y la respuesta es sencilla, en PHP sí, se puede tener un parámetro de una función que sea por referencia y a su vez que tenga un valor por defecto. Gráficamente sería lo siguiente: function miFuncion(&$parametro = “valor por defecto”) con lo cual podríamos llamar a la función de la siguiente forma: miFuncion() Yo le encontré utilidad ¿vosotros?

Comparar cadenas con cero en PHP

Imagen
Hoy me ha ocurrido una cosa muy curiosa y a mi entender es un bug de PHP, la explicación no la sé pero tendrá algo que ver con la forma de interpretar PHP las cadenas. Pongamos un ejemplo: $cadena = “1234”; $numero = 0; echo ($cadena == $numero)?”Son iguales”:”Son distintos”; El resultado sería son distintos porque php interpreta a $cadena como un número y por supuesto este numero es distinto de cero. Sin embargo si: $cadena = “hola”; El resultado que debería ser el mismo que en la opción anterior porque videntemente son distintos es son iguales . Asombrosamente php interpreta esta cadena como falso y por tanto falso == falso es verdadero. La solución es no utilizar el operador == si se puede dar este caso sino el operador === que si funciona porque es estrictamente igual.