PHP - Buscando una función o forma de calcular aniversarios

 
Vista:
Imágen de perfil de jose
Val: 184
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por jose (71 intervenciones) el 04/03/2021 18:54:46
Buenos tardes,

Espero que alguien me pueda ayudar.

Estoy haciendo una aplicación de cumpleaños y me gustaría que tuviese un campo donde diga los días que falta para el aniversario.

Tengo una tabla construida;

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `rodriguez` (
 `cumple_id` smallint(11) NOT NULL AUTO_INCREMENT,
 `alias` varchar(25) NOT NULL,
 `nombre` varchar(25) NOT NULL,
 `apellidos` varchar(50) NOT NULL,
 `fecha_nac` date NOT NULL,
 `edad` int(11) GENERATED ALWAYS AS (timestampdiff(YEAR,`fecha_nac`,curdate())) VIRTUAL,
 `telefono` varchar(10) DEFAULT NULL,
 `email` varchar(50) DEFAULT NULL,
 `image` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`cumple_id`),
 UNIQUE KEY `alias` (`alias`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

Y en php tengo una tabla donde recoge la información de la tabla. Estoy buscando la forma de conseguir que a través del campo fecha_nac (fecha de nacimiento) pueda conseguir los días que falta para el cumpleaños. He intentado varias formas con datediff pero me da cifras de miles de días.

Muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por Mauro (1036 intervenciones) el 05/03/2021 19:57:34
Hola José:

Se me ocurre que algo que podría servirte sería tomar la fecha de nacimiento, obtener de ella el día y el mes y con eso construir una nueva fecha que tenga esos datos más el año actual, algo como:

1
2
3
4
5
6
$diaNac = $fNac->format('d);
$mesNac = $fNac->format('m');
$hoy = new DateTimeImmutable();
$cumpleEsteAnio = new DateTimeImmutable($hoy->format('Y').'-'.$mesNac.'-'.$diaNac);

Con esto podrás verificar si el cumpleaños ya pasó o todavía está por venir.

En caso de que haya pasado puedes tomar el cumpleaños del año siguiente y calcular la diferencia en días con $hoy, en caso contrario deberías calcular la diferencia entre la fecha de cumple de este año y el día de hoy.

Ten en cuenta que si usas el método diff de la clase DateTime te devolverá un DateInterval y de ahí deberás obtener el dato de cantidad de días.

Consúltame si tienes dudas.

Exitos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 184
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por jose (71 intervenciones) el 06/03/2021 20:00:31
Hola Mauro,

Al añadir el código me sale que me das me sale el siguiente error

Fatal error: Uncaught Error: Call to a member function format() on null in /volume1/web/familia/pages/birthdays/test.php:174 Stack trace: #0 /volume1/web/familia/pages/birthdays/test.php(139): tabla(Object(mysqli_result), '') #1 {main} thrown in /volume1/web/familia/pages/birthdays/test.php on line 174

Lo que hice para prevenirlo modifiqué
1
2
$annio = $fecha->format('Y'); por $annio = date('Y', strtotime($fecha));
$mes = $fecha->format('m'); por $mes = date('m', strtotime($fecha));

Pero todos los años me dan 1970 y el mes 0.

Lo que he acabado haciendo es crear la siguiente query con un CASE :
1
$query_total = "cumple_id,alias,nombre,apellidos,DATE_FORMAT(fecha_nac,'%d/%m/%Y') as fecha,edad,telefono,email,image, DATE_ADD(fecha, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(fecha)) YEAR) as next_cumple, CASE  WHEN next_cumple < CURRENT_DATE() THEN DATE_ADD(next_cumple, INTERVAL 1 YEAR) END next_cumple";

Lo que intento es que através de la query me añada el año actual
1
INTERVAL (YEAR(CURRENT_DATE()) - YEAR(fecha)) YEAR) as next_cumple
,
con el case caso de que se halla pasado la fecha de next_cumple me sume un año.
1
CASE  WHEN next_cumple < CURRENT_DATE() THEN DATE_ADD(next_cumple, INTERVAL 1 YEAR) END next_cumple

Lo he intentado con un
1
IF next_cumple < CURRENT_DATE() THEN DATE_ADD(next_cumple, INTERVAL 1 YEAR) as next_cumple

Sin embargo ninguno me funciona dandome el siguiente error
1
Uncaught Error: Call to a member function fetch_assoc()
que tiene que ver con la query, en este caso con el CASE or el IF.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por Mauro (1036 intervenciones) el 08/03/2021 13:50:51
Hola Jose:

Respecto de


Al añadir el código me sale que me das me sale el siguiente error

Fatal error: Uncaught Error: Call to a member function format() on null in /volume1/web/familia/pages/birthdays/test.php:174 Stack trace: #0 /volume1/web/familia/pages/birthdays/test.php(139): tabla(Object(mysqli_result), '') #1 {main} thrown in /volume1/web/familia/pages/birthdays/test.php on line 174


¿Inicializaste en algún lado la variable sobre la que estás invocando format? ¿Cómo lo hiciste? Puede que ahí se esconda una pista...

Por lo que veo en tu código parece que $fecha es un string... Prueba con crear un objeto DateTime o DateTimeImmutable mejor.

Sobre


Sin embargo ninguno me funciona dandome el siguiente error
1
Uncaught Error: Call to a member function fetch_assoc()
que tiene que ver con la query, en este caso con el CASE or el IF.


El mensaje de error está incompleto... se me hace que algo ha fallado en tu query. Podrías probar la consulta directamente sobre la DB para descartar que haya algún error de sintaxis, tabla incorrecta o similar y luego volver a PHP.

En todo caso, siempre deberías verificar que el objeto sobre el que quieres hacer fetch_assoc sea un resultado válido (Algo que no sucederá si algo falló al ejecutar la consulta).

Suerte con esto y si tienes dudas me puedes consultar ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 184
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por jose (71 intervenciones) el 09/03/2021 17:57:01
Hola Mauro,

Lo que quería decir que el fallo lo tenía cuando la query contenía
1
CASE  WHEN next_cumple < CURRENT_DATE() THEN DATE_ADD(next_cumple, INTERVAL 1 YEAR) END next_cumple"

Al quitar el case de la query el error de fetch assoc desaparecía.

Lo que pretendía hacer que tanto el añadir un año más cuando la fecha se había pasado sumase un año más, y posteriormente que calculase los días que quedaba para el cumpleaños y así poder ordenar la tabla por los días que falta para el cumpleaños.

Al no poder hacerlo con la query lo hice con funciones de php, excepto el ordenar la tabla por los días que falta para el cumpleaños.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function proxCumple($prox_cumple){
 
	$fecha_actual = date("Y-m-d");
	//$prox_cumple = new DateTime($prox_cumple);
	//$prox_cumple = $row['prox_cumple'];
			   //Si la fecha es inferior o igual al día añade un año más.
	if ($prox_cumple<$fecha_actual){
				  $prox_cumple = strtotime ('+1 year' , strtotime($prox_cumple));
				$prox_cumple = date ('Y-m-d',$prox_cumple);
	}
 
	return $prox_cumple;
}
 
function calcularDias($prox_cumple,$alias){
	//Calcular días
	$fecha_actual = date("Y-m-d");
	$prox_cumple = new DateTime($prox_cumple);
 
	$now = new DateTime();
	//pasamos las fechas a String
	$strProx_cumple = $prox_cumple->format("Y-m-d");
	$strNow = $now->format("Y-m-d");
	//$strFecha_actual = $fecha_actual->format("Y-m-d");
	if ($strProx_cumple == $strNow){
		//echo $strProx_cumple .' '.$strNow;
		// "Hoy es el cumpleaños de ".$alias;
		$cumple = '0';
 
	}else{
		//echo $strNow;
		$cumple = $prox_cumple->diff($now)->format("%a días");
 
	}
 
	return $cumple;
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por Mauro (1036 intervenciones) el 10/03/2021 19:44:41
Vaya... tal vez podrías usar una tabla temporal donde guardes el dato de los días que faltan y luego ordenes por ello
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 184
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por jose (71 intervenciones) el 11/03/2021 09:10:19
Hola Mauro,

Lo estuve viendo, pero estaría igual el problema es que me falla el case y el if en la query, cosa que no entiendo

1
CASE  WHEN next_cumple < CURRENT_DATE() THEN DATE_ADD(next_cumple, INTERVAL 1 YEAR) END next_cumple

or

1
IF ( next_cumple < CURRENT_DATE()) THEN DATE_ADD(next_cumple, INTERVAL 1 YEAR)

No entiendo no hace el case o el if
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por Mauro (1036 intervenciones) el 11/03/2021 13:49:08
¿Te está dando algún error o simplemente no devuelve lo que buscas?

En todo caso, deberías probar la query directamente en el MySQL hasta afinarla y luego pasarla al php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 184
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por jose (71 intervenciones) el 12/03/2021 09:49:02
Hola Mauro,

Me daba syntax error en mysql. Por otra parte tras hacer cambios, me pasaba que al pasar la siguiente query:

1
select cumple_id,alias,nombre,apellidos,DATE_FORMAT(fecha_nac,'%d/%m/%Y') as fecha,edad,telefono,email,image, DATE_ADD(fecha_nac, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(fecha_nac)) YEAR) as next_cumple, CASE WHEN next_cumple < CURRENT_DATE() THEN DATE_ADD(next_cumple, INTERVAL 1 YEAR) END  from rodriguez;

Me daba el siguiente error: #1054 - Unknown column 'next_cumple' in 'field list'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por joel (1269 intervenciones) el 12/03/2021 10:39:19
Por lo que entiendo la variable next_cumple es creada en el select, por lo que no puedes utilizarla en el mismo select... prueba algo así:

1
2
3
4
5
6
7
8
9
10
11
12
select
    cumple_id,
    alias,nombre,
    apellidos,
    DATE_FORMAT(fecha_nac,'%d/%m/%Y') as fecha,
    edad,
    telefono,
    email,
    image,
    DATE_ADD(fecha_nac, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(fecha_nac)) YEAR) as next_cumple,
    CASE WHEN DATE_ADD(fecha_nac, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(fecha_nac)) YEAR) < CURRENT_DATE() THEN DATE_ADD(DATE_ADD(fecha_nac, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(fecha_nac)) YEAR), INTERVAL 1 YEAR) END
from rodriguez;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 184
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscando una función o forma de calcular aniversarios

Publicado por jose (71 intervenciones) el 12/03/2021 15:23:32
Lo probaré y te digo algo pronto. Muchas gracias Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar