Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Pintar rango de una fecha a otra

Estas en el tema de Pintar rango de una fecha a otra en el foro de PHP en Foros del Web. Hola! Estoy haciendo un sistema en donde guardo eventos del mes. Estos eventos se ven reflejados de color rojo en la celda correspondiente al día ...
  #1 (permalink)  
Antiguo 26/08/2013, 14:07
 
Fecha de Ingreso: enero-2013
Ubicación: Distrito Federal
Mensajes: 88
Antigüedad: 11 años, 3 meses
Puntos: 1
Exclamación Pintar rango de una fecha a otra

Hola!
Estoy haciendo un sistema en donde guardo eventos del mes. Estos eventos se ven reflejados de color rojo en la celda correspondiente al día para visualizar que ese día ya esta ocupado por un evento.

Como puedo hacerle para en caso de que el evento dure varios días. Todos los días se marquen de color rojo.

POR EJEMPLO:
Si el EVENTOX tiene la fecha del 26/08/2013. Ese día se marcará de rojo. (esto ya lo tengo)
Si el EVENTOY tiene la fecha del 26/08/2013-29/08/2013. Actualmente unicamente se pinta el día 26 y necesito que se pinte el 26,27 y 28

En mi BD tengo una fila llamada rango que calcula los días que existen (regresando a mi ejemplo) del 26 al 29. En este caso sería 3.

Este es el código que actualmente tengo:

Código PHP:
Ver original
  1. $fechas_en_bd[] = $fechas['fecha_1']; //Este resultado sale de una consulta SQL
  2.  
  3. $rellenar=1; //Esta variable servirá para rellenar y saber en que día estoy
  4.        
  5. //Estructura While para rellenar COLUMNAS hasta el número de días existentes    
  6. while($rellenar <= $dias_x_mes)
  7. {
  8.     $esta_fecha_sql = $anio."-".$mes."-".$rellenar; //Se crea la fecha en la que se encuentra el ciclo
  9.    
  10.     if (in_array($esta_fecha_sql, $fechas_en_bd)) //Comparamos si esta fecha esta en el array de las fechas de la BD
  11.    {
  12.      //Consulta de BD para tomar todos los datos de los eventos donde exista $esta_fecha_sql
  13.     $cons0 = mysql_query("SELECT * FROM eventos WHERE fecha_1='".$esta_fecha_sql."'");
  14.              
  15.     while($query0 = mysql_fetch_array($cons0))
  16.         {
  17.             $ultima_fecha = $query0['fecha_2']; //Esta fecha es el ultimo dia del evento
  18.             $rango = $query0['rango']; //Esto son los número calculados de la fecha1 a la fecha2
  19.         }
  20.  
  21.         echo '<td style="background-color:#D80100"></td>';
  22.    }else{
  23.        echo '<td ></td>';
  24.    }
  25.   $rellenar++;
  26. }

Los datos que me pueden ayudar ya estan tomados en $ultima_fecha y $rango.

Probe con un ciclo FOR
Código PHP:
Ver original
  1. for($z=1;$z==$rango;$z++){
  2.   echo '<td style="background-color:#D80100"></td>';
  3. }

Pero no me marca todos los días, incluso hay unos que ya no se pintan xk el rango es 1 y si cambio la z a 0 tampoco. Que podré hacer?
  #2 (permalink)  
Antiguo 27/08/2013, 01:46
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 8 meses
Puntos: 29
Respuesta: Pintar rango de una fecha a otra

Espero que esto te ayude.

