Servidor Web + PHP + MySQL + PHPMyAdmin en Android

Hoy he encontrado una joyita que quiero compartir con vosotros. Si le tenéis tanta aversión a Java como yo (¿por qué? … manías) tengo una buena noticia. Podéis desarrollar aplicaciones web para Android que funcionan sin conexión a Internet gracias a KSWEB, un servidor web que incluye PHP y MySQL.

Lo estoy probando y, por ahora, me está sorprendiendo gratamente. Se puede instalar gratis pero la licencia expira en cinco días. Cuesta unos tres euros pero si cumple lo que promete los vale. Os mantendré informados.

 KSWeb - Servidor web + PHP + MySQL en Android

Enlace a la web del autor: http://kslabs.ru/

MySQL – Comprobar si una fecha determinada es hoy

Hoy le he estado dando vueltas a una consulta de MySQL para sacar todos los registros que se han creado en el día. Se me ha ocurrido algo como:

SELECT * FROM tabla WHERE fecha = TODAY()

Pero no, esto no funciona. He buscado en la web y me he encontrado la solución. Una solución muy sencilla sin romperse la cabeza:

SELECT * FROM tabla WHERE  DATE(fecha) = DATE(NOW())

La función DATE() nos devuelve la fecha eliminando la parte de la hora. La función NOW() nos da la fecha y hora de hoy. Con la función DATE() eliminamos la parte de la hora y ¡voilá! tenemos una sencilla forma de comprobar si las fechas son iguales.

Idea sacada de aquí.

MySQL: actualizar un campo con la suma de unos registros de otra tabla

Si tenemos una tabla que queremos actualizar con la suma de valores de otra tabla podemos hacerlo vía programación (lo he visto en un programa que he tenido que modificar recientemente) o lo podemos hacer directamente usando una consulta MySQL.

En este ejemplo en concreto que me encontré había dos tablas:

facturas:

  • num_factura
  • base_imponible

factura_detalle:

  • num_factura
  • articulo
  • precio

La tabla factura_detalle contiene, como el nombre indica, el detalle de las facturas. Cada línea es un artículo y su precio.

La tabla facturas tenía un campo base_imponible que era necesario actualizar con el precio de los artículos de la factura en la tabla factura_detalle.

Esto se puede hacer directamente usando una subconsulta:

