Foros del Web » Programando para Internet » PHP »

Calendario semanal y Mysql

Estas en el tema de Calendario semanal y Mysql en el foro de PHP en Foros del Web. Amigos, estoy atascado con el while de mysql, no se como sacar los datos sin que se me multipliquen tantos espacios. tengo esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 01/02/2012, 19:27
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Pregunta Calendario semanal y Mysql

Amigos, estoy atascado con el while de mysql, no se como sacar los datos sin que se me multipliquen tantos espacios. tengo esto:
Código PHP:
Ver original
  1. <?php
  2. // I create the db connection
  3. $conn = mysql_connect('host', 'user', 'pass') or die (mysql_error());
  4. //testing connection
  5. if (!$conn){
  6.     die('No se conecta dando un error el cual es: '.mysql_error());
  7. }
  8. //selecting a db
  9. mysql_select_db('calendar', $conn) or die('No se encontro la BD dando un error el cual es: '.mysql_error());
  10.  
  11. //Selecting the Query from patients_control
  12. $sql = mysql_query("SELECT * FROM reuniones ORDER BY id ASC");
  13.  
  14. //Hacemos el if/else para ver si se han seteado en la url mediante GET los parametros wk = semana
  15. $week = isset($_GET['wk']) ? $_GET['wk'] : '';
  16. //Si es lunes calculamos a partir de la fecha actual
  17. if(date('w') == 1) {
  18.     //verificamos si la variable $week no esta vacia
  19.     if(!empty($week)){
  20.         //Si no esta vacia agregamos el valor de $week asignandole la marca de tiempo UNIX
  21.         $ul = strtotime("$week week", time());
  22.     } else {
  23.         //Si esta vacia simplemente le damos la marca de tiempo UNIX
  24.         $ul = time();
  25.     }
  26. } else {
  27.     if(!empty($week)){
  28.         $ul = strtotime("last monday $week week");
  29.     } else {
  30.         $ul = strtotime('last monday');
  31.     }
  32. }
  33. //Array con los dias de la semana
  34. $dias_semana = array('Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo');
  35. //Array Horas del dia
  36. $hours = array("6:00", "7:00", "8:00", "9:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00");
  37. ?>
  38. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  39. <html xmlns="http://www.w3.org/1999/xhtml">
  40. <head>
  41. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  42. <title>Calendar Sample</title>
  43. <link rel="shortcut icon" href="icon" />
  44. <link href="styles.css" rel="stylesheet" type="text/css" />
  45. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
  46. <script language="javascript" type="text/javascript">
  47. $(document).ready(function(){
  48.     var h = document.body.scrollHeight;
  49.     var nh = Math.round(h/18);
  50.     $('.tableheight').css({'height':h});
  51.     $('.trheight').css({'height':nh});
  52.    
  53. });
  54. </script>
  55. </head>
  56.  
  57. <body>
  58. <!-- Table: General -->
  59. <table class="tableheight" width="100%" cellspacing="0" cellpadding="0" border="0" bgcolor="#ddd"   >
  60.     <tr>
  61.         <th class="trheight"><a href="index.php?wk=<?php echo $week-1; ?>">Prev</a>-<a href="index.php?wk=<?php echo $week+1; ?>">Next</a></th>
  62.         <?php
  63.         //Bucle para mostrar los 7 dias de la semana
  64.         for($i=0;$i<7;$i++){
  65.             //Sumamos días a la fecha del lunes actual
  66.             $sd = strtotime("+$i day", $ul);
  67.             //comprobamos si la fecha del bucle es la fecha actual
  68.             if(date('d', $sd) === date('d')) { 
  69.                 //colocamos el dia actual en rojo y ponemos el array para mostrar los dias en español
  70.                 echo '<th width="12.5%"><font color="red">'.$dias_semana[$i].', '.date("d", $sd).'</font></th>';
  71.             } else {
  72.                 //colocamos el el resto de los dias en gris y ponemos el array para mostrar los dias en español
  73.                 echo '<th width="12.5%"><font color="black">'.$dias_semana[$i].', '.date("d", $sd).'</font></th>';
  74.             }
  75.         }
  76.        
  77.         //hago los dias
  78.         for($h=0; $h < count($hours); $h++) {
  79.             echo '<tr><th>';
  80.             echo $hours[$h];
  81.             echo '</th>';
  82.             for($y=0;$y<7;$y++){
  83.  
  84.  //>>>>>>>>>>> AQUI CREO QUE DEBERIA IR EL WHILE PERO NO ME FUNCIONA, AYUDA PORFA
  85.  
  86.                 $xxx = strtotime("+$y day", $ul);
  87.                 echo '<td width="12.5%"><font color="black">'.date("Y-m-d", $xxx).'</font></td>';
  88.             }
  89.             echo '</tr>';
  90.         }
  91.         ?>
  92.     </tr>
  93. </table>
  94. <!-- Table: General -->
  95. </body>
  96. </html>

