Archivo de la etiqueta: Programación

Conocer el sistema operativo donde se ejecuta nuestro PHP – PHP Tips

A veces podemos vernos en la necesidad de conocer que sistema operativo, o versión de este es en el que se esta ejecutando nuestro codigo PHP, por ejemplo si necesitamos establecer la configuración de las locales.

Tenemos dos opciones para conocerlo, la primera es por medio de la constante PHP_OS, y otra es con la función php_uname(). La primera solo nos va a devolver el sistema operativo, p.e Linux, FreeBSD, WINNT, … en cambio con la funcion nos devolvera una información mas completa. Por ejemplo

 

echo php_uname();
echo PHP_OS;

/* Algunas posibles:
Linux localhost 3.2.0-27-generic #43-Ubuntu SMP Fri Jul 6 14:46:35 UTC 2012 i686
Linux

FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD

Windows NT XN1 5.1 build 2600
WINNT
*/

 

La funcion php_uname(), puede aceptar varios parametros, mode para poder especificar que tipo de salida queremos. Estos parametros son:

  • ‘a’: Es la opción por defecto. Contiene todos los modos de la secuencia «s n r v m».
  • ‘s’: Nombre del sistema operativo. eg. FreeBSD.
  • ‘n’: Nombre del host. eg. localhost.example.com.
  • ‘r’: Nombre de la distribucion. eg. 5.1.2-RELEASE.
  • ‘v’: Informacion de la version. Varia mucho dependiendo de los sistemas operativos.
  • ‘m’: Tipo de maquina. eg. i386.

 

echo php_uname();
// Linux pajaroto.ensenalia.com 3.2.0-27-generic #43-Ubuntu SMP Fri Jul 6 14:46:35 UTC 2012 i686
echo php_uname('s');
// Linux
echo php_uname('n');
// Localhost
echo php_uname('r');
//3.2.0-27-generic
echo php_uname('v');
// #43-Ubuntu SMP Fri Jul 6 14:46:35 UTC 2012
echo php_uname('m');
// i686

+ Info http://es.php.net/manual/en/function.php-uname.php

Borrar un dato de dos tablas con la misma consulta – MySQL Tips

MySQLSeguramente en alguna ocasión nos habremos visto, o nos podemos ver en la situación de borrar de dos tablas un dato, un ejemplo clásico seria el de creo una factura y esta contiene productos, con lo que podríamos tener una tabla de Facturas y otra tabla que fueran detallesFacturas, en la primera guardaríamos los datos generales de la factura y en el la segunda los artículos o lineas que comprondría la factura, pues bien, si borro la factura tengo que borrar también los artículos que estaban en esa factura, y eso tendría que poder hacerlo con una sola consulta.

Tabla Facturas Tabla detallesFacturas
Id Id
 (Resto campos) IdFactura
IdProducto
(Resto campos)

Imaginemos que tenemos la factura 123 y tenemos que borrarla y queremos borrar también todos los registros referentes a esa factura en la tabla detallesFactura.

La consulta de borrado quedaría así

DELETE a1, a2 FROM Facturas AS a1 INNER JOIN detallesFacturas AS a2
WHERE a1.Id=a2.IdFactura AND a1.Id LIKE 123;

Otra opción podria ser

DELETE FROM a1, a2 USING Facturas AS a1 INNER JOIN detallesFacturas AS a2
WHERE a1.Id=a2.IdFactura AND a1.Id LIKE 123;

Y con esta consulta borraríamos la factura de la tabla Facturas y los datos de la factura que hubiera en la tabla de detallesFacturas.

Mas info aqui: http://dev.mysql.com/doc/refman/5.1/en/delete.html

Libreria para formatear numeros con Javascript

Una librería de JavaScript muy útil para dar formato a los números a la hora de presentarlos en el formato que queramos, la posición de las comas y los puntos, el símbolo de la moneda, valores negativos.

Formatting numbers in JavaScript – mredkj.com.

Fechas PHP a MySQL y vuelta – MySQL Tips

PHP Programming languageUna de las cosas con las que toca lidiar practicamente siempre que trabajamos con fechas contra una base de datos MySQL es que la base va MySQLa almacenar las fechas de la manera ISO «año-mes-dia» y nosotros a la hora de trabajar trabajos con el formato Europeo, ya sea «dia-mes-año» o «dia/mes/año».

Durante muchos años trabajaba con la tecnica de la función bidireccional, es decir, me creaba una función la cual cuando le llegaba la fecha la convertia en un sentido u otro.

function cambiaFormatoFecha($fechaOriginal)
{
 //Dividimos la fecha de la hora si existe
 $partesStamp = explode(" ", $fechaOriginal);
 // La primera parte es la fecha, la segunda la hora
 $partesFecha = explode ( "-", $partesStamp[0] );
 // La fecha final
 return $partesFecha[2] ."-".$partesFecha[1]."-".$partesFecha[0];
}

MySQL guarda las fechas separadas por guiones, así que si nosotros definimos el formato de fecha separado con guiones, pues eso que tenemos ganado y esta función nos convierte tanto nuestras fechas cuando las introducimos como las fechas que devuelve el MySQL.