*** Elementos para la prueba ***
Código SQL:
Ver original
  1. -- Base de datos: `test`
  2. CREATE TABLE IF NOT EXISTS `eventos` (
  3. `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
  4. `fecha_inicio` DATE DEFAULT NULL ,
  5. `fecha_fin` DATE DEFAULT NULL ,
  6. `evento` VARCHAR( 20 ) COLLATE utf8_spanish_ci DEFAULT NULL ,
  7. PRIMARY KEY ( `id` )
  8. ) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_spanish_ci AUTO_INCREMENT =1
  9.  
  10. INSERT INTO `test`.`eventos` (`id`, `fecha_inicio`, `fecha_fin`, `evento`) VALUES ('1', '2013-08-05', '2013-08-23', 'evento 1');

*** Se selecciona una fecha ***
Código PHP:
Ver original
  1. $fechas['fecha_selec'] = '2013-08-20';

*** ¿hay eventos en esa fecha? ***
2013-08-05 ¿está dentro del rango inicio/fin de los eventos?
Código PHP:
Ver original
  1. $sql = "SELECT * FROM eventos
  2. WHERE
  3. '".$fechas['fecha_selec']."'
  4. BETWEEN
  5. fecha_inicio
  6. AND
  7. fecha_fin;";
  8.  
  9. $query = mysql_query($sql);
  10. $rst = mysql_fetch_array($query,MYSQL_ASSOC);
  11. var_dump($rst);

* Rdo con: '2013-08-20'
Código PHP:
Ver original
  1. array(4) {
  2. ["id"]=> string(1) "1"
  3. ["fecha_inicio"]=> string(10) "2013-08-05"
  4. ["fecha_fin"]=> string(10) "2013-08-23"
  5. ["evento"]=> string(8) "evento 1"
  6. }

* Rdo con fechas: '2013-08-04' y '2013-08-24'
Código PHP:
Ver original
  1. bool(false)
  #3 (permalink)  
Antiguo 27/08/2013, 14:06
 
Fecha de Ingreso: enero-2013
Ubicación: Distrito Federal
Mensajes: 88
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Pintar rango de una fecha a otra

Pues mas o menos me ayudo.
Ya que si el evento dura 3 días solo me colorea 2 y si el evento 2 solo me pinta 1.También me aumenta una celda de más que no debería suceder
Código PHP:
Ver original
  1. $sql = mysql_query("SELECT * FROM eventos WHERE '".$esta_fecha_sql."' BETWEEN fecha_1 AND fecha_2");
  2.  
  3. while($rst = mysql_fetch_array($sql))
  4. {
  5.     echo '<td style="background-color:#D80100"></td>';
  6. }

Quiza no debería ser con un while para evitar que me agregue celdas. Pero como le indico que sea la celda que le especificio.
Cuando el evento solo es de un día utilice un array y me funciona bien
  #4 (permalink)  
Antiguo 28/08/2013, 05:32
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 8 meses
Puntos: 29
Respuesta: Pintar rango de una fecha a otra

El evento de mi prueba está entre el día 5 y 23
<input type='date'/> de html5 no funciona en todos los navegadores, yo utilicé Opera.

Código PHP:
Ver original
  1. <style type="text/css">
  2. table {
  3.     border: 1px solid #000; padding: 2px;font: 9px;
  4. }
  5. td {
  6.     border: 1px solid #999;
  7. }
  8. .rojo {
  9.     background-color: red;
  10. }
  11. .verde {
  12.     background-color: green;
  13. }
  14. .azul {
  15.     background-color: blue;
  16. }
  17. .gris {
  18.     background-color: #666;color: #aaa
  19. }
  20. </style>
  21. <form id="ver_sorteos" name="" method="post" action="">
  22.     <!--  -->
  23.     Fecha:
  24.     <?php
  25.     // fija el select en una opción
  26.     if (isset($_POST['fecha'])) {
  27.        echo "<input type='date' name='fecha' size='8' maxlength='10' value='".$_POST['fecha']."' />";
  28.     } else {
  29.        echo "<input type='date' name='fecha' size='8' maxlength='10' value='".date('Y-m-d')."' />";
  30.     }
  31.     ?>
  32.     <!--  -->
  33.     <input type="submit" name="enviar">
  34. </form>
  35. <?php
  36. /** conexión BBDD **/
  37. require_once('base/funciones/f_bd.php');
  38. conectadb('test');
  39. /** **/
  40.  
  41. if(isset($_POST['enviar'])) {
  42.    $aFechas['fecha_selec'] = $_POST['fecha'];
  43. }
  44.  
  45. /** rango de fechas de prueba **/
  46. $anio = 2013;
  47. $mes = 8;
  48. $dias_x_mes = 30;
  49.  
  50. /** Consulta BBDD **/
  51. $sql = "SELECT * FROM eventos
  52. WHERE
  53. '".$aFechas['fecha_selec']."'
  54. BETWEEN fecha_inicio AND fecha_fin;";
  55. $query = mysql_query($sql);
  56. $aRst = mysql_fetch_array($query,MYSQL_ASSOC);
  57.  
  58.  
  59. echo '<table>';
  60. for($d=1; $d <= 31; $d++) {
  61.    //Crea fechas del ciclo 2013-08-1, 2013-08-2, 2013-08-3...
  62.    $f = $anio."-".$mes."-".$d . ' ';
  63.    // le da formato de fecha
  64.    $fecha = date("Y-m-d",strtotime($f));
  65.    if (($fecha == $aFechas['fecha_selec']) && ($fecha >= $aRst['fecha_inicio']) && ($fecha <= $aRst['fecha_fin'])) {
  66.       echo "<tr><td><span class='rojo'>".$fecha."</span> fecha+evento</td></tr>";
  67.    } elseif ($fecha == $aFechas['fecha_selec']) { /** fecha seleccionada **/
  68.       echo "<tr><td><span class='azul'>".$fecha."</span> fecha</td></tr>";
  69.    } elseif (($fecha >= $aRst['fecha_inicio']) && ($fecha <= $aRst['fecha_fin'])) { /** rango evento **/
  70.       echo "<tr><td><span class='verde'>".$fecha."</span> evento</td></tr>";
  71.    } else {
  72.       echo "<tr><td><span class='gris'>$fecha</span></td></tr>";
  73.    }
  74. }
  75. echo '</table>';
  76.  
  77. ?>

Etiquetas: php+base+de+datos+array
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:29.