Foros del Web » Programando para Internet » PHP »

Mostrar registros segun rango de fechas

Estas en el tema de Mostrar registros segun rango de fechas en el foro de PHP en Foros del Web. Buen día! Por lo regular despejo mis dudas leyendo los posts de los que saben, sin embargo en esta ocasión estoy atorado. Hay un script ...
  #1 (permalink)  
Antiguo 08/09/2013, 16:04
 
Fecha de Ingreso: septiembre-2013
Mensajes: 3
Antigüedad: 10 años, 7 meses
Puntos: 0
Mostrar registros segun rango de fechas

Buen día!
Por lo regular despejo mis dudas leyendo los posts de los que saben, sin embargo en esta ocasión estoy atorado.
Hay un script que se llama PHP Finance, el cual he estado personalizando, pero hay una parte donde te da la opción para seleccionar fecha de inicio y final para mostrar los registros comprendidos entre esas fechas.
Las fechas los 2 menus selectores las toman directamente de la base de datos pero cada uno solo muestra en un mismo campo mes y año, no muestra el día y requiero que muestre el día.
No he logrado hacer esto último y por más que he leído no logro comprender bien, y las pruebas que he hecho no han resultado.

Este es el código del menú selector de fecha de inicio y también el de fecha final nombrados como date_begin y date_end:

Código PHP:
function put_dates_select ($tname){
        
$tlist mysql_list_tables($tname);
                while (
$row mysql_fetch_row($tlist)) {
                        
$query "SELECT DISTINCT `date` FROM ".$row[0];
                        
$result mysql_query($query) or die ("Error info:<br> $query<br>"mysql_error());
                        while (
$row1 mysql_fetch_row($result)) {
                               
preg_match ("/^(.*)-.*?$/"$row1[0], $m);
                               
$dates[$m[1]] += 1;
                        }
                 }
                if (
is_array($dates)){
                    
mysql_free_result($result);
                    
ksort($dates);
//Aquí comienzan los menus selectores, date_begin y date_end
                
echo "Rango de fechas: <select name=date_begin><option value=>Begin</option>";
                foreach (
$dates as $k => $v){
                         
preg_match ("/^(.*)-(.*)$/"$k$m);
                         if (
$_SESSION[date_begin] == $k) {$selected "selected";}else{$selected "";}
                         echo 
"<option value=$k $selected>".monthname($m[2])." ".substr($m[1],2)."</option>";
                }
                echo 
"</select> - ";
                echo 
"<select name=date_end><option value=>End</option>";
                foreach (
$dates as $k => $v){
                         
preg_match ("/^(.*)-(.*)$/"$k$m);
                         if (
$_SESSION[date_end] == $k) {$selected "selected";}else{$selected "";}
                         echo 
"<option value=$k $selected>".monthname($m[2])."* ".substr($m[1],2)."</option>";
                }
                echo 
"</select> <input type=submit name=date_set value=Set style='font-size:9px'>";
                return 
$dates;
                }

Espero puedan ayudarme y también poder entender lo que me expliquen ó indiquen, de antemano gracias!
  #2 (permalink)  
Antiguo 09/09/2013, 08:13
Avatar de efenollal  
Fecha de Ingreso: abril-2012
Ubicación: Toa Baja
Mensajes: 63
Antigüedad: 12 años
Puntos: 3
Respuesta: Mostrar registros segun rango de fechas

Para empezar haz un var_dump($dates) para ver que trae la variable $dates. No se si esta guardando año mes y dia en la base de datos o solo el mes y el año. Si te trae el dia en $dates pues tienes que modificar el preg_match para que encuentre el dia ya que solo busca el año y el mes.
  #3 (permalink)  
Antiguo 09/09/2013, 17:24
 
Fecha de Ingreso: septiembre-2013
Mensajes: 3
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: Mostrar registros segun rango de fechas

Buen día y gracias por responder EFENOLLAL!

De hecho en la base de datos el campo date si está guardando año-mes-dia (en ese mismo orden que lo puse).

Ya había intentado modificar el preg_match pero en realidad ni siquiera estaba seguro de que fuera ahí donde tuviera que modificar, esa función no la conocía y aunque he leído desde la mañana que me respondiste no terminé de entender.
Además lo de las fechas siempre se me ha complicado.

Sin embargo a medio día pude resolverlo después de intentar e intentar.
Cabe aclarar que aún no lo comprendo del todo, pero ya salí del paso y seguiré estudiando cada que se pueda.

Muchas gracias por haberme orientado EFENOLLAL, y si acaso llegas a tener tiempo y ánimo de explicarme un poco más al respecto, te lo voy a agradecer también.

El código quedó así:

Código PHP:
function put_dates_select ($tname){
        
$tlist mysql_list_tables($tname);
                while (
$row mysql_fetch_row($tlist)) {
                        
$query "SELECT DISTINCT `date` FROM ".$row[0];
                        
$result mysql_query($query) or die ("Error info:<br> $query<br>"mysql_error());
                        while (
$row1 mysql_fetch_row($result)) {
                               
preg_match ("/^(.*).*?$/"$row1[0], $m);
                                   
$dates[$m[1]] += 1;
                        }
                 }
                if (
is_array($dates)){
                    
mysql_free_result($result);
                    
ksort($dates);
                echo 
"Balance por rango de fechas en formato <b>a&ntilde;o-mes-dia</b>: <select name=date_begin><option value=>Begin</option>";
                foreach (
$dates as $k => $v){
                         
preg_match ("/^(.*)$/"$k$m);
                         if (
$_SESSION[date_begin] == $k) {$selected "selected";}else{$selected "";}
                         echo 
"<option value=$k $selected>".substr($m[1],0)."</option>";
                }
                echo 
"</select> - ";
                echo 
"<select name=date_end><option value=>End</option>";
                foreach (
$dates as $k => $v){
                         
preg_match ("/^(.*)$/"$k$m);
                         if (
$_SESSION[date_end] == $k) {$selected "selected";}else{$selected "";}
                         echo 
"<option value=$k $selected>".substr($m[1],0)."</option>";
                }
                echo 
"</select> <input type=submit name=date_set value=Set style='font-size:9px'>";
                return 
$dates;
                }

Aquí explico lo que yo entendí:
*-Según yo aquí
Código PHP:
preg_match ("/^(.*)-.*?$/"$row1[0], $m); 
el preg_match está jalando la fecha de la base de datos pero según creo, el guión medio está restando ó quitando el día, es decir, ese guión medio provoca que el preg_match solo tome el mes y el año, por lo cual eliminé el guión y quedó así
Código PHP:
preg_match ("/^(.*).*?$/"$row1[0], $m); 
*-Según yo, ya en el selector de fecha inicial y final, el preg_match que aparece así
Código PHP:
preg_match ("/^(.*)-(.*)$/"$k$m); 
con el guión también está restando el día, entonces eliminé el guión y los paréntesis con su contenido y quedó así
Código PHP:
preg_match ("/^(.*)$/"$k$m); 
*-Ya para imprimirlo no entendí bien tampoco, pero me quedó así
Código PHP:
echo "<option value=$k $selected>".substr($m[1],0)."</option>"
Total que me sirvió y la fecha la imprime 2013-09-09, aunque me hubiera gustado ponerla al revés, dia-mes-año.

Si hay comentarios ú observaciones se los voy a agradecer.
Saludos y gracias!
  #4 (permalink)  
Antiguo 10/09/2013, 16:14
Avatar de efenollal  
Fecha de Ingreso: abril-2012
Ubicación: Toa Baja
Mensajes: 63
Antigüedad: 12 años
Puntos: 3
Respuesta: Mostrar registros segun rango de fechas

Me alegra que te haya servido de ayuda la recomendacion que te di. Las expresiones regulares son un pocoo dificiles de comprender hasta que practicas con ellas. La funcion del preg_match es buscar por medio de expresiones regulares los patrones especificos en un string de manera mas segura y precisa. Ten en cuenta que la funcion preg_match consume muchos recursos y utilizarla en exceso puede ocacionar problemas de rendimiento en el servidor. A veces es mejor utilizar funciones como: strstr() o substr() por decir algunas para hacer busquedas de algun tipo de string.

Si entiendes ingles este recurso te explica mejor lo que son las expresiones regulares.
http://webcheatsheet.com/php/regular_expressions.php

puede ver preg_match aqui:
http://www.php.net/manual/es/function.preg-match.php

Ahora, si la peticion a la base de datos te trae los valores de $date de manera: año-mes-dia
quizas podrias hacer algo como esto:

Código PHP:
Ver original
  1. $date = explode("-", $row1);
Lo que hace explode es que convierte el resultado separado por ( - ) de $row1 en un array y lo guardas en la variable $date. Entonces puedes llamarlo asi:

Código PHP:
Ver original
  1. $date[0] //Seria el año
  2. $date[1] // Seria el mes
  3.  
  4. // O con un foreach
  5. foreach($date as $k => $v){
  6.     $new_date = $v
  7. }

Es solo una suposicion pero puedes practicar con estos metodos para que entiendas de que se trata el codigo.

Espero te sirva de algo... Cuidate
  #5 (permalink)  
Antiguo 10/09/2013, 16:56
 
Fecha de Ingreso: septiembre-2013
Mensajes: 3
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: Mostrar registros segun rango de fechas

De nuevo gracias por las recomendaciones!
Fíjate que como este es un script ya hecho y tenía mucho tiempo de no trabajar con PHP-MySQL pues no me sentía con la confianza de usar un método diferente al que usó el autor, es decir, me daba miedo que funcionara eso pero que otra cosa no funcionara como es debido.

Le agregué varias opciones y no tuve mucho problema (si tuve pero no tanto ), sin embargo voy a leer respecto a como traer fechas de la base de datos con strstr() o substr() como me lo mencionas.
Y veo que si hago el explode puedo después de eso mostrar la fecha en el orden que quiero dia-mes-año
Voy a leer los enlaces que me enviaste, se un poquillo de inglés y espero me sirva.

De nuevo gracias y buen día a todos!
  #6 (permalink)  
Antiguo 10/09/2013, 19:18
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Mostrar registros segun rango de fechas

Podrias usar algo como esto
Código PHP:
Ver original
  1. $f=explode('-',$fecha);
  2.  
  3. $dia=$f[2];
  4. $mes=$f[1];
  5. $anio=$f[0];
  6. //o tambien
  7. $nuevoordenfecha=array_reverse($f);
  8. $fechanueva=implode('-',$nuevoordenfecha);
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.

Etiquetas: mysql, rango, registro, registros, select
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 18:14.