Gracias
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar
  #2 (permalink)  
Antiguo 02/02/2012, 00:33
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Calendario semanal y Mysql

sin que se me multipliquen tantos espacios?? no se entiende la pregunta, por aclara y deja sólo el código relevante. Sau2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 02/02/2012, 08:25
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Respuesta: Calendario semanal y Mysql

Cita:
Iniciado por repara2 Ver Mensaje
sin que se me multipliquen tantos espacios?? no se entiende la pregunta, por aclara y deja sólo el código relevante. Sau2
Ok, lo siento si no me hice entender.

Donde digo que va el while, ahi deberia de ir los datos para rellenar los dias en los cuales tengo reunion, como hacer el while($row=mysql_fetch_array($sql)){} para que me emuestre los datos segun el dia que corresponda.

Lo puse donde puse el comentario y la verdad es que me muestra los 1000 datos que tengo en la base de datos jajajaja pero nisiquiera de forma ordenada sino que me hace los 7 dias y luego sigue en la misma linea en lugar de saltar a la hora en que se deberia.

ej:

lunes martes miercoles jueves viernes sabado domingo

8:00 Reunion
9:00
...
18:00


Me sigues?
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar
  #4 (permalink)  
Antiguo 03/02/2012, 01:11
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Calendario semanal y Mysql

ok, si miras un poco el script, verás un par de cosas. Te hago un ejemplo más fácil para que veas como se hace la tabla:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $dias = array('L', 'M', 'X', 'J', 'V');
  4. $horas = array(9,10,11,12,13,14,15,16);
  5.  
  6. $table = "<table border='1'>";
  7. $table .= "<tr bgcolor='#CCCCCC'>";
  8. $table .= "<td></td>"; //Extremo sup izq
  9. foreach($dias as $dia)
  10. {
  11.     $table .= "<td>$dia</td>";
  12. }
  13. $table .= "</tr>"; //Fin fila inicial dias
  14. foreach($horas as $hora)
  15. {//En estas filas vacias van las citas
  16. $table .= "  <tr>
  17.    <td bgcolor='#CCCCCC'>$hora</td>
  18.    <td>&nbsp;</td>
  19.    <td>&nbsp;</td>
  20.    <td>&nbsp;</td>
  21.    <td>&nbsp;</td>
  22.    <td>&nbsp;</td>
  23.  </tr>";
  24. }
  25. $table .= "</tr>"; //Fin fila inicial dias
  26.  
  27. echo $table;
  28.  
  29. ?>

Hasta aquí, es lo mismo que tienes tú, faltan las citas.
Entonces:
1. Las citas van en el sitio indicado pero te falta una relación o dependencia entre dia / hora / cita. Cómo sabes qué cita va en cada dia / hora??: Respuesta: depende de lo que traiga la consulta, en el post no lo pones, pero para que funcione, cada registro de cita debe tener una referencia de dia, hora y text, como mínimo. Sabiendo esto entonces puedes poner cada cita en su lugar.
2. La
Código SQL:
Ver original
  1. SELECT: SELECT * FROM ....
no parece muy apropiada. Si quieres mostrar una semana, coloca un WHERE... para consultar sólo la semana que te interesa. Según tu propio ejemplo, el número de la semana que el usuario quiere ver viene en $_GET['wk'], por tanto realiza la consulta como:
Código SQL:
Ver original
  1. SELECT * FROM citas WHERE semana = '".$_GET['wk']."'
o lo que corresponda a tu esquema de BD.
3. Modifica la consulta para que cada registro de cita tenga la información de día y hora. Para esto deberás trabajar con los dias como enteros y no como caracteres. Ejemplo completo:



