Blog de Gonzalo

MÁSCARAS DE BITS

En algunos proyectos ciertos campos pueden tener varios estados y en vez de crear varios campos de la tabla se crea un solo campo para poder guardar los diferentes estados que puede tener dicho registro.
Por ejemplo, supongamos que tenemos una base de datos que guarda usuarios con diferentes estados: Nuevo, Pendiente de revisar, Pendiente de alta, etc... y yo soy un usuario Nuevo y pendiente de revisar. Entonces tendré dos estados en ese usuario, pero habrá usuarios con un estado, con tres o varios estados.
Es importante definir en nuestra aplicación web, los diferentes estados en constantes y lo más IMPORTANTE esos estados tienen que ser usando las potencias de binario es decir, 1, 2, 4, 8, 16 ...

	define(\'ESTADO1\',1);
define(\'ESTADO2\',2);
define(\'ESTADO3\',4);
define(\'ESTADO4\',8);

Según los estados que vamos a tener, por ejemplo el 1 es estado nuevo, 2 es estado, pendiente de revisar, etc...
Si queremos hacer obtener los usuarios que tienen el estado 2 la query será:
SELECT * FROM estado WHERE (status and(~(~ 8))) = 8

Esta query devolverá los usarios que tienen el estado pasado a la query, en el ejemplo es 8, y otros estados.
Para guardar un estado en el campo estados se hará la suguiente query para no perder los estados anteriores.
update estado set status = status |(2) where id = 1
Donde 2 es el nuevo estado que se añade y que se ha definido en el PHP. Se hace una suma lógica para añadirlo al nuevo estado existente. Si se quiere añadir un registro nuevo con un estado es poner el estado directamente en el insert. Pero si se quiere añadir el nuevo registro con dos o más estados se hará de la siguiente manera en el php para añadirlo a la query:
$estado = ESTADO4 | ESTADO3;
$query = "INSERT INTO estado (estado) VALUES ($estado)";

Espero que la explicación haya sido buena. Para cualquier cosa mandarme un correo a contacto@gonzalolopez.es

Compartir en twitter