Foros del Web » Programando para Internet » PHP »

Horarios de Apertura

Estas en el tema de Horarios de Apertura en el foro de PHP en Foros del Web. Quisiera recibir alguna idea sobre como implementar horarios de empresas, indicar si esta abierta o cerrada dependiendo del horario. Trabajo php y mysql. he pensado ...
  #1 (permalink)  
Antiguo 18/06/2017, 04:47
Avatar de ..::MaRcOs::..  
Fecha de Ingreso: diciembre-2006
Mensajes: 325
Antigüedad: 11 años
Puntos: 3
Horarios de Apertura

Quisiera recibir alguna idea sobre como implementar horarios de empresas, indicar si esta abierta o cerrada dependiendo del horario. Trabajo php y mysql.

he pensado que funcionaria de la siguiente forma, pero veo que es un poco tediosa, puede haber una mejor forma de implementarlo?

tabla empresas (id, nombre)
tabla horarios (id, empresa, día, hora)

Luego determino el día y la hora del servidor y busco si existe el registro para la empresa y la declaro abierta o cerrada. realmente me parece que no estaría bien implementado y si la hora es hasta las y 30 minutos, fallaría.
  #2 (permalink)  
Antiguo 18/06/2017, 06:27
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 227
Antigüedad: 5 años, 5 meses
Puntos: 33
Respuesta: Horarios de Apertura

Pues tampoco está mal como dices.

Yo lo haría casi como planteas:

Tabla empresas ( id, nombre, ... )
Tabla empresas_horarios ( id, id_empresa, dia, abre, cierra )

Donde la celda día guardaría el día de la semana en número, 0 para el domingo 7 para el sábado. El número del día de la semana lo puedes saber muy facilmente con la clase DateTime de PHP.

Las celdas abre y cierra las pondría del tipo TIME.

De este modo tendrías una tabla con estos registros

empresas

--- ID ----------- NOMBRE
--- 0 -------------- Zara
--- 1 ----------- Pull & bear

empresas_horarios

--- ID --- ID_EMPRESA --- DIA ------- ABRE -------- CIERRA
--- 0 -------- 0 --------- 1 ------ 10:00:00 ----- 21:00:00 -> (El lunes Zara abre de 10 a 21 horas)
--- 1 -------- 0 --------- 2 ------ 10:00:00 ----- 21:00:00 -> (El martes Zara abre de 10 a 21 horas)
--- 2 -------- 1 --------- 1 ------ 10:00:00 ----- 14:00:00 -> (El lunes Pull & bear abre de 10 a 14 horas)
--- 3 -------- 1 --------- 1 ------ 17:30:00 ----- 20:30:00 -> (El lunes Pull & bear abre de 17:30 a 20:30 horas)
--- 4 -------- 1 --------- 2 ------ 10:00:00 ----- 14:00:00 -> (El martes Pull & bear abre de 10 a 14 horas)
--- 5 -------- 1 --------- 2 ------ 17:30:00 ----- 20:30:00 -> (El martes Pull & bear abre de 17:30 a 20:30 horas)

Ahora para consultar si una empresa está abierta en el momento actual, tan solo deberías hacer una consulta muy simple. Por ejemplo estamos visitando tu web el lunes 19 de junio de 2017 a las 12:33 horas y estamos viendo la empresa Zara.

Código PHP:

<?php

$idEmpresa 
0// El ID 0 corresponde a la empresa zara
$fecha = new DateTime(); // Fecha y hora actual 2017-19-06 12:33:15

$SQL =  "
SELECT id FROM empresas_horarios 
    WHERE id_empresa = '" 
$idEmpresa "' AND dia = '" $fecha->format"w" ) . "' AND abre >= '" $fecha->format"H:i:s" ) . "' AND cierra <= '" $fecha->format"H:i:s" ) . "'
"
;

$pHorario $mysqli->query$SQL );
$aHorario $pHorario->fetch_assoc();

if( 
$aHorario"id" ] ) {
    echo 
"La empresa está abierta ahora mismo"// En el caso de la hora actual nos mostraría que la empresa está abierta.
} else {
    echo 
"La empresa está cerrada ahora mismo";
}

?>
Habría que tener en cuenta los festivos y todo eso claro, pero yo haría una tabla así. Si tienes una tabla muy extensa crea los índices apropiados para las consultas que tengas que hacer. Y si tienes muchas más consultas SELECT que INSERTS o UPDATES crea la tabla con el motor MyISAM que optimiza más las consultas del tipo SELECT.

Espero que te de al menos una idea de como hacerlo. Al final no hay nunca una sola forma correcta de hacer las cosas, lo importante es que funcione y no se malgasten recursos.

Un saludo
__________________
Diseño Web - Arisman Web

Última edición por manuparquegiralda; 18/06/2017 a las 06:46
  #3 (permalink)  
Antiguo 18/06/2017, 09:47
Avatar de ..::MaRcOs::..  
Fecha de Ingreso: diciembre-2006
Mensajes: 325
Antigüedad: 11 años
Puntos: 3
Respuesta: Horarios de Apertura

Cita:
Iniciado por manuparquegiralda Ver Mensaje
Pues tampoco está mal como dices.

Yo lo haría casi como planteas:

Tabla empresas ( id, nombre, ... )
Tabla empresas_horarios ( id, id_empresa, dia, abre, cierra )

Donde la celda día guardaría el día de la semana en número, 0 para el domingo 7 para el sábado. El número del día de la semana lo puedes saber muy facilmente con la clase DateTime de PHP.

Las celdas abre y cierra las pondría del tipo TIME.

De este modo tendrías una tabla con estos registros

empresas

--- ID ----------- NOMBRE
--- 0 -------------- Zara
--- 1 ----------- Pull & bear

empresas_horarios

--- ID --- ID_EMPRESA --- DIA ------- ABRE -------- CIERRA
--- 0 -------- 0 --------- 1 ------ 10:00:00 ----- 21:00:00 -> (El lunes Zara abre de 10 a 21 horas)
--- 1 -------- 0 --------- 2 ------ 10:00:00 ----- 21:00:00 -> (El martes Zara abre de 10 a 21 horas)
--- 2 -------- 1 --------- 1 ------ 10:00:00 ----- 14:00:00 -> (El lunes Pull & bear abre de 10 a 14 horas)
--- 3 -------- 1 --------- 1 ------ 17:30:00 ----- 20:30:00 -> (El lunes Pull & bear abre de 17:30 a 20:30 horas)
--- 4 -------- 1 --------- 2 ------ 10:00:00 ----- 14:00:00 -> (El martes Pull & bear abre de 10 a 14 horas)
--- 5 -------- 1 --------- 2 ------ 17:30:00 ----- 20:30:00 -> (El martes Pull & bear abre de 17:30 a 20:30 horas)

Ahora para consultar si una empresa está abierta en el momento actual, tan solo deberías hacer una consulta muy simple. Por ejemplo estamos visitando tu web el lunes 19 de junio de 2017 a las 12:33 horas y estamos viendo la empresa Zara.

Código PHP:

<?php

$idEmpresa 
0// El ID 0 corresponde a la empresa zara
$fecha = new DateTime(); // Fecha y hora actual 2017-19-06 12:33:15

$SQL =  "
SELECT id FROM empresas_horarios 
    WHERE id_empresa = '" 
$idEmpresa "' AND dia = '" $fecha->format"w" ) . "' AND abre >= '" $fecha->format"H:i:s" ) . "' AND cierra <= '" $fecha->format"H:i:s" ) . "'
"
;

$pHorario $mysqli->query$SQL );
$aHorario $pHorario->fetch_assoc();

if( 
$aHorario"id" ] ) {
    echo 
"La empresa está abierta ahora mismo"// En el caso de la hora actual nos mostraría que la empresa está abierta.
} else {
    echo 
"La empresa está cerrada ahora mismo";
}

?>
Habría que tener en cuenta los festivos y todo eso claro, pero yo haría una tabla así. Si tienes una tabla muy extensa crea los índices apropiados para las consultas que tengas que hacer. Y si tienes muchas más consultas SELECT que INSERTS o UPDATES crea la tabla con el motor MyISAM que optimiza más las consultas del tipo SELECT.

Espero que te de al menos una idea de como hacerlo. Al final no hay nunca una sola forma correcta de hacer las cosas, lo importante es que funcione y no se malgasten recursos.

Un saludo
Muchas gracias lo implementaré de esta forma.
Que amable tomarse el tiempo de crear hasta la consulta, mil gracias!
  #4 (permalink)  
Antiguo 18/06/2017, 11:00
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 227
Antigüedad: 5 años, 5 meses
Puntos: 33
Respuesta: Horarios de Apertura

Cita:
Iniciado por ..::MaRcOs::.. Ver Mensaje
Muchas gracias lo implementaré de esta forma.
Que amable tomarse el tiempo de crear hasta la consulta, mil gracias!
De nada ha sido un place. Pero me he equivocado en la consulta a la hora de comparar las horas de abierto y cerrado, lo he puesto al revés.

Código PHP:

$SQL 
=  
SELECT id FROM empresas_horarios  
    WHERE id_empresa = '" 
$idEmpresa "' AND dia = '" $fecha->format"w" ) . "' AND abre <= '" $fecha->format"H:i:s" ) . "' AND cierra >= '" $fecha->format"H:i:s" ) . "' 
"

__________________
Diseño Web - Arisman Web



La zona horaria es GMT -6. Ahora son las 05:21.