Trabajar con esto puede parecer que es una gran ventaja, pero la verdad que a nivel de rendimiento no lo es ya que supone ejecutar la función cada vez que aparezca un registro de fecha.

Una solución bastante mas eficiente es la de procesar las fechas en la consulta. Para eso utilizaremos las funciones incorporadas de MySQL DATE_FORMAT y STR_TO_DATE.

Si queremos unos registros de una determinada fecha podemos hacer:


SELECT * FROM `tabla` WHERE fecha LIKE STR_TO_DATE('mifecha','%d-%m-%Y);

En esta consulta mifecha esta en el formato dia-mes-año

Si queremos ver las fechas en el formato dia-mes-año


SELECT DATE_FORMAT(fecha,'%d-%m-%Y) FROM `tabla`;

Para mas información

STR_TO_DATE http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_str-to-date

DATE_FORMAT http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-format

Datepicker Jquery en castellano

Dejo el codigo del datepicker de Jquery para que salga en formato castellano


$('.datepicker').datepicker({
dateFormat: "dd-mm-yy",
firstDay: 1,
dayNamesMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],
dayNamesShort: ["Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"],
monthNames:
["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
"Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
monthNamesShort:
["Ene", "Feb", "Mar", "Abr", "May", "Jun",
"Jul", "Ago", "Sep", "Oct", "Nov", "Dic"]
});

view raw

datepickerEs.js

hosted with ❤ by GitHub

He creado otro Gist con una demo de como crearlo sin necesidad de hacer clic en el input
https://gist.github.com/sbarrat/5691044

La documentación de jQuery UI http://jqueryui.com/demos/datepicker/

Función que nos devuelve el numero de días de un mes

Mas de una vez nos habremos visto en la duda de, como hacer que según el mes y el año que hemos marcado que nos de los dias que tiene ese mes, pues bien, en php hay una función interna que nos facilita el trabajo, esta es cal_days_in_month, y hay que pasarle como parametros el calendario que queremos, por ejemplo CAL_GREGORIAN, el numero del mes, y el año y nos devuelve el numero de dias que tuvo ese mes.

$numeroDias = cal_days_in_month(CAL_GREGORIAN, 10, 2008);
echo $numeroDias; //Devolvera 31

vía PHP: cal_days_in_month – Manual.

phpmaster | 10 Tips for Better Coding

 

Gran articulo en el que se ven 10 puntos que hay que tener muy en cuenta a la hora de programar un buen y mantenible codigo php.

phpmaster | 10 Tips for Better Coding.

Clase para la devolución de la entrada por teclado con JAVA

Duke, the Java Mascot, in the waving pose. Duk...
Image via Wikipedia

Hay trozos de código que nos cansamos de escribirlos constantemente, y en la mayoría de los casos acabamos copiandola y pegándola de una aplicación a otra. Uno de estos trozos podria ser el recoger datos de teclado en una clase JAVA y devolverlos por pantalla.

package entrada;
import java.io.*;
/**
 * @author Ruben Lacasa
 *
 */
public class Entrada {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String param = getEntrada("Introduzca un texto: ");
		System.out.println("Has introducido " + param);
	}
	/**
	 * Recoge lo que hemos escrito y lo devuelve
	 * 
	 * @param peticion
	 * @return
	 */
	public static String getEntrada(String peticion) {
		BufferedReader stdin = new BufferedReader(
				new InputStreamReader(System.in));
		System.out.print(peticion);
		System.out.flush();
		try {
			return stdin.readLine();
		} catch (Exception e) {
			return "Error: " + e.getMessage();
		}
	}
}

Esta funcion tambien esta disponible como Gist en Github aqui

jqGrid jQuery plugin – La navaja suiza para jQuery

Saber sabemos que existen multitud de plugins para jQuery los cuales hasta que no nos ponemos a buscar por que lo necesitamos para algo ni nos planteamos usarlo, sencillamente continuamos con nuestro flujo de trabajo. JqGrid es un plugin al cual, yo por lo menos llegue a el buscando algún complemento de jQuery que me generara tablas. Cual fue mi sorpresa al descubrir que no solo generaba las tablas con paginación sino que ademas permitía el filtrado por campos, la búsqueda por campos, y si no fuera poco la creación, modificación, y borrado de registros, ahí un todo en uno, y mas aun coge el estilo de nuestro tema de jQuery.

Pero no todo iba ha ser bueno, la parte mas dura de este plugin es lo farragoso que puede ser en un principio configurarlo todo, la cantidad de parametros que se amontonan para poder generarlo todo, eso si una vez puesto todo, la parte de php se reduce a una funcion que se encarge de la busqueda sql y que acepte los parametros, se envia por $_GET el parametro _search que es true o false, y otra funcion que se encarge de recibir el $_POST[‘oper’] que es edit, add o del, según el que sea se hace una operación u otra y una vez realizada se refresca la pantalla y aparecen los resultados.

Ademas acepta la posibilidad de integrar el autocomplete tanto en la busqueda como en la edicion, asi como el datepicker, y la función que nosotros queramos.

En conclusion, una autentica maravilla, que al principio puede costar manejarla y controlar todas las opciones que tiene, pero que una vez configurada nos facilitara mucho el trabajo.

+ Info:

Documentacion: http://www.trirand.com/jqgridwiki/doku.php

Ejemplos: http://www.trirand.com/blog/jqgrid/jqgrid.html

Subquery Vs. Join – MySQL Tips

Tengo una aplicación web en la cual muestro los datos de las facturas de clientes, junto con el nombre de cliente. Desde un principio observe que la consulta un poco mas de lo normal, asi que me puse a investigar.

Propiedades de las tablas:

La tabla clientes tiene los tipicos campos, los que nos interesan son Id y Nombre, y luego el Id es PrimaryKey, NotNull, AutoIncrement, y tiene 732 registros

La otra tabla es regfacturas, en la cual se registran los datos importantes de las facturas, los campos que nos interesan son el id y el idCliente, el id es PrimaryKey, NotNull, AutoIncrement y el idCliente no esta definido como ForeingKey, luego probaremos a definirlo a ver que resultados nos salen. Esta tabla tiene 4950 registros.

Las dos tablas son InnoDB y como collation utf8, la version del servidor es 5.1.58 y voy a efectuar las consultas en la consola de MySQL.

Nota: Para que los resultados sean efectivos es recomendable efectuar un vaciado de la cache de consultas:


flush query cache;

La consulta original es:


Select r.id as id,r.codigo as codigo,r.fecha as fecha,r.importe as importe ,r.obs_alt as obs_alt,
 c.Nombre as nombre from regfacturas as r join clientes as c on r.id_cliente like c.id order by r.fecha desc

Los resultados de esta consulta fueron: 4945 rows in set (1.71 sec)

Visto estos tiempos, me plantee modificar la consulta y hacerla con subquery

La consulta con subquery es:


Select id, codigo, id_cliente as idCliente,
date_format(fecha,'%d-%m-%Y') as fecha,
importe, obs_alt as observaciones,
(Select Nombre from clientes where id = id_cliente) as cliente
FROM regfacturas order by fecha desc

Los resultados de esta consulta fueron: 4950 rows in set (0.16 sec)

Vistos estos resultados uno dice menuda diferencia entre la subquery y el join, entonces para que usar join, a partir de ahora todo a subquerys. Antes de lanzarnos como locos vamos a afinar un poco mas.

Vamos a probar ahora la consulta con join pero sin la ordenacion de fechas a ver si es eso lo que hace que funcione lenta


Select r.id as id,r.codigo as codigo,r.fecha as fecha,r.importe as importe ,r.obs_alt as obs_alt,
 c.Nombre as nombre from regfacturas as r join clientes as c on r.id_cliente like c.id

Los resultados de esta consulta fueron: 4945 rows in set (1.68 sec)

Parece que sin la ordenacion de fecha ganamos algo de velocidad, aunque el tiempo de respuesta sigue siendo inaceptable

Probemos ahora con la subquery


Select id, codigo, id_cliente as idCliente,
date_format(fecha,'%d-%m-%Y') as fecha,
importe, obs_alt as observaciones,
(Select Nombre from clientes where id = id_cliente) as cliente
FROM regfacturas

Los resultados de esta consulta fueron:  4950 rows in set (0.12 sec)

Con estos resultados vemos que la ordenación tanto en una como en otra tabla tiene un coste de entre 0.03 – 0.04 , y que con esta estructura de tabla es muchisimo mas rapido el uso de subquery que de inner joins

Agregando una ForeingKey

Al ir a agregar una ForeingKey al id_cliente me dio el siguiente error

ERROR 1452: Cannot add or update a child row: a foreign key constraint fails

Googleando descubri que no se podia agregar por que habia registros en la tabla en la cual queria crear la clave foranea que no estaban en la otra tabla.

Para descubir cuales eran estos registro hize la siguiente consulta:


SELECT COUNT( * ) AS cuenta
FROM regfacturas t1
LEFT JOIN clientes t2 ON t1.id_cliente = t2.id
WHERE t2.id IS NULL

El resultado de esta consulta nos dio 5, lo que nos quiere indicar que tenemos 5 campos que estan mal
A continuacion haciendo la siguiente consulta

SELECT * FROM regfacturas t1 LEFT JOIN clientes t2 ON t1.id_cliente = t2.id WHERE t2.id IS NULL

Salieron los campos que nos daban problemas, los borramos, y ya se pudo establecer la FK.
Ahora que ya la tenemos definida vamos a repetir las consultas a ver que sale
La consulta con inner Join dio el siguiente resultado: 4945 rows in set (1.80 sec)
Y la consulta con subquery: 4945 rows in set (0.13 sec)


Con estos resultados podemos decir que en determinados casos es mas rapido usar subquery que inner join, y que establecer foreing keys hace que la consulta se ralentize sobre todo en el caso del uso de inner join