domingo, 18 de septiembre de 2011

Insertar fechas en MySQL

El formato más común para insertar una fecha en MySQL es “Y-m-d”. Para logar esto desde PHP basta con:

$Fecha = date("Y-m-d");

Teniendo nuestra fecha en el formato correcto podemos pasarla a nuestro Stored Procedure o utilizarla para formar nuestro Query (en dado caso no se olviden de prevenir la inyección SQL). Les dejo unos ejemplos de otros formatos también aceptados.

// http://dev.mysql.com/doc/refman/5.0/es/using-date.html
mysql> INSERT INTO nombre_de_tabla (idate) VALUES (19970505);
mysql> INSERT INTO nombre_de_tabla (idate) VALUES ('19970505');
mysql> INSERT INTO nombre_de_tabla (idate) VALUES ('97-05-05');
mysql> INSERT INTO nombre_de_tabla (idate) VALUES ('1997.05.05');
mysql> INSERT INTO nombre_de_tabla (idate) VALUES ('1997 05 05');
mysql> INSERT INTO nombre_de_tabla (idate) VALUES ('0000-00-00');

mysql> SELECT idate FROM nombre_de_tabla WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM nombre_de_tabla WHERE idate >= 19970505;
mysql> SELECT MOD(idate,100) FROM nombre_de_tabla WHERE idate >= 19970505;
mysql> SELECT idate FROM nombre_de_tabla WHERE idate >= '19970505';

Sumar días, meses, años a una fecha en PHP

Ok, los ejemplos los mostrare sumando un mes a la fecha pero para días o años es básicamente lo mismo.

Primera opción

La forma más sencilla es la siguiente, solo toma una línea de código y ya.

echo date("m/d/Y", strtotime("09/17/2011 +1 month"));

También podemos hacerlo si tenemos la fecha en una variable.

$Fecha = "09/17/2011";
echo date("m/d/Y", strtotime("$Fecha +1 month"));

Para sumarle a la fecha del sistema sería similar.

echo date("m/d/Y", strtotime(date("m/d/Y")." +1 month"));

Incluso podemos sumar días, semanas, horas, etc.

//http://php.net/manual/es/function.strtotime.php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

Segunda opción

Un poco más extensa pero aun sencilla. Lo mejor es que si algún valor se sale de rango (por ejemplo 14 meses) automáticamente nos incrementa los años.

$FechaArreglo = explode("/", date("m/d/Y", strtotime("09/17/2011")));
$Fecha = mktime(0, 0, 0, $FechaArreglo[0]+1, $FechaArreglo[1], $FechaArreglo[2]);
echo date("m/d/Y", $Fecha);

Con la fecha del sistema es un poco más sencillo.

$Fecha = mktime(0, 0, 0, date("m")+1, date("d"), date("Y"));
echo date("m/d/Y", $Fecha);

Tercera opción

Sumarle segundos a una fecha. Esta es una buena opción si queremos incrementar segundos, minutos, horas o incluso días a una fecha. Para sumar meses o años tendríamos que tener ciertas consideraciones ya que no todos los meses tienen el mismo número de días.

$Fecha = strtotime("09/17/2011")+(60*60*24);
echo date("m/d/Y",$Fecha);

sábado, 17 de septiembre de 2011

Obtener la última ID insertada en una tabla con Autoincrement para MySQL

Hay ocasiones en las que queremos obtener la última ID insertada en una tabla la cual hemos especificado con Autoincrement, ya sea para para insertarla en otra tabla (una relación) o por ejemplo para generar un link dinámicamente (pagina.php?articulo=123). En ciertas circunstancias bastaría con un simple “Select ID From Tabla1 Where CampoUnico=ValorInsertado” donde CampoUnico podría ser Email o Nombre de usuario. Pero ¿qué pasa si la tabla en cuestión no tiene campos con valores únicos?

Bueno por esta razón lo más recomendable es usar LAST_INSERT_ID(), un método (como su nombre lo indica) que nos regresa la última ID insertada en nuestra tabla para un campo Autoincrement. Su objetivo vendría siendo el mismo que @@identity de Microsoft SQL Server.

LAST_INSERT_ID vs MAX(id)

Investigando un poco por internet nos podemos topar con otro método (Muy malo para la situación que tenemos planteada hoy) el cual consiste en seleccionar la ID de valor más alto “Select MAX(id) From tabla1” y digo malo porque si otro usuario inserto un nuevo registro, nuestro Select nos podría regresar la ID de alguien más. A diferencia de LAST_INSERT_ID que le regresa el valor deseado a cada Conexión.

Código

Bueno aquí esta lo que seguramente les interesa, un ejemplo:

INSERT INTO Tabla1(Titulo) VALUES("dddd");
SELECT LAST_INSERT_ID();

Caso especial

Hay un caso un poco raro en el que LAST_INSERT_ID podría no funcionar. Cuando estaba haciendo este post y quise probar el código en otro archivo .php apareció algo muy raro, en uno no funcionaba el LAST_INSERT_ID y en el otro archivo si (aclaro, no era problemas de conexión o algo por el estilo por que las otras consultas, como Insert, si funcionaban). En ambos archivos llamaba al mismo StoredProcedure (sin parámetros), de modo que el problema no era tanto de código SQL. Googleando un poco nos podemos dar cuenta de que esto le a pasado a más de uno, si este es tu caso, la solución es muy sencilla: Asigna el valor de LAST_INSERT_ID a una variable. A continuación el ejemplo:

DECLARE IdUltima INT;
INSERT INTO Tabla1(Titulo) VALUES("dddd");
SET IdUltima = -1;
SELECT LAST_INSERT_ID() INTO IdUltima;
SELECT IdUltima;