Código PHP:
Ver original
  1. <?php
  2. ini_set("display_errors", 1);
  3.  
  4. $dias = array(0 => 'L', 1 => 'M', 2 => 'X', 3 => 'J', 4 => 'V');
  5. $horas = array(9,10,11,12,13,14,15,16);
  6. //Supuesto resultado de la base de datos
  7. //Cita = array(dia, hora, texto);
  8. $citas = array(
  9. 0 => array(0 => 0, 1 => 9, 2 => 'Estudiar PHP'),
  10. 1 => array(0 => 1, 1 => 10, 2 => 'Compras'),
  11. 2 => array(0 => 1, 1 => 11, 2 => 'Reunion'),
  12. 3 => array(0 => 2, 1 => 9, 2 => 'Dormir'),
  13. 4 => array(0 => 3, 1 => 13, 2 => 'Estudiar MySQL'),
  14. 5 => array(0 => 3, 1 => 14, 2 => 'Cenar'),
  15. 6 => array(0 => 4, 1 => 9, 2 => 'Nada'),
  16. );
  17.  
  18. $table = "<table border='1'>";
  19. $table .= "<tr bgcolor='#CCCCCC'>";
  20. $table .= "<td></td>"; //Extremo sup izq
  21. foreach($dias as $dia)
  22. {
  23.     $table .= "<td>$dia</td>";
  24. }
  25. $table .= "</tr>"; //Fin fila inicial dias
  26.  
  27.  
  28. foreach($horas as $hora)
  29. {//En estas filas vacias van las citas
  30. $table .= "  <tr>
  31.    <td bgcolor='#CCCCCC'>$hora</td>";
  32. //Una  celda por dia
  33. for($i = 0; $i<count($dias); $i++)
  34. {
  35.     $table .="<td>";
  36.     //POr cada cita, comprobar que hay coincidencia
  37.     foreach($citas as $index => $cita){
  38.         if($cita[0] == $i && $cita[1] == $hora)
  39.         {//Hay coincidencia, imprimir el texto
  40.         $table .= $cita[2];
  41.         }
  42.         else $table .= "&nbsp;";
  43.     }
  44.     $table .= "</td>";
  45.    
  46. }
  47.  
  48. }//Horas
  49. $table .= "</tr>"; //Fin fila inicial dias
  50. $table .= "</table>";
  51. echo $table;
  52.  
  53. ?>



Espero que sirva, saludos
__________________
Fere libenter homines, id quod volunt, credunt.

Última edición por repara2; 03/02/2012 a las 01:20 Razón: Agregado ejemplo
  #5 (permalink)  
Antiguo 03/02/2012, 08:32
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Respuesta: Calendario semanal y Mysql

Cita:
Iniciado por repara2 Ver Mensaje
Hasta aquí, es lo mismo que tienes tú, faltan las citas.
Entonces:
1. Las citas van en el sitio indicado pero te falta una relación o dependencia entre dia / hora / cita. Cómo sabes qué cita va en cada dia / hora??: Respuesta: depende de lo que traiga la consulta, en el post no lo pones, pero para que funcione, cada registro de cita debe tener una referencia de dia, hora y text, como mínimo. Sabiendo esto entonces puedes poner cada cita en su lugar.
2. La
Código SQL:
Ver original
  1. SELECT: SELECT * FROM ....
no parece muy apropiada. Si quieres mostrar una semana, coloca un WHERE... para consultar sólo la semana que te interesa. Según tu propio ejemplo, el número de la semana que el usuario quiere ver viene en $_GET['wk'], por tanto realiza la consulta como:
Código SQL:
Ver original
  1. SELECT * FROM citas WHERE semana = '".$_GET['wk']."'
o lo que corresponda a tu esquema de BD.
3. Modifica la consulta para que cada registro de cita tenga la información de día y hora. Para esto deberás trabajar con los dias como enteros y no como caracteres. Ejemplo completo:
Esta parte es la que no logro entender (quiero es aprender el porque y como funciona, porque no me gusta copiar y pegar)

Mi pregunta es: si tengo en la base de datos asi:
Campo = Reuniones_fecha => YYYY/mm/dd

el campo $wk que significa semana podria identificar dichas fechas?, la verdad es que ahi me pierdo

Gracias!!!
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar
  #6 (permalink)  
Antiguo 03/02/2012, 11:00
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Calendario semanal y Mysql

1 Si en tu base de datos guardas las citas con dd/mm/yyyy o lo que sea, y no tienes información de horas, entonces no puedes hacer lo que quieres. Necesitas las horas para poner cada cita en su lugar.
2 Si tu tienes el parámetro w que es el número de semana del año, tanto por php como por mysql puedes con ese valor calcular los días correspondientes a esa semana.
Te recomiendo que repases un poco los manuales, el problema es bastante básico pero si no manejas las funciones de fecha y hora no podrás resolverlo.
También puedes guardas las citas con un timestamp y luego formatearlo como tu quieres, tiene la misma precisión pero se guarda como un número entero.
Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #7 (permalink)  
Antiguo 03/02/2012, 11:38
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Respuesta: Calendario semanal y Mysql

Te agradezco muchsimo la ayuda hasta el momento. Las fechas las tengo almacenadas YYYY/mm/dd y las horas y minutoas aparte (esto fue algo que hice hace rato pero porque retribuia los datos especificamente, ahora quiero hacerlo como tipo calendario como ya te dije.

Por ende lo que puedo hacer es ponerlos concatenados.

Ahora mi pregunta va por este lado, como asigno segun la hora la fila?, asi mismo respecto a las fechas y la function w, como retribuyo las fechas de esa semana, como lo tenia antes?, mysql lo encontrara?, estoy un poco confuso y los manuales son simples, poco ejemplo y ahi es cuando me pierrdo


Gracias!!!
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar
  #8 (permalink)  
Antiguo 03/02/2012, 14:34
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Respuesta: Calendario semanal y Mysql

Cita:
Iniciado por repara2 Ver Mensaje
//Supuesto resultado de la base de datos
//Cita = array(dia, hora, texto);
$citas = array(
0 => array(0 => 0, 1 => 9, 2 => 'Estudiar PHP'),
1 => array(0 => 1, 1 => 10, 2 => 'Compras'),
2 => array(0 => 1, 1 => 11, 2 => 'Reunion'),
3 => array(0 => 2, 1 => 9, 2 => 'Dormir'),
4 => array(0 => 3, 1 => 13, 2 => 'Estudiar MySQL'),
5 => array(0 => 3, 1 => 14, 2 => 'Cenar'),
6 => array(0 => 4, 1 => 9, 2 => 'Nada'),
);
Este array no lo entiendo alguien me podria explicar que significa porfa?, me quedé perdido aqui

Gracias!!!
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar
  #9 (permalink)  
Antiguo 03/02/2012, 14:41
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Calendario semanal y Mysql

Tú necesitas mostrar CITAS. Cada cita requiere dia y hora, sin estos DOS datos no es posible hacer un calendario. Es igual si lo traes de una db, necesitas esos dos valores.
En el ejemplo que te puse arriba, y en el array de ejemplo, cada cita tiene 3 valores: dia, hora y texto. Por lo tanto, cada cita es un array. Si traes la info de la DB, cada registro es un array que contiene los campos de la tabla CITAS.
A la hora de mostrar por pantalla, haces un bucle, por cada dia, por cada hora => comprobar si alguna cita tiene este dia y esta hora, si es asi,mostrarla, si no, nada.
Cómo sabes si la cita tiene ese dia y esa hora?? Mira el ejemplo y mira lo que te devuelve tu cosnsulta a la base de datos. Se trata de comparar el valor de la cita con el dia y la hora dentro del bucle.
__________________
Fere libenter homines, id quod volunt, credunt.
  #10 (permalink)  
Antiguo 03/02/2012, 14:47
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Respuesta: Calendario semanal y Mysql

Hice todo tal cual lo tienes para entenderlo y me sale esto:
http://awesomescreenshot.com/0a9tjsnde
no esta correctamente establecido los datos se salen de la tabla, porque?
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar
  #11 (permalink)  
Antiguo 03/02/2012, 14:51
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Respuesta: Calendario semanal y Mysql

Cita:
Iniciado por repara2 Ver Mensaje
Tú necesitas mostrar CITAS. Cada cita requiere dia y hora, sin estos DOS datos no es posible hacer un calendario. Es igual si lo traes de una db, necesitas esos dos valores.
En el ejemplo que te puse arriba, y en el array de ejemplo, cada cita tiene 3 valores: dia, hora y texto. Por lo tanto, cada cita es un array. Si traes la info de la DB, cada registro es un array que contiene los campos de la tabla CITAS.
A la hora de mostrar por pantalla, haces un bucle, por cada dia, por cada hora => comprobar si alguna cita tiene este dia y esta hora, si es asi,mostrarla, si no, nada.
Cómo sabes si la cita tiene ese dia y esa hora?? Mira el ejemplo y mira lo que te devuelve tu cosnsulta a la base de datos. Se trata de comparar el valor de la cita con el dia y la hora dentro del bucle.
osea que segun lo que me comentas es:

0=>array(0=>0,1=>9,2=>'Estudiar PHP')
0=>array( // aqui inicio el array general para devolver los datos?
0=>0, // este seria el valo del array para el dia lunes?
1=>9, // esto quiere decir que pertenece a la hora 9?
2=>'Estudiar PHP') // este se supone que es el resultado que saldria desde la bd, pero porque 2=>?

eso n lo entiendo

Gracias
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar
  #12 (permalink)  
Antiguo 03/02/2012, 14:54
Avatar de function  
Fecha de Ingreso: abril-2010
Mensajes: 278
Antigüedad: 14 años
Puntos: 13
Respuesta: Calendario semanal y Mysql

Lo viste?,ves que hay un error
http://www.tiikoni.com/tis/view/?id=7e310b7
__________________
~# echo Hemos logrado la independencia, pero no la libertad >> SimonBolivar

Etiquetas: calendario, html, mysql, semanal, sql, variables
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 20:50.