UPDATE facturas SET base_imponible =
     ( SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')
     WHERE num_factura = '30';

La subconsulta se encarga de buscar todos los registros de la tabla de detalle y sumar los precios:

SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')

y la consulta principal lo que hace es asignar ese valor, que sería algo así suponiendo que la anterior hubiese devuelto el valor ‘300’:

UPDATE facturas SET base_imponible = '300'
     WHERE num_factura = '30';

MySQL: Importar un fichero SQL cambiando el charset

En ocasiones es posible que necesites importar a una base de datos MySQL un fichero con un backup que está definido con un set de caracteres diferente al que usa la BD.

Si se importa sin más es muy posible que aparezcan caracteres extraños al ver el contenido de la base de datos.

Desde consola

Cuando esto sucede puedes indicar una condición extra en la importación para indicar el character set que vas a usar. Esta opción es: –default-character-set:

mysql -uusuario -p base_datos < fichero.sql --default-character-set=set_caracteres

Donde:
set_caracteres: es el set de caracteres de la nueva base de datos (por ejemplo utf8).
fichero.sql: es el fichero que contiene la estructura y/o datos del fichero exportado previamente.
base_datos: es la base de datos en la que vamos a guardar el contenido del fichero.

Con PHPMyAdmin

Esto también se puede hacer desde PHPMyAdmin. En la pestaña de importación de datos hay un desplegable que nos permite indicar el charset que vamos a usar.

Problemas al crear una función en MySQL: Error 1064

Hace un par de días publiqué una función en MySQL que permitía contar los días entre dos fechas sin contar fines de semana. Le he usado en varios servidores pero en uno de ellos me he encontrado con un problema:

#1064 - You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax 
to use near 'IF EXISTS `workdaydiff`' at line 1 

Después de volverme loco un buen rato he encontrado la solución aquí:

Bastaba con añadir un punto y coma al delimitador, es decir, en lugar de:

DELIMITER $$

usar:

DELIMITER $$;

y, efectivamente, ha funcionado.

Función en MySQL para contar días entre dos fechas sin contar sábados ni domingos

Después de darle muchas vueltas he encontrado esta útil función en los foros de MySQL que permite calcular el número de días que han transcurrido entre dos fechas sin contar fines de semana.

Espero que os sea tan útil como a mí.

DELIMITER $$
 
DROP FUNCTION IF EXISTS `workdaydiff`$$
CREATE FUNCTION workdaydiff(b date, a date) RETURNS int(11)
    DETERMINISTIC
    COMMENT 'working day difference for 2 dates'
BEGIN
 
DECLARE freedays int;
 
SET freedays = 0;
SET @x = DATEDIFF(b, a);
IF @x<0 THEN
SET @m = a;
SET a = b;
SET b = @m;
SET @m = -1;
ELSE
SET @m = 1;
END IF;
SET @x = abs(@x) + 1;
 
SET @w1 = WEEKDAY(a)+1;
SET @wx1 = 8-@w1;
IF @w1>5 THEN
SET @w1 = 0;
ELSE
SET @w1 = 6-@w1;
END IF;
 
SET @wx2 = WEEKDAY(b)+1;
SET @w2 = @wx2;
IF @w2>5 THEN
SET @w2 = 5;
END IF;
 
SET @weeks = (@x-@wx1-@wx2)/7;
SET @noweekends = (@weeks*5)+@w1+@w2;
 
SET @result = @noweekends-freedays;
RETURN @result*@m;
END$$
 
DELIMITER ;

PHP: Cambiar el set de caracteres en una consulta MySQL

Existe una función, que he de reconocer no conocía, que permite cambiar el set de caracteres (charset) cuando hacemos una consulta a MySQL.

Por ejemplo, si queremos asegurarnos que los datos que vamos a introducir en la base de datos van a estar en UTF-8 usaremos:

mysql_set_charset('utf8',$link);

(donde el parámetro $link, como en casi todas las funciones para mysql, es opcional).

Esta función se ha incorporado en la versión PHP 5 (5.0.7) y por lo visto también está disponible en la versión PHP 4 (a partir de la 4.1.13). En los comentarios de la documentación de PHP han aportado este código que hace que mysql_set_charset funcione también en versiones anteriores de PHP:

<?php
 if (function_exists('mysql_set_charset') === false) {
     function mysql_set_charset($charset, $link_identifier = null)
     {
         if ($link_identifier == null) {
             return mysql_query('SET NAMES "'.$charset.'"');
         } else {
             return mysql_query('SET NAMES "'.$charset.'"', $link_identifier);
         }
     }
 }
 ?>

Activar el log de querys en MySQL

Si alguna vez necesitas hacer un seguimiento de las queries (o consultas) que está haciendo una aplicación puedes hacerlo activando el log de queries de MySQL.

Edita el fichero: /etc/mysql/my.cnf

busca la línea:

#log		= /var/log/mysql/mysql.log

y quita la almohadilla del comienzo (que sirve para convertir la línea en un comentario).

Puedes usar un archivo diferente de: /var/log/mysql/mysql.log, pero asegúrate de que MySQL tiene persmisos de escritura en él.

Después basta con reiniciar el MySQL:

sudo /etc/init.d/mysql restart

Una vez hecho esto todas las querys quedarán almacenadas en este archivo. No es muy recomendable tenerlo activado en un servidor en producción ya que podría ralentizar mucho las consultas.

MySQL y Mono

Estoy empezando un proyecto en Mono y la primera dificultad que me he encontrado ha sido añadirle soporte para MySQL. Se tarda muy poco en ponerlo en marcha, lo que me ha costado ha sido descubrir cómo hacerlo:

  • Descargar el último conector de la web de MySQL. Verás que sólo hay paquetes para MS Windows. Descárgate el paquete sin instalador.
  • Descomprime el fichero y copia el fichero bin/MySql.Data.dll a tu directorio de Mono (en mi caso es /usr/lib/monodevelop/bin). En ese directorio probablemente habrá alguna otra dll. Prueba a usar el comando:
    locate .dll

    para ver dónde puede estar tu directorio. Por cierto, necesitarás permisos de administrador.

  • Registra la dll usando el comando:
    gacutil -i MySql.Data.dll

    .

  • Si usas el Monodevelop tendrás que añadir el soporte MySQL a tu proyecto. Click derecho sobre “Referencias”-> Editar Referencias -> Ensamblado .Net. Navega hasta encontrar el fichero MySql.Data.dll y pincha el botón “Añadir”.

Después de esto ya deberías ser capaz de conectarte a una base de datos MySQL sin problemas.