Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema en la consulta entre dos fechas

Estas en el tema de Problema en la consulta entre dos fechas en el foro de PHP en Foros del Web. Buenos días compañeros, tengo una duda de como realizar una consulta a la BD para que me muestre artículos por meses. Os cuento: Tengo creado ...
  #1 (permalink)  
Antiguo 15/07/2013, 08:40
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 10 años, 9 meses
Puntos: 1
Problema en la consulta entre dos fechas

Buenos días compañeros, tengo una duda de como realizar una consulta a la BD para que me muestre artículos por meses. Os cuento:

Tengo creado un sistema de noticias y comentarios en una web. En el apartado de noticias hay un directorio de noticias anteriores (lo pueden ver en la imagen), en el que estoy intentando mostrar las noticias publicadas en un mes al clickar en el.

Desde la página noticias.php que contiene el directorio le paso dos parámetros al enlace de cada mes esta manera:
Código HTML:
Ver original
  1. <a href="noticias_anteriores.php?mes=07&year=2013">JULIO</a>

En la pagina noticias_anteriores.php tengo la consulta a la base de datos para que me devuelva todas las noticias entre dos fechas, de esta manera:
Código PHP:
Ver original
  1. "SELECT * FROM tblnoticias WHERE tblnoticias.fecha BETWEEN '2013/07/01' AND '2013/08/01'";
que también tengo que hacerla manualmente para cada mes de cada año, pues no se hacer que se cambie automaticamente al clickar en un mes en concreto.

En noticias_anteriores.php tengo declaradas las variables $mes y $year de la siguiente forma:
Código PHP:
Ver original
  1. <?php
  2. function nombremes($mes)
  3. {
  4.     if ($mes == 01) return "Enero";
  5.     if ($mes == 02) return "Febrero";
  6.     if ($mes == 03) return "Marzo";
  7.     if ($mes == 04) return "Abril";
  8.     if ($mes == 05) return "Mayo";
  9.     if ($mes == 06) return "Junio";
  10.     if ($mes == 07) return "Julio";
  11.     if ($mes == 08) return "Agosto";
  12.     if ($mes == 09) return "Septiembre";
  13.     if ($mes == 10) return "Octubre";
  14.     if ($mes == 11) return "Noviembre";
  15.     if ($mes == 12) return "Diciembre";
  16. }
  17. function nombreyear($year)
  18. {
  19.     if ($year == 2013) return "2013";
  20.     if ($year == 2014) return "2014";
  21. }
  22. ?>

Y en el titulo donde me muestra el mes y el año de las noticias tengo esto:
Código HTML:
Ver original
  1. <h1 align="center" style="text-shadow: 1px 1px 0 #FFFFFF; font-size:22px"><br />Noticias publicadas en <?php echo nombremes ($mes); ?>&nbsp;de&nbsp;<?php echo nombreyear ($year); ?></h1>

Tengo varios problemas con esto.

- Uno es que tengo que crear la carpeta con los parámetros $mes y $year manualmente, ya que no se como hacer para que cuando cambie el mes se cree automáticamente, aunque eso no me importa porque lo hago manual y listo.

- No se por qué aunque pase los datos por ejemplo con $mes=07, en vez de devolverme "Julio" (que en el php de arriba tengo que si $mes==07 me devuelva julio) me devuelve el valor del $mes==08 que es agosto. Es decir siempre me suma un mes mas, si pongo 05 me devuelve el 06, si pongo el 06 me devuelve el 07 y asi sucesivamente. En la imágen2 ven el resultado para $mes=07&$year=2013 (que está en los parámetros a pasar por GET abajo) y en vez de devolverme "julio de 2013" me devuelve "agosto" y sin el año.

- El último problema de momento es que el año no me lo devuelve (en la imagen2 lo pueden ver tambien), no se si es porque tengo mal escrita la sentencia de salida o porque tengo mal la función o no se por qué, ya que la funcin está escrita exactamente igual que la de $mes.

Si me podéis ayudar con esto se lo agradezco mucho.
Espero me podais echar una mano.

No se si me he explicado bien, pero si no es así, vuelvo a poner los datos que me pidáis, a ver si soluciono este problema.

Gracias por adelantado.
Raúl

IMÁGEN 1


IMÁGEN 2
  #2 (permalink)  
Antiguo 15/07/2013, 09:21
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 15 años, 7 meses
Puntos: 36
Respuesta: Problema en la consulta entre dos fechas

Vamos a resolver el tema de la consulta de PHP para que no tengas que poner manualmente las fechas, lo ideal fuera poner un control "calendario" que sea el que te capture las fechas inicial y final y no trener mas problemas, cargarias los dos valores en variales y lo pasas a la consulta de esta forma:

Código PHP:
Ver original
  1. "SELECT * FROM tblnoticias WHERE tblnoticias.fecha Between '$year/$mes/%' AND '$year/$mes/%' ";

Por supuesto debes tener declaradas las variables $year y $mes anteriormente.
  #3 (permalink)  
Antiguo 15/07/2013, 09:41
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Problema en la consulta entre dos fechas

Cita:
Iniciado por alexisverano Ver Mensaje
Vamos a resolver el tema de la consulta de PHP para que no tengas que poner manualmente las fechas, lo ideal fuera poner un control "calendario" que sea el que te capture las fechas inicial y final y no trener mas problemas, cargarias los dos valores en variales y lo pasas a la consulta de esta forma:

Código PHP:
Ver original
  1. "SELECT * FROM tblnoticias WHERE tblnoticias.fecha Between '$year/$mes/%' AND '$year/$mes/%' ";

Por supuesto debes tener declaradas las variables $year y $mes anteriormente.

Gracias por contestar alexisverano. He modificado la consulta como me dijiste y ha quedado con las variables $mes y $year de la seguiente manera:
function nombremes($mes)
Código PHP:
Ver original
  1. {
  2.     if ($mes == 01) return "Enero";
  3.     if ($mes == 02) return "Febrero";
  4.     if ($mes == 03) return "Marzo";
  5.     if ($mes == 04) return "Abril";
  6.     if ($mes == 05) return "Mayo";
  7.     if ($mes == 06) return "Junio";
  8.     if ($mes == 07) return "Julio";
  9.     if ($mes == 08) return "Agosto";
  10.     if ($mes == 09) return "Septiembre";
  11.     if ($mes == 10) return "Octubre";
  12.     if ($mes == 11) return "Noviembre";
  13.     if ($mes == 12) return "Diciembre";
  14. }
  15. function nombreyear($year)
  16. {
  17.     if ($year == 2013) return "2013";
  18.     if ($year == 2014) return "2014";
  19. }
  20.  
  21. mysql_select_db($database_centroforte, $centroforte);
  22. $query= "SELECT * FROM tblnoticias WHERE tblnoticias.fecha BETWEEN '$year/$mes/%' AND '$year/$mes/%'";

Me sigue devolviendo Agosto para $mes==07, sin devolverme el año y ahora no me muestra ninguna noticia, me da un resultado en blanco.
  #4 (permalink)  
Antiguo 15/07/2013, 09:51
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Problema en la consulta entre dos fechas

Cita:
Iniciado por alexisverano Ver Mensaje
Vamos a resolver el tema de la consulta de PHP para que no tengas que poner manualmente las fechas, lo ideal fuera poner un control "calendario" que sea el que te capture las fechas inicial y final y no trener mas problemas, cargarias los dos valores en variales y lo pasas a la consulta de esta forma:

Código PHP:
Ver original
  1. "SELECT * FROM tblnoticias WHERE tblnoticias.fecha Between '$year/$mes/%' AND '$year/$mes/%' ";

Por supuesto debes tener declaradas las variables $year y $mes anteriormente.
En realidad creo que mas o menos entiendo lo que me dices, pero me he dado cuenta que yo $mes y $year las tengo en una funcion, pero no se declararlas para que $year sea solo el año dentro del campo fecha de la tabla y para que $mes sea solo el mes. y para traerlas desde la página anterior. !!
  #5 (permalink)  
Antiguo 15/07/2013, 09:58
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 15 años, 7 meses
Puntos: 36
Respuesta: Problema en la consulta entre dos fechas

Donde cargas inicialmente las variables $year y $mes?
  #6 (permalink)  
Antiguo 15/07/2013, 10:00
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Problema en la consulta entre dos fechas

Cita:
Iniciado por alexisverano Ver Mensaje
Donde cargas inicialmente las variables $year y $mes?
Las traigo desde el enlace JULIO que esta en la página noticias.php ( es la primera imagen del primer mensaje) al hacer click en el mes le paso las variables por GET asi:

Código HTML:
Ver original
  1. <td width="64%" align="left">&nbsp;&nbsp;<a href="noticias_anteriores.php?mes=07&year=2013">JULIO</a></td>
  #7 (permalink)  
Antiguo 15/07/2013, 10:13
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema en la consulta entre dos fechas

Cita:
Iniciado por raulgranadosraul Ver Mensaje
[HIGHLIGHT="PHP"]
function nombremes($mes)
{
if ($mes == 01) return "Enero";
if ($mes == 02) return "Febrero";
if ($mes == 03) return "Marzo";
if ($mes == 04) return "Abril";
if ($mes == 05) return "Mayo";
if ($mes == 06) return "Junio";
if ($mes == 07) return "Julio";
if ($mes == 08) return "Agosto";
if ($mes == 09) return "Septiembre";
if ($mes == 10) return "Octubre";
if ($mes == 11) return "Noviembre";
if ($mes == 12) return "Diciembre";
}
[/PHP]
Aunque no resuelve tu problema, estas haciendo 12 IFs y no necesitas ni siquiera uno

Código PHP:
function nombremes($num_mes)
{
     
$meses = ('enero','febrero',...)
     return 
$meses[$num_mes-1]; // el elemento 0 es el mes 1

Trata de evitar hacer preguntas de mas... es tiempo de procesamiento...
__________________
Salu2!
  #8 (permalink)  
Antiguo 15/07/2013, 10:18
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Problema en la consulta entre dos fechas

Cita:
Iniciado por Italico76 Ver Mensaje
Aunque no resuelve tu problema, estas haciendo 12 IFs y no necesitas ni siquiera uno

Código PHP:
function nombremes($num_mes)
{
     
$meses = ('enero','febrero',...)
     return 
$meses[$num_mes-1]; // el elemento 0 es el mes 1

Trata de evitar hacer preguntas de mas... es tiempo de procesamiento...
perdon si son muchas preguntas pero no se otra forma de consultar las dudas, sino cuando van saliendo.
Entiendo que las variables pueden pasar todas por $meses pero ¿no necesito hacer la funcion para que me devuelva el nombre del mes? ¿Como utilizaría esa variable para que me devuelva las noticias de un rango de fechas con el nombre del mes y del año? ¿como envio desde la pagina anterior las variables si ahora no son $mes y $year?
  #9 (permalink)  
Antiguo 15/07/2013, 11:06
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Problema en la consulta entre dos fechas

Cita:
Iniciado por alexisverano Ver Mensaje
Vamos a resolver el tema de la consulta de PHP para que no tengas que poner manualmente las fechas, lo ideal fuera poner un control "calendario" que sea el que te capture las fechas inicial y final y no trener mas problemas, cargarias los dos valores en variales y lo pasas a la consulta de esta forma:

Código PHP:
Ver original
  1. "SELECT * FROM tblnoticias WHERE tblnoticias.fecha Between '$year/$mes/%' AND '$year/$mes/%' ";

Por supuesto debes tener declaradas las variables $year y $mes anteriormente.

alexisverano he cambiado la consulta como me dijiste y declaré las variables $mes y $year de esta manera :

Código PHP:
Ver original
  1. $mes = $_GET["mes"];
  2. $year = $_GET["year"];
  3.  
  4. function nombremes($mes)
  5. {
  6.     if ($mes == 01) return "Enero";
  7.     if ($mes == 02) return "Febrero";
  8.     if ($mes == 03) return "Marzo";
  9.     if ($mes == 04) return "Abril";
  10.     if ($mes == 05) return "Mayo";
  11.     if ($mes == 06) return "Junio";
  12.     if ($mes == 07) return "Julio";
  13.     if ($mes == 08) return "Agosto";
  14.     if ($mes == 09) return "Septiembre";
  15.     if ($mes == 10) return "Octubre";
  16.     if ($mes == 11) return "Noviembre";
  17.     if ($mes == 12) return "Diciembre";
  18. }
  19. function nombreyear($year)
  20. {
  21.     if ($year == 2013) return "2013";
  22.     if ($year == 2014) return "2014";
  23. }
  24.  
  25. $query_Recordset1 = "SELECT * FROM tblnoticias WHERE tblnoticias.fecha BETWEEN '$year/$mes/%s' AND '$year/$mes/%s'";

Ahora me muestra bien el mes y el año al que se refiere la noticia, pero no me muestra las noticias que están en ese rango, en realidad no me muestra ninguna. Imagino que será porque en la consulta tengo $year/$mes/%' pero no le estoy pasando ningún día, por lo tanto creo que ahi estaría lo que tengo que arreglar, pero no se como. Lo he intentado cambiando %s por $dia y declarando $dia=01 para que me coja el primer dia de cada mes.... pero al no estar la noticia publicada el dia 1 no se si me esta dando ese error. El caso es que las noticias ahora no se muestran pero el enlace esta perfecto.

¿Como puedo arreglar eso?
  #10 (permalink)  
Antiguo 15/07/2013, 11:36
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Problema en la consulta entre dos fechas

Bueno ya está solucionado. Gracias alexisverano por la solución, aunque le tuve que dar un par de vueltas lo conseguí con tu respuesta. Pongo la solución aqui por si a alguien le puede aportar algo en el futuro.

Declaré las variables $mes, $year y $mesfin de la siguiente manera:

Código PHP:
Ver original
  1. $mes = $_GET["mes"];
  2. $mesfin = $_GET["mes"]+1;
  3. $year = $_GET["year"];

$mesfin lo he declarado para que me incluya las noticias hasta el último día del mes.

He declarado las funciones para el nombre del mes y del año de la siguiente manera (italico se que me diste una respuesta pero no la entiendo del todo):

Código PHP:
Ver original
  1. function nombremes($mes)
  2. {
  3.     if ($mes == 01) return "Enero";
  4.     if ($mes == 02) return "Febrero";
  5.     if ($mes == 03) return "Marzo";
  6.     if ($mes == 04) return "Abril";
  7.     if ($mes == 05) return "Mayo";
  8.     if ($mes == 06) return "Junio";
  9.     if ($mes == 07) return "Julio";
  10.     if ($mes == 08) return "Agosto";
  11.     if ($mes == 09) return "Septiembre";
  12.     if ($mes == 10) return "Octubre";
  13.     if ($mes == 11) return "Noviembre";
  14.     if ($mes == 12) return "Diciembre";
  15. }
  16. function nombreyear($year)
  17. {
  18.     if ($year == 2013) return "2013";
  19.     if ($year == 2014) return "2014";
  20. }

Y finalmente la consulta quedó de la siguiente manera:

Código PHP:
Ver original
  1. $query_Recordset1 = "SELECT * FROM tblnoticias WHERE tblnoticias.fecha BETWEEN '$year/$mes/01' AND '$year/$mesfin/01' ORDER BY tblnoticias.fecha DESC, tblnoticias.hora DESC ";

Así funciona todo el directorio correctamente. Ahora solo me faltaría arreglar en la página donde se muestran las ultimas noticias publicadas (noticias.php) que se me muestren solo las de ese mes. Imagino que dándole unas cuantas vueltas mas lo conseguiré, será algo como una consulta en la que me devuelva las noticias del mes que está corriendo, algo asi como CURRENT_DATE que coge el valor del momento actual pero refiriendose al mes.

Muchas gracias por la ayuda, era algo complicado sacarlo pero al final con vuestros mensaje me habéis ayudado.
Gracias de nuevo y si alguien sabe algo de lo del mes actual y me puede ayudar, gracias otra vez.
Raúl

Etiquetas: select, 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 06:26.